불필요한 객체 생성을 피하라. (new String, String.matches-정규표현식)

똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다.

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