본문 바로가기

Java/공부공부

[자바기초] String Pool 에 대해서

 

자바에서 ' == ' 연산자는 두 객체의 메모리 주소를 비교한다.

String str1 = new String("Hello");
String str2 = new String("Hello");

System.out.println(str1 == str2);   // false

 

따라서 위처럼 각각 다른 객체인 str1과 str2를 비교하게 되면 결과값은 false가 나온다.

두 객체가 각각 다른 메모리 주소를 참조하고 있기 때문.

 


 

하지만, 동일한 문자열 리터럴을 사용하는 경우에는 String Pool에서 동일한 문자열이 공유된다.

String str3 = "Hello";
String str4 = "Hello";

System.out.println(str3 == str4);   // true

 

문자열 리터럴이 동일하기 때문에 str4는 str3과 동일한 메모리 주소를 참조하게 된다.

따라서 결과값은 true.


 

 new 연산자로 생성된 객체는 String pool이 아닌 Heap 영역 내부의 별도의 객체로 저장된다.

아래처럼 메모리 주소가 달라진다.

String str1 = new String("Hello");
String str2 = new String("Hello");
String str3 = "Hello";
String str4 = "Hello";

System.out.println(Integer.toHexString(System.identityHashCode(str1)));	// 1ee0005
System.out.println(Integer.toHexString(System.identityHashCode(str2)));	// 6504e3b2
System.out.println(Integer.toHexString(System.identityHashCode(str3)));	// 515f550a
System.out.println(Integer.toHexString(System.identityHashCode(str4)));	// 515f550a

 


 

* String Constant Pool 이란?

 

Java에서 문자열 리터럴을 관리하는 특별한 메모리 영역. (Heap 영역에 존재)

여기에 저장된 문자열 리터럴은 JVM (Java Virtual Machine)에 의해 하나의 인스턴스로 관리되며, 

동일한 문자열 리터럴을 여러 곳에서 참조할 때 메모리를 효율적으로 관리하기 위해 사용.

 

문자열 생성

=> JVM이 String Pool에서 해당 문자열 존재여부를 확인

=> 동일한 문자열이 있다면 JVM은 해당 String Pool의 인스턴스를 참조하도록 설정.


 

이게 가능한 이유는

문자열이 불변성 (Immutable) 의 특성을 가지고 있기 때문.

        한 번 생성되면 그 값을 변경할 수 없음

 

* 기본 데이터 타입 (primitive types) 는 변경 가능. (메모리의 재활용 어려움)