“안녕” ≠ new String(”안녕);
String 리터럴은 StringPool 에 상수 형식으로 저장되지만 new String() 은 새로은 String 객체를 생성하여 동작한다.
String literal = "HelloWorld";
문자열 리터럴은 Heap 내의 String Constant Pool 이라는 영역에 할당된다.
만약, 이미 같은 값을 가지고있는 리터럴이 ConstantPool 에 존재할때,
새로운 객체를 생성하지 않고, 기존에 존재하는 리터럴을 사용한다
String a = "ABC";
String b = "ABC";
System.out.println(a == b);
>> true //a 와 b가 (String Constant Pool 내의) 같은 주소에 저장되었다.
많은 변수가 리터럴을 통해 같은 주소를 참조할 수 있으므로, 서로 영향을 줄 수 있는데
자바는 이를 String 을 불변객체(Immutable) 로 설정함으로서 이를 해결하였다.
또한, thread-safe 하여 멀티쓰레드 환경에서도 공유사용이 가능하다.
다른 객체들처럼 Heap 메모리에 새로운 주소를 할당받는다.
따라서, 모든 String 변수의 주소가 다르게 저장된다.
String a = "ABC"; //in String Constant Pool
String b = new String("ABC"); //in Heap
String c = new String("ABC"); //in Heap
System.out.println(a == b || a == c);
>> false //a 와 b, c가 각각 다른 주소에 저장되었다.
본 글은 자바 7 이상에서의 StringConstant Pool 에 대해 다룹니다
Heap 영역에 따로 존재하는 가변 메모리이다.
기존에는 런타임 정적 메모리인 Perm 에 존재하였지만, Out Of Memory 문제가 발생할 위험이 있어 Heap 영역으로 이동되었다.
Heap 영역으로 이동되었으므로 상수풀(StringConstantPool) 에 들어간 문자열도 GC 대상으로 지정된다.