☕️자바 𝗝𝗔𝗩𝗔

String 과 String Pool

비타민찌 2022. 11. 4. 12:35
728x90

String은 Java 에서 제공하는 특별한 자료형이다.

Java에서 String 객체를 생성하는 방법은 2가지가 있는데

첫번째는 String literal (큰 따옴표""를 사용하는 것),

두번째는 new 연산자를 사용하는 것이다. 두 방법에는 어떤 차이가 있을까?

public class Main {
    public static void main(String[] args) {
    
        String s1 = "example";
        String s2 = "example";

        String ss1 = new String("example");
        String ss2 = new String("example");

        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        
        System.out.println(ss1 == ss2);
        System.out.println(ss1.equals(ss2));
    }
}

[결과]
true
true,
false,
true

 

String literal로 생성한 객체는 내용이 같다면 같은 객체, 즉 동일한 메모리 주소를 가리키고 있다. 하지만 new 연산자로 생성한 String 객체는 내용이 같더라도 개별적인 객체임을 알 수 있다.

 

Java String Pool

String literal로 생성하면 해당 String 값은 Heap 영역 내 "String Constant Pool"에 저장되어 재사용되지만, new 연산자로 생성하면 같은 내용이라도 여러 개의 객체가 각각 Heap 영역을 차지한다는 차이가 있다.

String literal로 생성한 객체는 String Pool에 들어간다.

String literal로 생성한 객체의 값 s1이 이미 String Pool에 존재한다면 해당 객체는 String Pool의 레퍼런스를 참조한다.

그래서 참조형 변수라고 하며,

s1 공간에 "example" 가 저장되는게 아니라 s1은 "example"가 저장되어 있는 메모리 주소를 가지게 된다. 

그림에서 s1과 s2가 같은 곳을 가리키고 있는 것이 이 때문이다.

new로 생성한 String 객체는 같은 값이 String Pool에 이미 존재하더라도 Heap 영역 내 별도의 객체를 가리킨다.

 

 

 

참고 : https://starkying.tistory.com/entry/what-is-java-string-pool

728x90