[Java]Constant Pool/String Constant Pool 헷갈릴 수 있는 개념 정리

우니·2023년 7월 23일
1

자바 Heap 메모리 내부에는 Constant Pool이 존재하는데 이것은 String Constant Pool과는 다른 개념입니다. 헷갈릴 수 있는 개념을 차근차근 정리해보려고 합니다.

String Constant Pool

Java에서 문자열 리터럴을 저장하는 영역을 String Constant Pool, String Pool, String Interpool이라고 부릅니다.
"리터럴"로 선언된 문자열을 저장하는 영역이라고 했으니 new 객체로 선언한 문자열은 이곳에 저장이 되지 않습니다.

String str = "Hello World"; //String Constant Pool에 져장
String str2 = new String("Hello World"); //Heap 영역에 저장

위의 그림과 같이 리터럴 ex) String str1 = "Python";으로 선언된 문자열은 String Pool에 저장되고, new 객체로 생성된 문자열은 Heap 영역에 저장됩니다.
그런데, 그림의 String Pool을 보시면 str1과 str3를 같은 "Python"이라는 문자로 선언해주니 같은 곳을 가리키고 있는것이 보입니다. 아래에서 자세히 설명해보도록 하겠습니다.

String Constant Pool 객체의 재사용

리터럴 String str1 = "Python"을 먼저 생성하고, 다시 String str3 = "Python" 문자열을 생성합니다. 이때 JVM은 문자열을 확인하고 Python이 이미 있음을 발견하면 String 풀에서 새 인스턴스를 사용하는 대신 인스턴스의 참조(예: str1)를 반환합니다.

그렇기에 아래와 같은 결과가 나오게 됩니다.

System.out.println(str1 == str3);	// true (같은 객체를 재사용하기 때문에)

Constant Pool

이제 상수 풀에 대해서 알아보겠습니다. 이와 관련해서 찾아보다가 상수풀은 JVM - Metaspace 영역의 상수풀과 컴파일된 class 파일의 상수풀이 또 다르다는 것을 알았습니다.

Constant Pool(Class file)

컴파일시 클래스파일 내부에 존재하는 영역으로, JVM에 로드될 때 메모리에 로드합니다.

Runtime Constant Pool(JVM)

앞서 설명한 Class file constant pool이 런타임시 이 영역으로 저장됩니다.

참고 링크
https://deveric.tistory.com/123
https://www.javatpoint.com/string-pool-in-java

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기