String, 리터럴과 new 키워드의 차이

지인호·2022년 1월 4일
0

TIL

목록 보기
6/28
post-thumbnail

“안녕” ≠ new String(”안녕);

String 리터럴은 StringPool 에 상수 형식으로 저장되지만 new String() 은 새로은 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 하여 멀티쓰레드 환경에서도 공유사용이 가능하다.

String 객체 (new String())

다른 객체들처럼 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가 각각 다른 주소에 저장되었다.

String Constant Pool

본 글은 자바 7 이상에서의 StringConstant Pool 에 대해 다룹니다

Heap 영역에 따로 존재하는 가변 메모리이다.

기존에는 런타임 정적 메모리인 Perm 에 존재하였지만, Out Of Memory 문제가 발생할 위험이 있어 Heap 영역으로 이동되었다.

Heap 영역으로 이동되었으므로 상수풀(StringConstantPool) 에 들어간 문자열도 GC 대상으로 지정된다.

profile
테오의 스프린트 17기 퍼실리테이터

0개의 댓글