ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Effective Java 공부하기] 6. 불필요한 객체 생성을 피하라
    Java 2022. 4. 1. 01:39
    반응형

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


    자바는 기본적으로 사용하지 않는 불필요한 객체를 청소해주는 GC(Garbage Collectotion) 기능이 존재한다만 소스적으로 불변의 객체를 반복적으로 생성하는 것을 최대한 지양해야 한다.

    // Boolean 인스턴스를 생성
    Boolean b1 = new Boolean(true);
    
    // Boolean 팩터리 메서드를 사용(만들어진 인스턴스를 참조)
    Boolean b2 = Boolean.valueOf(true);

    위와 같은 불변 객체라면 new Boolean(true) 생성자를 통해 불필요한 객체의 인스턴스를 반복 생성하는 것보다 팩터리 메서드를 사용하여 이미 만들어진 객체의 인스턴스를 재활용하는 것이 더 현명한 선택이 될 수 있을 것 같다.

    java.lang.Boolean

    실제로 자바9 이후로 new Boolean() 생성자를 통한 Boolean 객체의 인스턴스 추가생성은 deprecated 되어 사용을 자제하라는 공식내용이 있다.

    또 다른 예로는 정규표현식을 활용하여 문자열을 체크할 때 주로 사용하는 방식이다. 문자열이 이메일 형식인지 정규표현식을 통해 검증을 하면

    private static boolean isEmailPattern(String text) {
        return text.matches("^[a-z0-9_+.-]+@([a-z0-9-]+\\.)+[a-z0-9]{2,4}$");
    }

    보통 위와 같이 유틸클래스에 정적메서드를 만들어서 사용한다. 실제 나도 회사내부 유틸클래스에서 위와 동일한 코드를 작성한 기억이 있다. 그럼 matches 메서드를 타고 내부로 들어가 보자.

    java.util.regex.Pattern

    Pattern 팩터리 메서드 내부에서의 동작을 확인하면 regex 패턴을 매개변수로 넘겨 생성자를 통한 Pattern 객체의 인스턴스를 생성한다. 이렇게 생성된 인스턴스는 매번 새롭게 생성되고 곧바로 GC의 대상이 되어 제거된다. (사실 자바의 GC가 일처리가 굉장히 대단해서 왠만한 경우가 아니고서는 큰 성능차이가 없겠지만 알고 쓰는것과 모르는 것은 차이가 많이 나니깐..)

    성능을 개선하기 위해서는 불변 객체(Pattern class) 인스턴스를 생성하는것을 정적인 방식으로 딱 한번만 초기화하고 그 다음부터는 재활용 하는 것이다.

    // 초기화
    private static final Pattern EMAIL_PATTERN = Pattern.compile("^[a-z0-9_+.-]+@([a-z0-9-]+\\.)+[a-z0-9]{2,4}$");
    
    
    EMAIL_PATTERN.matcher(text3).matches()
    

    로컬 환경에서 인스턴스를 반복 생성하는 방식과 재활용하는 후자 방식의 속도를 체감하고 싶어서 eamil 정규표현식을 1천만번 루프시켰더니 약, 3배 가까이 시간이 절감되는 것을 확인할 수 있었다.

    반응형

    댓글

Designed by Tistory.