Java - 6) 불필요한 객체 생성 피하기

<이펙티브 자바>

Posted by Yan on August 20, 2021

이펙티브 자바 책을 읽으면서 새로 알게 된 부분을 기록한 것입니다.

불필요한 객체 생성

예시

  • 실행될 때마다 String 인스턴스를 새로 만드는 것
1
String s = new String("umbrella");
  • 개선된 버전
1
Stirng s = "umbrella"

새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다.
이 방식을 사용한다면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 사용함이 보장된다.

불필요한 객체 생성을 피하는 방법

  • 생성자 대신 정적 팩토리 메소드를 제공하는 불변 클래스에서 정적 팩토리 메소드를 사용하기
    • Boolean(String)생성자 대신 Boolean.valueOf(String) 팩토리 메소드 사용하기
    • 생성자는 호출할 때마다 새로운 객체를 만들지만 팩토리 메소드는 전혀 그렇지 않다.
    • 불변 객체만이 아니라 가변 객체라 해도 사용중에 변경되지 않을 것임을 안다면 재사용할 수 있다.

생성 비용이 아주 비싼 객체도 있다.

  • 비싼 객체가 반복해서 필요하다면 캐싱하여 재사용하자.
  • 예) String.matches는 정규표현식으로 문자열 형태를 확인하는 가장 쉬운 방법이지만, 성능이 중요한 상황에서 반복해 사용하기엔 적합하지 않다.
    • 이 메소드가 내부에서 만드는 정규표현식용 Pattern 인스턴스는 한 번 쓰고 버려져서 곧바로 가비지 컬렉션 대상이 된다.
    • Pattern은 입력받은 정규표현식에 해당하는 유한 상태 머신 finite state machine을 만들기 때문에 인스턴스 생성 비용이 높다.
    • 성능을 개선하려면 필요한 정규표현식을 표현하는 Patten 인스턴스를 클래스 초기화(정적 초기화) 과정에서 직접 생성해 캐싱해두고, 나중에 해당 정규표현식 메소드가 호출될 때마다 인스턴스를 재사용한다.