아이템 5. 불필요한 객체는 만들지 말라.
05. 불필요한 객체는 만들지 말라.
기능적으로 동일한 객체는 필요할 때마다 만드는 것 보다 재사용하는 편이 낫다.
변경 불가능 객체는 언제나 재사용할 수 있다.
String s0 = new String("foo"); // 절대 이렇게 쓰지 말것 !!!
String s1 = "foo";
변경 불가능한 객체뿐 아니라, 변경 가능한 객체도 재사용할 수 있다.
public class Person{
final Date birthDate;
// 1946~1964년 사이에 태어난 사람이면 참을 반환
public boolean isBadyBoomer(){
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
Date boomStart = gmtCall.getTime();
gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
Date boomEnd = gmtCal.getTime();
return birthDate.compareTo(boomStart) >= 0
&& birthDate.compareTo(boomEnd) < 0;
}
}
위와 같이, 생성 비용이 높은 객체(Calendar)를 isBadyBommer 메소드가 호출될 때 마다 생성하는 것 보다, 정적 초기화 블록(static initializer)를 통새 개선하는 것이 좋다.
public class Person{
final Date birthDate;
static final Date BOOM_START;
static final Date BOOM_END;
static{
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_START = gmtCall.getTime();
gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_END = gmtCal.getTime();
}
// 1946~1964년 사이에 태어난 사람이면 참을 반환
public boolean isBadyBoomer(){
return birthDate.compareTo(BOOM_START) >= 0
&& birthDate.compareTo(BOOM_END) < 0;
}
}
JDK 1.5 이상 부터는 자바 기본 자료형(primitive type)에 대해서, 자동 객체화(autoboxing)을 지원한다. 자동 객체화 덕에 기본 자료형과 그 객체 표현형 사이의 차이가 희미해지긴 했지만, 아주 없어진 것은 아니다. 의미적인(semantic)차이는 미미하지만, 성능 차이는 무시하기 어렵다.
public static void main(String[] args){
Long sum = 0L;
for(long i = 0; i < Integer.MAX_VALUE; ++i){
sum += 1;
}
System.out.println(sum);
)
위와 같이 반복문에서 sum(Long 자동 객체화 타입)에 값을 저장하면 2^31객의 Long객체가 만들어지기 때문에 무시무시하게 느리게 동작한다.
자동 객체화 타입 대신 기본 자료형을 사용하고, 생각지도 못한 자동 객체화가 발생하지 않도록 유희해야 한다.