[ java ]Constant Pool과 String Constant Pool

2024. 12. 10. 13:19·JAVA

📌 Constant Pool

  • JVM의 Method Area 내부에 위치하고 있다.
  • Constant Pool은 클래스를 컴파일할때 생성된다.
    • 컴파일 될때, 클래스 파일내에 포함된 클래스의 구성요소(상수, 문자열, 클래스)를 저장하고 관리한다.
    • Constant Pool에 저장된 값들은 런타임 시점에 JVM에 의해 사용된다.

 

 

📌 String Constant Pool

❓ String Constant Pool 또는 String Pool이라고 부른다.

  • JVM의 heap 내부에 위치하고 있다.
    • String Constant Pool은 Heap 영역 안에서 관리된다.
  • 런타임시점에 사용되는 메모리 영역이다.
String test1 = "hello";
String test2 = "hello";
  • 리터럴 사용시 String Constant Pool(=String pool) 동작 과정
  1. hello 는 heap영역 내부에 있는 StringtPool에 저장이 되고, test1 변수는 스택에 저장된다.
  2. 이때 test1 에서 hello를 StringPool에 저장했기 때문에, test2 는 StringPool에 이미 만들어진 hello 를 참조하게 된다.
  3. test1 변수는 stack에 저장되게 된다.
  4. 이 이유로 → test1 == test2 // true 가 나오게 된다.
String test1 = new String("hello");
String test2 = new String("hello") 
  • new 사용시 동작 과정
  1. 각각 하나의 객체로서 heap에 저장되게 된다
  2. 이때 hello는 객체이기 때문에, StringPool에 저장되지 않는다.
  3. heap에 객체로서 각각 hello, hello가 저장되게 되고
  4. 스택에 test1 과 test2 변수(각각의 hello를 가리킨다)가 저장된다.
  5. 이 이유로 test1 == test // false가 나오게 된다.

 

 

📌 결론

  • Constant pool : 컴파일 시점에 사용되며, 클래스 파일에 포함된 상수 들을 저장한다.
  • String pool : 런타임 시점에 JVM에 의해 활용되며, String 리터럴 값을 저장 또는 재사용한다.
String str1  = "test";
String str2 = new String("test");
String str3 = new String("test");
String str4  = "test";

System.out.println(str1 == str4);
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
  • 결과 
    • str1 값은 String pool에 저장되고, 재사용된다.
    • str2 값은 힙에 저장되며, 재사용되지 않고 객체로서 각각 만들어진다.

 

 

❓ 컴파일 ?

  • 소스코드가 컴파일러에 의해 바이트 코드로 변환되는 과정
  • 문법 검사, 타입 검사 등
  • Ex java → class

❓런타임 ?

  • 프로그램이 실행되는 시점
  • 실제 프로그램 실행, 메서드 호출, 메모리 할당 등

 

 

 

참고 블로그

https://rlaehddnd0422.tistory.com/184

https://deveric.tistory.com/123

'JAVA' 카테고리의 다른 글

[ java ] 생성자, 생성자 오버로딩  (0) 2024.12.10
[ java ] 추상클래스  (0) 2024.12.10
[ java ] 객체 상속  (0) 2024.12.10
[ java ] 메서드의 매개변수로 Object? (Object - toString())  (0) 2024.12.10
[ java ] 객체지향 프로그래밍(클래스, 생성자, 메서드, 필드)  (1) 2024.12.05
'JAVA' 카테고리의 다른 글
  • [ java ] 생성자, 생성자 오버로딩
  • [ java ] 추상클래스
  • [ java ] 객체 상속
  • [ java ] 메서드의 매개변수로 Object? (Object - toString())
Adose
Adose
  • Adose
    도즈의 개발 블로그
    Adose
  • 전체
    오늘
    어제
    • 분류 전체보기 (183)
      • JAVA (22)
      • 스프링 | 스프링 부트 (30)
        • 스프링 시큐리티 (1)
        • 채팅 (1)
      • 스프링 프로젝트 (5)
        • JDBC - 은행앱 구현 (1)
        • Spring Boot - 독서 블로그 프로젝트 (3)
        • 개인 프로젝트 - CoreBrief (1)
      • 가상화 기술 (1)
      • Git (1)
      • 코딩테스트 (37)
        • 프로그래머스 입문 (68)
      • AWS (1)
      • 데이터베이스 (0)
      • CS 공부 (4)
      • 알고리즘, 자료구조 (5)
      • 우테코 프리코스 (7)
      • 트러블 슈팅 (1)
      • 프론트 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    자바
    springdatajdbc
    Spring
    스프링
    Java
    프론트
    test
    LV2
    GIT
    멋쟁이사자처럼백엔드
    멋쟁이사자처럼
    jdbc
    코딩테스트
    LV0
    LV1
    스프링부트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Adose
[ java ]Constant Pool과 String Constant Pool
상단으로

티스토리툴바