본문 바로가기

개발일지/TIL

[230706] String Constant Pool?

String 생성

🎈상수 할당을 통한 생성
     - String name = "jeong";  
🎈생성자를 통한 생성
     - String name = new String("jeong");

String 저장되는 곳이 다름

💬 상수 할당을 통해서 String을 생성할 경우 String Constant Pool에 상수 값을 만들고 그 주소값을 사용합니다. 이후에 같은 값을 똑같이 할당할 경우 기존에 String Constant Pool에 만든 값을 사용합니다.

💬 생성자를 통해서 String을 생성할 경우 Heap 영역에 값을 저장하고 그 주소값을 사용합니다. 이후에 같은 값으로 생성자를 호출하더라도 Heap에 객체가 새롭게 하나 만들어집니다. 

실제 코드 테스트

public void stringPoolTest(){
    String str_one = "Apple";
    String str_two = "Apple";

    String str_three = new String("Apple");
    String str_four = new String("Apple");

    System.out.println("str_one == str_two : " + (str_one == str_two));
    System.out.println("str_one == str_three : " + (str_one == str_three));
    System.out.println("str_one == str_four : " + (str_one == str_four));
    System.out.println("str_three == str_four : " + (str_three == str_four));
}

 

✔ 결과

 

Intern 메서드

💬 Intern 메서드의 경우 먼저 문자열이 String Constant Pool에 있는지 확인합니다. 있는 경우 해당 주소값을 반환해 줍니다. 없는 경우에는 새로 하나 만들어서 해당 주소값을 반환해 줍니다.

 

public void stringPoolTest(){
    String str_one = "Apple";
    String str_two = "Apple";

    String str_three = new String("Apple");
    String str_four = str_three.intern();

    System.out.println("str_one == str_two : " + (str_one == str_two));
    System.out.println("str_one == str_three : " + (str_one == str_three));
    System.out.println("str_one == str_four : " + (str_one == str_four));
    System.out.println("str_three == str_four : " + (str_three == str_four));
}

 

✔ 결과

 

의문

❓String Pool Constant가 있고 문자열 할당을 통해서 생성을 하거나 Intern 메서드를 쓰면 그곳에 값이 들어간다는 것은 알겠는데, 언제 사용하는 것이 좋을까? 
💬 평소에도 String Pool Constant를 몰랐지만 그 방식으로 잘 사용했던 것 같다. String 생성자를 쓰는 일이 드물었기 때문이다. 공간을 절약할 수 있기 때문에 일반적으로 사용하는 것이 좋아 보인다. 그리고 Intern의 경우는 외부에서 받아온 String 값이 자주 쓰인다면 사용해 볼 수 있을 것 같다.

생각

문자열은 쉽게 접할 수 있는 타입이었다. 그러다 보니 만드는 방식에 따라 처리하는 방식이 다른다는 것을 미처 생각하지 못했던 것 같다. 이번 기회를 통해서 아무런 생각 없이 썼던 기본적인 것도 돌아봐야겠다는 생각을 하게 되었다.