본문 바로가기

독후감/Effective Java

6. 불필요한 객체 생성을 피하라

다음은 정규표현식을 활용한 예제이다.

static boolean isRomanNumera(String s) {
    return s.matches("^(?-.)M* ....;
}

성능을 개선하려면 필요한 인스턴스를 클래스 초기화과정에서 생성해 캐싱하여, 나중에 해당 인스턴스를 재사용한다.이 방식은 쉬운 방식이지만 성능이 중요한 곳에서는 반복적으로 사용하기 적합치 않다.
이 메서드가 내부에서 만드는 인스턴스는 한 번 쓰이고 버려져 곧바로 가비지 컬렉션 대상이 된다.

public class RomanNumerals {
    private static final Pattern ROMAN = Patterm.compile(
        "^(?-.)M* ....
    );

    static boolean isRomanNumeral(String s) {
        return ROMAN.matcher(s).matchers();
    }
}

1.1μs 걸리던 로직이 개선 후 0.17μs가 되어, 약 6.5배 빨라진다. 또한 코드도 명확해졌다.