String Pool이란 무엇인가?

Dev. 로티·2022년 1월 26일
2

자바

목록 보기
6/9

이펙티브 자바라는 도서의 챕터 중 불필요한 객체 생성을 피하라라는 아이템에서 우연히
“가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다.” 라는 문구를 보게되었습니다.

‘JVM 내에서 다른 코드(변수)들 끼리 String 메모리를 공유한다는 말인가?’ 싶어 찾아보니 우연히 String Pool이라는 개념을 듣게 되고 알게되었습니다.


String Pool

String Pool은 쉽게 말해 String 문자열이 존재하는 영역(JVM 힙 메모리에 존재) 인데, 아래의 코드들은 같은 문자열 내용이 할당되지만 메모리 내에 할당되는 방식에 차이가 있어 간혹 개발자들에게 혼란을 야기하곤 합니다.

String value1 = “value”;
String value2 = new String(“value”);

== 비교 같은 경우 같은 메모리 주소를 참조하는지를 비교하는 것이기 때문에 위 문자열을 == 비교시 당연히 false가 찍히고, value.equals(value2) 구문을 사용하면 true 값을 받을 수 있다는 것은 모두가 알고있는 사실인데요.


여기서 재미있는 한가지를 더 추가해보겠습니다.

String value1 = “value”;
String value2 = “value”;

== 통해 비교할 경우 위 코드는 당연히 false를 반환할 것이라고 생각했습니다.
그러나 결과는 true였습니다.

이게 왜 true라는 결과값이 나올까요?


[이미지 출처:https://itzone.com.vn/en/article/what-is-string-pool/]
(위 이미지는 이해를 돕기위한 이미지입니다.)


이것을 이해하기 위해서는 String 메모리가 어떤 방식으로 할당되는가에 대해 알아야합니다.


첫번째로 먼저 문자열을 직접 리터럴 하는 방식에 대해 알아보도록 하겠습니다.

String value1 = “value” 같은 문자열을 직접 리터럴 하는 방식은 JVM 메모리 힙 영역중에서 String Pool 영역에 할당이 되는데요, String Pool 영역에 할당 되다보니 같은 문자열 리터럴 String value2 = “value” 이 코드가 실행될때 이미 String Pool에 해당하는 같은 문자열이 존재하기 때문에 기존의 value 라는 문자열을 재사용하게됩니다.


두번째로 문자열을 new 연산자를 통해 할당하는 방식에 대해 알아보도록 하겠습니다.

String value2 = new String(“value”) 이 코드는 new 연산자를 통해 객체를 할당하는 것이기 때문에 String 문자열을 할당할 지라도 String pool을 사용하지 않고 JVM 메모리 힙 영역에 직접 할당이 되는데요. 그렇기 때문에 힙 영역에 할당될때 항상 주소 값을 새로 참조하게 됩니다.


위의 두가지 내용을 생각해보면 아래의 코드가 왜 true 값이 반환되는지 이해가 되실것입니다.
전에 학교에서 문자열 비교 연산은 무조껀 equals만을 이용해서 해야한다고 했었는데…

사실 보면 그것도 아니였나보군요 … ㅋㅋ … 새로운 정보를 얻게되었습니다 ㅎㅎ

0개의 댓글