반응형
금융결제원 필기 시험을 준비하면서 메모리 효율성 방안을 고민하다가 해당 개념을 정리해보았다.
public class Test {
public static void main(String[] args) {
String a = "hello";
String b = "he" + "llo";
System.out.println(a == b);
}
}
문제를 보고 출력되는 결과문은 false라고 생각했다. 서로 다른 String 객체가 생성될 거라고 생각했기 때문이다.
하지만 정답은 true였다. 적잖이 놀랐다.
해설을 보니 문자열 리터럴 "hello"는 string constant pool에 저장되고 재활용되기 때문에 a와 b는 같은 참조를 하고 true를 출력한다고 한다.
Java에서 String 객체를 생성하는 방법에는 2가지가 있는걸로 알고 있다.
// 1번
String a = new String("banana");
// 2번
String b = "banana";

두 테스트 모두 터지지 않고 성공했다.
즉 String 리터럴로 생성한 객체는 내용이 같다면 같은 객체, 즉 동일한 메모리 주소를 가리키고 있다는 것이다!
반면 new 연산자를 사용해 동적으로 생성한 String 객체는 내용이 같아도 서로 다른 객체라는 것이다.
String Pool 이란?
JVM이 문자열 리터럴을 효율적으로 관리하기 위해 사용하는 특별한 메모리 공간이다. 이 공간에는 코드 내에 등장하는 모든 문자열 리터럴이 저장되고 동일한 리터럴이 여러 번 등장해도 모두 같은 객체를 참조하게 된다!
인턴십을 하면서 문자열 리터럴을 활용하고 new 연산자를 지양하라고 배웠었다. Heap에 계속 새로운 객체가 생성되어 메모리를 낭비하게 되기 때문이다.

추가로 String Constant Pool은 내부적으로 해시테이블 구조를 가지고 있어서 성능은 어느정도 보장되어있다고 한다.
반응형
'Backend' 카테고리의 다른 글
| Spring 트랜잭션 내부 동작 원리 (0) | 2025.04.04 |
|---|---|
| [FCM] CI/CD github secret에서 json 파일 만들 때 유의할 점 (0) | 2025.01.16 |
| [Spring Boot] 버전 3.3에서 변경된 WARN Serializing PageImpl instances as-is is not supported 해결법 (0) | 2025.01.12 |
| [Java] 일급 컬렉션 학습 내용 정리 (0) | 2025.01.06 |
| DDD 레이어드 아키텍처에 대한 고민 (0) | 2024.12.31 |