본문 바로가기
Java

String Constant Pool이란? | Java String Pool

by kmmguumnn 2020. 7. 20.

Java에서 String 객체를 생성하는 방법은 2가지가 있다.

첫번째는 String literal, 즉 큰 따옴표("")를 사용하는 것이고, 두번째는 new 연산자를 사용하는 것이다.

두 방법에는 어떤 차이가 있을까?

 

간단한 테스트를 작성해 결과를 살펴보았다.

두 테스트 모두 성공한다.

 

String literal로 생성한 객체는 내용이 같다면 같은 객체, 즉 동일한 메모리 주소를 가리키고 있다.

하지만 new 연산자로 생성한 String 객체는 내용이 같더라도 개별적인 객체임을 알 수 있다.

 

여기에는 어떤 원리가 숨어있는지, JVM 구조와 함께 이해해 보도록 한다.

 


 

Java String Pool

흔히 new 연산자로 String 객체를 생성하지 않는 것이 좋다는 말을 볼 수 있다.

 

String literal로 생성하면 해당 String 값은 Heap 영역 내 "String Constant Pool"에 저장되어 재사용되지만, new 연산자로 생성하면 같은 내용이라도 여러 개의 객체가 각각 Heap 영역을 차지하기 때문이다.

 

그림으로 살펴보자.

(그림에는 생략되어 있지만) 생성된 String 객체는 Stack 영역에 저장된다.

Heap 영역에는 "Cat", "Dog"과 같은 '값'들이 들어가게 되는데, 그림의 우측을 보면 중요한 차이를 발견할 수 있다.

 

  • String literal로 생성한 객체는 "String Pool"에 들어간다.
  • String literal로 생성한 객체의 값(ex. "Cat")이 이미 String Pool에 존재한다면, 해당 객체는 String Pool의 reference를 참조한다. 그림에서 s1과 s2가 같은 곳을 가리키고 있는 것도 이 때문이다.
  • new 연산자로 생성한 String 객체는 같은 값이 String Pool에 이미 존재하더라도, Heap 영역 내 별도의 객체를 가리키게 된다.

 


String interning

String 클래스에는 intern()이라는 메서드가 있다.
(아마도 String Pool "내부"에 추가한다는 뉘앙스인 듯 하다)

 

intern()은 해당 String과 동등한(equal; 값이 같음) String 객체가 이미 String Pool에 존재하면 그 객체를 그대로 리턴한다. 그렇지 않다면, 호출된 String 객체를 String Pool에 추가하고 객체의 reference를 리턴한다.

 

이번에도 intern() 메서드를 사용한 테스트 코드를 작성해 결과를 살펴보자.

성공하는 테스트.

 

new 연산자를 사용해 생성한 String 객체는 String Pool 바깥에 있었지만, intern() 메서드를 호출한 후엔 String Pool로 이동해 String Pool에 원래 있던 객체와 동일한 reference 값을 가짐을 확인할 수 있다.

 


결론

String 객체를 new 연산자로 생성하면, 같은 값이라 할지라도 Heap 영역에 매번 새로운 객체가 생성된다. 따라서 String이 갖는 불변성이라는 장점을 누리지 못한다.

 

결국 메모리를 효율적으로 사용하기 위해서는 항상 String literal(큰 따옴표)로 String을 생성하는 것이 좋겠다.

 


References

 

Guide to Java String Pool | Baeldung

Learn how the JVM optimizes the amount of memory allocated to String storage in the Java String Pool.

www.baeldung.com

 

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

 

 

'Java' 카테고리의 다른 글

Java에서 String은 왜 불변일까?  (2) 2020.07.21
JVM 아키텍처 / Garbage Collection  (0) 2019.04.05
JVM, JRE, 그리고 JDK의 개념  (0) 2019.02.04
POJO 이해하기  (0) 2018.12.12

댓글