불필요한 객체 생성을 피하라. (new String, String.matches-정규표현식)
in Development on Java
똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다.
new String()을 사용하지 마라.
비효율적인 코드
String s = new String("bikini");
위 코드는 실행될 때마다 String 인스턴스를 새로 만든다. 완전히 쓸데없는 코드이다. 이 문장이 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 수백만 개 만들어질 수도 있다.
개선된 코드
String s = "bikini";
위 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다.
정규표현식(String.matches()
)을 사용할 때에는 캐싱을 활용해라.
숫자 혹은 알파벳인지 검사하는 정규표현식을 짜야된다고 가정하자.
비효율적인 코드
public boolean isNumberOrAlphabet(String s){
return s.matches("[0-9a-zA-Z]");
}
String.matches는 성능이 중요한 상황에서 반복해 사용하기엔 적합하지 않다. 왜냐하면 String.matches() 메서드 내부의 구현부를 보면 Pattern 인스턴스가 사용되는데, 1번 사용되고 버려진다. 하지만 이 때 Pattern 인스턴스의 생성 비용이 아주 크기 때문에 반복해서 사용할 경우 성능에 문제가 된다.
개선된 코드
public class regex {
private static final Pattern isNumberOrAlphabet = Pattern.compile("[0-9a-zA-Z]");
public static boolean validateString(String s) {
return isNumberOrAlphabet.matcher(s).matches();
}
}
Pattern 인스턴스를 static을 활용해 클래스 초기화 과정에서 미리 생성해두고 재활용하면 된다. 그럼 매번 Pattern 인스턴스를 생성해야하는 비용이 사라지기 때문에 성능이 효율적으로 개선된다.
References
- Effective Java(이펙티브 자바) - 조슈아 블로크, 인사이트 → [아이템 6. 불필요한 객체 생성을 피하라.]
- 정규 표현식(Regex) 사용 시 성능을 고려한 코딩을 해보자