본문 바로가기
☕️자바 𝗝𝗔𝗩𝗔

String 과 String Pool

by 비타민찌 2022. 11. 4.
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

댓글