Language/Java

[Java] String과 String Pool

by Donghwan 2021. 11. 1.

String 인스턴스 생성

String은 참조 타입 자료형이지만 new 키워드 이외에 리터럴로 생성이 가능합니다. 

String str1 = "donghwan";
String str2 = new String("donghwan");

 

Heap과 String Pool

여느 참조 타입 자료구조와 같이 String도 인스턴스를 생성하게 되면 JVM Heap 영역에 메모리를 할당하고 값이 저장됩니다. 하지만 리터럴로 생성하는 경우와 new 키워드를 통해 생성할 때, 차이가 발생하게 됩니다. 리터럴로 String을 생성하게 되면 Heap 영역에 String Pool이라는 곳에 생성되고 new 키워드를 통해 생성하게 되면 Heap에 별도 메모리 영역에 생성됩니다.

String a = "aaa";
String b = "aaa";
String c = new String("aaa");
String d = new String("aaa");

위의 코드와 그 코드의 메모리 상태를 나타낸 그림입니다. String 리터럴로 생성된 데이터는 String Pool 내부의 "aaa"를 같이 참조하고 있고, new 키워드로 생성한 String은 각각의 메모리 공간을 참조하고 있는 것을 볼 수 있습니다.

리터럴로 String을 생성하는 경우는 String Pool이라는 곳에 인스턴스를 생성하게 되는데, 이 때 동일한 Value를 가지는 인스턴스는 새로 생성하지 않고 기존의 것을 공유하고 있으며 같은 것을 참조하는 특징을 가지고 있습니다. 따라서 a와 b는 동일한 객체로 판단할 수 있습니다.

하지만 new 키워드를 통해 생성된 인스턴스는 개별 공간을 가지고 있기 때문에 같은 만약 같은 Value를 가지고 있더라도 동일한 객체가 될 수는 없습니다. 하지만 Value를 비교하여 동등한 객체가 될 수 있습니다.

public static void main(String[] args) {
    String str1 = "donghwan";
    String str2 = new String("donghwan");
    
    System.out.println(System.identityHashCode(str1));
    //-> 1829164700 
    System.out.println(System.identityHashCode(str2));
    //-> 2018699554
    System.out.println(System.identityHashCode(new String("donghwan")));
    //-> 1311053135
    System.out.println(str1 == str2);
    //-> false
    System.out.println(str1 == str2.intern());
    //-> true
    System.out.println(str1.equals(str2));
    //-> true
}

 

String Interning

String에 intern이라는 메서드가 존재합니다. 이 메서드는 해당 String의 Value와 일치하는 데이터를 String Pool에서 탐색하여 반환하고 만약 찾지 못했다면 String Pool에 해당 Value를 등록하고 해당 레퍼런스를 반환하는 메서드입니다.

따라서 new 키워드로 생성된 String 인스턴스라도 intern()을 이용하면 String Pool에 있는 인스턴스로 반환이 가능합니다. 따라서 아래아 같은 사용이 가능합니다.

@Test
void stringInternTest() {
    //given
    String str1 = "donghwan";
    String str2 = new String("donghwan");

    //when

    //then
    assertEquals(false, str1 == str2);
    assertEquals(true, str1 == str2.intern());
}

 


참고자료

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 조건문  (0) 2021.11.05
[Java] Arrays 클래스  (0) 2021.11.02
[Java] String의 불변성( Immutable )  (0) 2021.11.01
[Java] 동일성과 동등성 ( == vs equals )  (0) 2021.11.01
[Java] orElse vs orElseGet  (0) 2021.10.29

댓글