-
[JAVA] String Constant Pool은 무엇일까?Programming🧑💻/Java 2022. 12. 17. 21:17
String Constant Pool
- String Constant Pool 개념에 대해 이해하기 위하여 다음 두개의 유사한 자바 프로그램을 비교해보자
case 1
- String의 경우 참조형이기 때문에 "=="을 사용해 변수를 비교하면 가리키고 있는 객체가 동일한지(같은 메모리주소)를 가지고 있는지 확인한다.
- case1의 경우에는 출력으로 "Yes"가 나온다.
class GFG { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; if (s1 == s2) System.out.println("Yes"); else System.out.println("No"); } }
case 2
- 위의 프로그램과 같이 String 변수를 비교하지만 각각의 변수에 "new" 키워드를 통해 별도의 객체를 생성하여 참조토록 하였다.
- case 2의 경우에는 출력으로 "NO"를 갖는다.
class GFG { public static void main(String[] args) { String s1 = new String("abc"); String s2 = new String("abc"); if (s1 == s2) System.out.println("Yes"); else System.out.println("No"); } }
두 프로그램의 출력이 다른 이유?
String의 특징
- String은 문자의 나열을 나타내는 참조형 객체이다.
- String의 가장 중요한 특징은 일단 생성되면 불변이라는 점이다.
- 프로그램이 실행되는 동안 String은 내부적으로 상태를 유지한다.
- String의 불변성은 String Constant Pool을 이용해 달성된다.
String Constant Pool
- 자바에서 인스턴스는 Heap 메모리 상에 저장된다.
- String Constant Pool은 프로그램 상에서 정의된 String 값들이 저장되는 Heap메모리에서의 구분되는 공간을 의미한다.
String str1 = "Hello";
- String 객체는 Stack에 저장되며 객체의 값인 "Hello" 인스턴스는 Heap 상에서 String constant pool에 저장된다.
String str1 = "Hello"; String str2 = "Hello";
- 또다른 String 객체 str2을 선언하고 같은 값을 할당하면 Stack상에 str2에 대한 객체가 저장된다.
- 하지만 str2에 대응하는 값인 "Hello" 인스턴스를 Heap 상에 새로 생성하지 않고 기존의 "Hello"를 재사용한다.
- String Constant Pool은 Heap 상에 있는 작은 캐시라고 할 수 있다.
- 자바에서는 str2 = "Hello" 처럼 값을 String 값을 직접 할당시 이 값을 String Constant Pool 내에 저장한다.
- String Constant Pool에 String 값들을 저장하고 새로운 객체가 이미 존재하는 값은 참조하여 재사용하게 한다.
- 이미 존재하는 값은 재사용하는 방식을 통해 메모리 사용을 절약할 수 있다. -> String Constant Pool 존재 이유
String str1 = "Hello"; String str2 = "Hello"; String str3 = "Class";
- 물론 "Class"처럼 새로운 인스턴스를 값으로 하는 경우 String Constant Pool에 이 인스턴스를 저장한다.
String str1 = new String("John"); String str2 = new String("Doe");
- "new" 키워드를 사용하여 인스턴스를 생성할시 String Constant Pool 밖의 Heap에 값을 저장한다.
- 즉 해당 값들은 캐시 하지 않기 때문에 이전에 동일한 값의 사용여부와 관련 없이 항상 새로운 인스턴스를 생성해 저장한다.
결론
- case 1의 경우에는 직접 할당 형식을 취하였기 때문에 s1에 해당하는 값인 인스턴스가 String Constant Pool에 저장되었다.
- 두번째 s2가 선언될 때 한번 사용된 값이므로 이 값이 String Constant Pool에 캐시되어 있고 s2는 이 값을 똑같이 참조한다.
String s1 = "abc"; String s2 = "abc";
- case2의 경우에는 "new" 키워드를 사용하여 인스턴스를 생성하였으므로 String Constant Pool 밖의 Heap에 저장된다.
- 따라서 동일한 값이더라도 캐시되지 않았기 때문에 s2는 새로운 인스턴스를 생성하여 이를 참조한다.
String s1 = new String("abc"); String s2 = new String("abc");
- "=="는 값의 형태가 아닌 값의 위치가 동일한지 즉 동일한 인스턴스를 참조하는지를 판단하므로
- case 1의 경우에는 각 객체들이 String Constant Pool의 인스턴스를 공유하며 참조하기 때문에 true이다.
- case 2의 경우에는 각 객체들이 별도의 인스턴스를 참조하고 있기 때문에 false이다.
★출처
String Constant Pool in Java - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
'Programming🧑💻 > Java' 카테고리의 다른 글
[JAVA] NPE : 널포인트 Exception (0) 2023.03.16 [JAVA] 컴퓨터와 자바 메모리에 대한 이해 (0) 2023.03.07 [JAVA] final (0) 2022.10.25 [JAVA] static (0) 2022.10.21 [JAVA] Enums (0) 2022.10.08