Development/Java

String의 특징에 대해 알아보자 (String Constant Pool)

BongChun 2022. 7. 1. 20:13

String


자바에서 문자열을 사용할 때 흔히 쓰는 자료형이다.
Primitive Type처럼 빈번하게 사용되지만, String은 Primitive Type이 아닌 char의 배열로 이루어진 Class자료형이라 할 수 있다.

String의 경우 특별한 특징들을 가지고 있는데, String의 값은 불변성을 가지며, String은 두가지의 메모리를 사용할 수 있다.

불변성을 가진다는 것은 무엇이고, 두가지의 메모리를 사용한다는 것은 어떤 의미인지 정리해보려 한다.

 

 

 

 

String Constant Pool과 Heap


String은 사용빈도가 매우 높기 때문에 조금 더 효율적으로 사용할 수 있는 String Pool에 저장하는 방식을 택했다.

String Pool에 저장한다는 것은 같은 문자열을 공유한다는 것을 의미한다.

공유한다는 것은 String Pool에 저장된 문자열의 주소를 가리킨다는 것이 된다.

String str = "String Pool";
String str2 = "String Pool";
--> 둘의 주소는 같은 곳을 가리킨다.


그렇다면 위와 같은 상태에서 str2가 값을 변경한다면 메모리 상에서 어떤 변화가 일어날까?

변경된 String의 값은 String Pool에서 별개의 공간이 생성되어 저장된다. 그리고 String은 변경된 주소를 가리키게 되는 것이다.

이것의 순서를 표현하자면 아래의 이미지과 같다.

 

1. “string pool”의 값을 두 String 변수가 가리키고 있음.
2. 값 변경시 새로운 String Pool 주소가 생성되고 “change string” 값이 할당됨
3. str2변수가 “change string”의 주소를 가리킴.

 


Heap

String은 위의 방법 외에도 다른 메모리를 사용하는 방식이 존재하는데, Heap 메모리를 사용하는 방법이다.

이 방법은 일반적으로 객체를 생성할 때 사용하는 방식과 같다.

new 연산자를 String객체를 생성해 heap메모리에 할당받는 것이다.

보통의 클래스라면 문제가 없지만, 빈번히 사용되는 String은 new 연산자를 통해 사용하다가 메모리의 낭비가 생길 수 있다.

String Pool과 다르게 똑같은 값을 가지더라도 각자의 메모리 공간을 할당받아 저장하기 때문이다.

heap에 String을 할당받아 사용하는 것은 개발자가 의도를 가지고 사용하는 것이 좋다.

 

 

 


불변성


String 자료형은 값은 불변성을 갖는다.

할당하게 되면 그 값을 변경할 수 없다는 말인데, 도대체 이유가 무엇일까?

위에서 설명했듯 String Pool은 같은 값을 공유한다.

공유하고 있는 값을 바꿀 수 있게 된다면, 그 값을 참조하고 있는 다른 String 자료형들은 원하지 않는 값을 참조하게 되는 것이다.

따라서 값이 변할 수 있다면, String Pool이 존재하는 이유가 사라진다.

위와 같은 특징은 메모리를 효율적으로 사용해 성능적으로 이점을 본다는 측면도 있지만, 보안 측면에서도 굉장히 의미있게 사용되고 있다.

 

 

 

Reference

[Java] String Pool에 관하여

 

[Java] String Pool에 관하여

안녕하세요. 오늘은 여러분들과 String Pool에 대해서 이야기해보고자 합니다. 알고 계셨나요 ? Java에서는 String을 저장하는데 2곳의 메모리를 사용할 수 있습니다. 오늘은 String Pool에 대해서 여러분

sabarada.tistory.com

Java에서 String은 왜 불변일까?

 

Java에서 String은 왜 불변일까?

Java에서 String은 불변(Immutable) 객체이다. 불변 객체란 무엇일까? 불변 객체란, 객체가 생성된 후 내부의 상태가 변하지 않고 계속 유지되는 객체를 말한다. 즉, 변수에 객체가 한 번 할당되면, 해

starkying.tistory.com