Java String Pool 원리 완벽 이해하기
Java를 공부하다 보면 정말 자주 보게 되는 코드가 있습니다.
String a = "Java";
String b = "Java";
그리고 아래 결과가 나옵니다.
System.out.println(a == b);
↓
true
초보 시절에는 보통:
“왜 객체인데 == 가 true지?”
매우 헷갈립니다.
실제로 여기에는 Java JVM의 중요한 최적화 구조인:
String Pool
이 숨어 있습니다.
실무에서도:
- 메모리 최적화
- 문자열 비교
- immutable 구조
- intern()
- Constant Pool
- GC
까지 깊게 연결됩니다.
이번 글에서는:
- String Pool이 왜 존재하는가
- JVM 내부 구조
- intern()
- == vs equals()
- new String() 차이
- 실무 성능 이슈
까지 JVM 관점으로 깊게 정리해보겠습니다.
1. String은 특별한 객체다
Java에서 String은:
String s = "Java";
처럼 매우 자주 사용됩니다.
즉:
문자열 객체 생성 빈도 매우 높음
입니다.
2. 문제점
만약 문자열마다 새 객체 생성하면:
String a = "Java";
String b = "Java";
메모리:
Heap:
0x1000 -> "Java"
0x2000 -> "Java"
동일 문자열 중복 저장 발생.
3. String Pool 등장 목적
핵심 목적:
동일 문자열 재사용
입니다.
즉:
- 메모리 절약
- 성능 향상
목적.
4. String Pool이란?
String Pool은:
JVM 내부 문자열 캐시 영역
입니다.
즉:
같은 문자열이면
기존 객체 재사용
구조.
5. 가장 기본 예제
String a = "Java";
String b = "Java";
메모리 구조:
String Pool:
0x1000 -> "Java"
Stack:
a -> 0x1000
b -> 0x1000
즉:
같은 객체 공유
중.
6. 그래서 == 가 true
a == b
의미:
같은 reference인가?
입니다.
현재:
둘 다 같은 Pool 객체 참조
중이므로 true.
7. equals()는 다르다
a.equals(b)
는:
문자열 내용 비교
입니다.
즉:
- == → 주소 비교
- equals → 내용 비교
8. new String()은 다르다
매우 중요합니다.
String a = new String("Java");
String b = new String("Java");
메모리:
String Pool:
0x1000 -> "Java"
Heap:
0x2000 -> new String
0x3000 -> new String
9. 왜 새 객체가 생성될까?
new
는:
무조건 새 객체 생성
의미이기 때문.
10. 그래서 결과는?
a == b
↓
false
왜냐하면:
서로 다른 Heap 객체
이기 때문.
11. 하지만 equals는 true
a.equals(b)
↓
true
내용은 동일하기 때문.
12. String Pool 위치
JDK 버전에 따라 다릅니다.
JDK6 이전
PermGen(Method Area 계열)
JDK7 이후
Heap 영역
으로 이동.
13. 왜 Heap으로 이동했을까?
문자열 사용량이 많아지면서:
PermGen 공간 부족 문제
발생.
Heap 기반이 더 유연했기 때문.
14. intern() 메서드
매우 중요합니다.
String s = new String("Java");
s.intern();
15. intern() 의미
intern()은:
String Pool에 문자열 등록/조회
기능.
즉:
Pool에 있으면 반환
없으면 Pool 등록
수행.
16. 예시
String a = new String("Java");
String b = a.intern();
String c = "Java";
결과:
b == c
↓
true
17. 메모리 구조
Pool:
0x1000 -> "Java"
Heap:
0x2000 -> new String("Java")
Stack:
a -> 0x2000
b -> 0x1000
c -> 0x1000
18. 왜 String이 immutable일까?
핵심 이유 중 하나가:
String Pool 안전성
입니다.
만약 mutable이면:
a = "Java"
b = "Java"
공유 중인데 한쪽 수정 시:
전체 문자열 오염
가능.
19. 그래서 String은 immutable
한 번 생성 후 변경 불가
구조 채택.
20. 문자열 변경 시 실제 동작
String s = "Java";
s += "!";
실제로는:
새 String 객체 생성
입니다.
기존 수정 아님.
21. 그래서 StringBuilder가 존재
반복 문자열 변경 시:
String 객체 계속 생성
문제 발생.
그래서:
StringBuilder
사용.
22. StringBuilder는 mutable
즉:
내부 char 배열 직접 수정
가능.
문자열 반복 처리에 훨씬 효율적.
23. Constant Pool과 관계
String 리터럴:
"Java"
는:
Class Constant Pool
과 연결됨.
클래스 로딩 시 문자열 정보 저장.
24. 컴파일 최적화
예시:
String s = "Ja" + "va";
컴파일 시:
"Java"
로 최적화.
즉:
s == "Java"
↓
true
25. 하지만 변수 포함 시 다름
String a = "Ja";
String s = a + "va";
이건 런타임 연산.
즉:
새 객체 생성 가능
26. 실무에서 중요한 이유
대표 사례:
| 문제 | 원인 |
| 메모리 증가 | 문자열 과다 생성 |
| GC 증가 | String 객체 폭증 |
| 성능 저하 | + 반복 사용 |
| 비교 오류 | == 사용 |
27. String 비교 실수
매우 흔함.
안 좋은 예:
if (a == b)
문자열 비교는 보통:
equals()
사용해야 함.
28. String Pool 장점
| 장점 | 설명 |
| 메모리 절약 | 동일 문자열 공유 |
| 성능 향상 | 객체 재사용 |
| GC 감소 | 객체 수 감소 |
29. String Pool 단점
문자열이 너무 많으면:
Pool 메모리 증가
가능.
30. 실무에서 intern()은 잘 안 쓰나?
대부분은 JVM 자동 관리 충분.
하지만:
- 대량 중복 문자열
- 캐시 최적화
등 특수 상황에서는 사용 가능.
31. 문자열 생성 방식 비교
| 방식 | 특징 |
| "Java" | Pool 사용 |
| new String() | 새 객체 생성 |
| intern() | Pool 참조 반환 |
32. JVM 메모리 구조와 연결
String Pool도 결국:
JVM 메모리 최적화 전략
입니다.
즉:
- Heap
- GC
- immutable
- Constant Pool
전부 연결됨.
33. 실무에서 자주 하는 실수
1) == 로 문자열 비교
매우 흔함.
2) 문자열 + 반복 사용
for (...) {
str += value;
}
객체 폭증 가능.
3) new String() 남발
불필요 객체 생성 증가.
34. 핵심 흐름 요약
문자열 리터럴 생성
↓
String Pool 확인
↓
있으면 재사용
없으면 생성
35. 가장 중요한 핵심 한 줄
String Pool은
동일 문자열 객체를
재사용하기 위한 JVM 캐시 구조
입니다.
36. 정리
String Pool은 단순 문자열 저장 공간이 아닙니다.
실제로는:
- JVM 메모리 최적화
- immutable 구조
- 문자열 재사용
- GC 효율
- Constant Pool
과 깊게 연결되는 매우 중요한 JVM 구조입니다.
특히 실무에서는:
- == vs equals
- new String 차이
- intern()
- StringBuilder 사용 이유
를 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
Garbage Collector(GC) 원리
를 Mark and Sweep, Minor/Full GC, Stop-The-World, G1GC 구조까지 포함해서 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java GC 종류와 특징(G1GC, ZGC 등) 완벽 이해하기 (0) | 2026.05.26 |
|---|---|
| Java Garbage Collector(GC) 원리 완벽 이해하기 (0) | 2026.05.26 |
| Java 참조 타입(Reference Type)과 객체 참조 완벽 이해하기 (0) | 2026.05.26 |
| Java 객체 생성 과정과 메모리 흐름 완벽 이해하기 (0) | 2026.05.26 |
| Java Stack / Heap / Method Area 메모리 구조 완벽 이해하기 (0) | 2026.05.26 |
댓글