똑같은 기능을 가진 객체를 매번 생성하는 것보다 객체 하나를 재사용하는 편이 나을 때가 많다.
다음은 불필요한 객체를 생성하는 예시들이다.
String s = new String("test"); // 따라하지 말 것
이 문장을 잘보면 왼쪽, 오른쪽 모두 객체를 생성한다. 즉, 이 문장이 실행될 때마다 하나의 객체가 더 생성된다는 것이다.
개선된 버전을 보자.
Sring s = "test";
이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. 또 JVM 안에 리터럴로 저장하여 재사용성도 높여준다.
이외에도 정적 팩터리 메서드를 사용하면 불필요한 객체 생성을 피할 수 있다.
만약 사용하려는 정규표현식이 있어서 Pattern 클래스를 사용할 경우, Pattern 인스턴스는 한번 쓰고 버려지기 때문에 재사용 할 수가 없다.
이때 Pattern 인스턴스를 클래스 초기화(정적 초기화) 과정에서 직접 생성해 캐싱해두고, 나중에 다른 메서드로 호출할 때마다 이 인스턴스를 반환해주고 사용해준다면 훨씬 효율적인 코드가 된다.
또다른 예로는 오토박싱(auto boxing)이 있다. 다음 코드를 살펴보자.
private static long sum() {
Long sum = 0L;
for( long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
sum을 Long 타입으로 선언하고 for문의 i는 long으로 선언했다. 그러면 sum에 i 값을 넣을 때마다 long -> Long 타입의 형변환이 이루어지게 된다.
이로인해 속도 저하가 심각하게 발생하게 된다.