본문 바로가기

잡다한 개발잡담

자바의 String Pool 알아보기

자바의 String 타입을 다룰 일이 요즘 많아지고 있습니다.. 그렇지만 잘 알고 사용하지 못하는 것 같아 내용을 정리해보겠습니다.

불변성(Immutable)
유일하게 제가 알고 있던 String의 특징은 불변성입니다.  String 문자열 객체는 처음 생성했던 값은 절대 변하지 않습니다.

String a = "abc";
a = "abcde";

위와 같이 String 객체가 생성된 후에 abcde로 객체를 변경하면 내부적으로 값이 변경되는게 아닌 새로운 String 객체가 생성되어 새로운 참조를 바라보고 있게 됩니다. 그렇기 때문에 "abc"아 "abcde" 두 개의 객체가 생성되어 heap 영역에 생성되어 있습니다.

왜 불변이냐!?
왜 불변일까요? String 타입은 가장 많이 사용되는 타입입니다. 그러므로 프로그래밍을 하면서 가장 많은 메모리를 차지하고 있을 확률이 높습니다. 그러므로 재사용이 될 가능성이 높다고 판단하고 같은 값일 경우에 어플리케이션 당 하나의 String 객체만을 생성하여 JVM의 Heap 영역을 절약하는 역할을 합니다.

String의 캐싱 기능
같은 값을 가지는 객체는 하나만 생성하게 되므로 캐싱 역할을 수행하게 되는데 그러므로 메모리의 절약과 빠른 속도를 보장할 수 있습니다. 

for(int i=0; i<100; i++){
	String str = "aa";
 }

참조변수인 str은 스택영역에서 100번 생성되겠지만 "aa"의 String 객체는 처음에 단 한번만 수행됩니다.

자바에서는 String 객체들을 Heap의 String pool 이라는 공간에 저장하여 사용하게 됩니다. 그러므로 String pool에 이미 있는 객체의 경우 새로 생성하지 않고 Pool에 있는 객체를 사용하도록 하여 객체를 매번 새로 생성하는 오버헤드를 방지합니다.

다른 장점은?
1. 중요한 데이터를 String 으로 저장하게 된다면 변경하지 못하므로 보안성을 높일 수 있습니다.
2. 여러 스레드에서 동시에 String 객체를 참조한다고 하여도 절대 변하지 않는 특성을 가지므로 안전성을 높일 수 있습니다.