ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] String Constant Pool은 무엇일까?
    Programming🧑‍💻/Java 2022. 12. 17. 21:17

    String Constant Pool 

    • String Constant Pool 개념에 대해 이해하기 위하여 다음 두개의 유사한 자바 프로그램을 비교해보자 

    case 1

    • String의 경우 참조형이기 때문에 "=="을 사용해 변수를 비교하면 가리키고 있는 객체가 동일한지(같은 메모리주소)를 가지고 있는지 확인한다. 
    • case1의 경우에는 출력으로 "Yes"가 나온다. 
    class GFG {
        public static void main(String[] args)
        {
            String s1 = "abc";
            String s2 = "abc";
      
            if (s1 == s2)
               System.out.println("Yes");
            else
               System.out.println("No");
        }
    }

    case 2

    • 위의 프로그램과 같이 String 변수를 비교하지만 각각의 변수에 "new" 키워드를 통해 별도의 객체를 생성하여 참조토록 하였다. 
    • case 2의 경우에는 출력으로 "NO"를 갖는다. 
    class GFG {
        public static void main(String[] args)
        {
            String s1 = new String("abc");
            String s2 = new String("abc");
      
            if (s1 == s2)
               System.out.println("Yes");
            else
               System.out.println("No");
        }
    }

     

    두 프로그램의 출력이 다른 이유?

    String의 특징

    • String은 문자의 나열을 나타내는 참조형 객체이다. 
    • String의 가장 중요한 특징은 일단 생성되면 불변이라는 점이다. 
    • 프로그램이 실행되는 동안 String은 내부적으로 상태를 유지한다.
    • String의 불변성은 String Constant Pool을 이용해 달성된다.

    String Constant Pool

    • 자바에서 인스턴스는 Heap 메모리 상에 저장된다. 
    • String Constant Pool은 프로그램 상에서 정의된 String 값들이 저장되는 Heap메모리에서의 구분되는 공간을 의미한다. 
    String str1 = "Hello";

    • String 객체Stack에 저장되며 객체의 값인 "Hello" 인스턴스는 Heap 상에서 String constant pool에 저장된다.  
    String str1 = "Hello";
    String str2 = "Hello";

    • 또다른 String 객체 str2을 선언하고 같은 값을 할당하면 Stack상에 str2에 대한 객체가 저장된다. 
    • 하지만 str2에 대응하는 값인 "Hello" 인스턴스를 Heap 상에 새로 생성하지 않고 기존의 "Hello"를 재사용한다.
    • String Constant Pool은 Heap 상에 있는 작은 캐시라고 할 수 있다.
    • 자바에서는 str2 = "Hello" 처럼 값을 String 값을 직접 할당시 이 값을 String Constant Pool 내에 저장한다.
    • String Constant Pool에 String 값들을 저장하고 새로운 객체가 이미 존재하는 값은 참조하여 재사용하게 한다.
    • 이미 존재하는 값은 재사용하는 방식을 통해 메모리 사용을 절약할 수 있다. -> String Constant Pool 존재 이유
    String str1 = "Hello";
    String str2 = "Hello";
    String str3 = "Class";

    • 물론 "Class"처럼 새로운 인스턴스를 값으로 하는 경우 String Constant Pool에 이 인스턴스를 저장한다. 
    String str1 = new String("John");
    String str2 = new String("Doe");

    • "new" 키워드를 사용하여 인스턴스를 생성할시 String Constant Pool 밖의 Heap에 값을 저장한다. 
    • 즉 해당 값들은 캐시 하지 않기 때문에 이전에 동일한 값의 사용여부와 관련 없이 항상 새로운 인스턴스를 생성해 저장한다. 

     

    결론 

    • case 1의 경우에는 직접 할당 형식을 취하였기 때문에 s1에 해당하는 값인 인스턴스가 String Constant Pool에 저장되었다. 
    • 두번째 s2가 선언될 때 한번 사용된 값이므로 이 값이 String Constant Pool에 캐시되어 있고 s2는 이 값을 똑같이 참조한다.
    String s1 = "abc";
    String s2 = "abc";

    • case2의 경우에는 "new" 키워드를 사용하여 인스턴스를 생성하였으므로 String Constant Pool 밖의 Heap에 저장된다.
    • 따라서 동일한 값이더라도 캐시되지 않았기 때문에 s2는 새로운 인스턴스를 생성하여 이를 참조한다. 
    String s1 = new String("abc");
    String s2 = new String("abc");

    • "=="는 값의 형태가 아닌 값의 위치가 동일한지 즉 동일한 인스턴스를 참조하는지를 판단하므로
    • case 1의 경우에는 각 객체들이 String Constant Pool의 인스턴스를 공유하며 참조하기 때문에 true이다. 
    • case 2의 경우에는 각 객체들이 별도의 인스턴스를 참조하고 있기 때문에 false이다. 

     

    ★출처

     

    String Constant Pool in Java - GeeksforGeeks

    A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

    www.geeksforgeeks.org


    'Programming🧑‍💻 > Java' 카테고리의 다른 글

    [JAVA] NPE : 널포인트 Exception  (0) 2023.03.16
    [JAVA] 컴퓨터와 자바 메모리에 대한 이해  (0) 2023.03.07
    [JAVA] final  (0) 2022.10.25
    [JAVA] static  (0) 2022.10.21
    [JAVA] Enums  (0) 2022.10.08

    댓글

Designed by Tistory.