String과 Boxing, 그리고 객체생성 (Effective java 3th - Item6)

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

객체 재활용

불변 객체이고, 재활용이 자주 되는 객체는 매번 생성해서 좋을게 없다. 미리 만들어두고 참조만 지정하면서 재사용하는게 유리하다.

Java 내부 구현에서도 String 이 이런 패턴을 따른다.

1
String hello = "world";

나중에 다시 “world” 문자열이 필요해서 다음과 같이 선언해도 같은 객체를 사용함이 보장된다.

1
2
3
4
while(!isEnd()) {
String world = "world"; // 계속 같은 인스턴스 참조
// ...
}

이렇게 동작하는 이유는 Java에서 쓰이는 모든 String 객체는 상수풀에서 관리되며 프로그램 종료때까지 유지되기 때문이다.

강제로 상수풀의 문자열을 사용하게 하는 메서드로 intern 이 있다.

intern 된 문자열은 상수 풀에서 사용되기에 true 를 반환한다.

1
2
3
String hello = "world";
hello == new String("world"); // false
hello == new String("world").intern(); // true

Auto-Boxing / Auto-UnBoxing

Primitive 타입의 박싱에서 주의해야 할게 잘못 코딩할 경우 원치않는 객체 생성이 일어난다. 비슷하게 쓸 수 있다고 해서 루프문이나 과도한 계산에 박싱타입과 Primitive 타입을 섞어 쓸 경우에는 끔찍한 성능 이슈를 겪을수도 있다.

1
2
3
long first = 3L;
long second = 2L;
Long value = first + second; // 객체 생성.
객체 소멸자의 슬픈 디자인 (Effective java 3th - Item8, 9)
신규 통합 CS 시스템 관리 개발기 # 혼란편
  1. 1. 객체 재활용
  2. 2. Auto-Boxing / Auto-UnBoxing