String과 Boxing, 그리고 객체생성 (Effective java 3th - Item6)
불필요한 객체 생성을 피하라
Posted on
객체 재활용
불변 객체이고, 재활용이 자주 되는 객체는 매번 생성해서 좋을게 없다. 미리 만들어두고 참조만 지정하면서 재사용하는게 유리하다.
Java 내부 구현에서도 String 이 이런 패턴을 따른다.
나중에 다시 “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"); hello == new String("world").intern();
|
Auto-Boxing / Auto-UnBoxing
Primitive 타입의 박싱에서 주의해야 할게 잘못 코딩할 경우 원치않는 객체 생성이 일어난다. 비슷하게 쓸 수 있다고 해서 루프문이나 과도한 계산에 박싱타입과 Primitive 타입을 섞어 쓸 경우에는 끔찍한 성능 이슈를 겪을수도 있다.
1 2 3
| long first = 3L; long second = 2L; Long value = first + second;
|