값이 Stack에 들어간다.
- 메모리의 값은 변경이 안되고, 값이 변경되면 새로운 메모리가 할당됨!
숫자(number),문자열/문자열템플릿,boolean,null,undefined,Symbol
Array,Date,RegExp,Map/WeakMap,Set/WeakSet
🔹 Constant Pool이란?
: Constant Pool(상수 풀) 은 자바 클래스 파일(.class 파일) 내에 포함된 리터럴 상수값과 심볼 참조(Symbolic References) 를 저장하는 테이블
- 즉, 자바 컴파일러가
.java파일을.class파일로 변환할 때, 프로그램에서 사용하는 문자열, 정수, 클래스 및 메서드 참조 등을 이 테이블에 저장한다.String.intern()메서드는 문자열을 명시적으로 Constant Pool에 등록하고, 동일한 문자열이 이미 존재한다면 그 참조를 반환합니다.- Constant Pool은 메모리 절약에 유리하지만, 크기가 제한되어 있어서 너무 많은 상수를 선언하면
java.lang.ClassFormatError: constant pool full예외가 발생할 수 있습니다.
🔸 종류별 Constant Pool
1. 클래스 파일의 Constant Pool
.class 파일 내부에는 constant_pool이라는 테이블이 있으며, 여기에 다음과 같은 정보가 저장됩니다.
문자열 리터럴("hello") /숫자 리터럴(10, 3.14) /클래스/인터페이스 이름/필드/메서드 이름 및 타입 정보/메서드 참조 (Methodref)/필드 참조 (Fieldref)등
👉 이건 JVM이 클래스를 로드할 때 참고하는 정보입니다.
2. 런타임 Constant Pool
클래스가 JVM에 로드되면 .class 파일의 Constant Pool은 Runtime Constant Pool로 변환되어 메모리에 올라갑니다.
- String literal은 이 런타임 상수 풀에 저장되며, 중복을 방지하고 메모리 효율성을 높이기 위해 사용됩니다.
String a = "hello"; String b = "hello"; System.out.println(a == b); // true→ "hello"라는 문자열은 Constant Pool에 한 번만 저장되므로, a와 b는 같은 객체를 참조합니다.

예제
public class Main { public static void main(String[] args) { String a = "hello"; String b = "hello"; String c = new String("hello"); String d = c.intern(); System.out.println(a == b); // true (둘 다 String Constant Pool에서 공유) System.out.println(a == c); // false (c는 Heap에 새로 생성된 객체) System.out.println(a == d); // true (c를 intern해서 풀에서 찾아씀) } }