Javascript - 변수와 타입

JiMin LEE·2025년 4월 7일
0

TIL

목록 보기
2/9

✅ Primitive Type (Value)

값이 Stack에 들어간다.

  • 메모리의 값은 변경이 안되고, 값이 변경되면 새로운 메모리가 할당됨!
  • 숫자(number), 문자열/문자열템플릿, boolean, null, undefined, Symbol



✅ Object Type (Reference)

  • Array, Date, RegExp, Map/WeakMap, Set/WeakSet



✚ Constant pool

🔹 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는 같은 객체를 참조합니다.

Contant Pool VS String Constant Pool

예제

	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해서 풀에서 찾아씀)
      }
}

0개의 댓글