본문 바로가기
language/java

Java String Pool 원리 완벽 이해하기

by 죄니안죄니 2026. 5. 26.
반응형

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 구조까지 포함해서 깊게 정리해보겠습니다.

반응형

댓글