네이버 면접 때 관련된 질문이 나왔었는데, 이걸 몰라서 정말 부끄러웠던 기억이 새록새록 납니다... 같은 무지를 반복하지 않기 위해 정리하고자 합니다
JDK 1.5 이전에는 문자열에 +, concat 연산을 하면 문자열을 새로운 메모리에 할당해서 참조했습니다
다음과 같은 코드를 JDK 1.5 이전에서 실행한다고 가정해보겠습니다
public static void main(String[] args) {
String a = "First";
String b = "Second";
String c = "Third;
System.out.println(a + b + c);
}
이 때 힙(heap) 영역에는 다음과 같이 데이터가 쌓였습니다
(이를 참조하는 주솟값 또한 stack에 쌓일 것이고, heap 영역에 있는 이 데이터들은 GC가 호출되기 전까지 메모리에 남아있게 된다)
//컴파일 전
public static void main(String[] args) {
String a = "First";
String b = "Second";
String c = "Third;
System.out.println(a + b + c);
}
//컴파일 후, 디컴파일된 코드
public static void main(String[] args) {
String a = "First";
String b = "Second";
String c = "Third;
System.out.println(new StringBuilder(a).append(b).append(c));
}
하지만 모든 문자열 연산이 StringBuilder로 대체된 것은 아닙니다. 다음과 같은 상황에서는 매 연산마다 새로운 StringBuilder가 선언됩니다