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 값이 자주 쓰인다면 사용해 볼 수 있을 것 같다.
생각
문자열은 쉽게 접할 수 있는 타입이었다. 그러다 보니 만드는 방식에 따라 처리하는 방식이 다른다는 것을 미처 생각하지 못했던 것 같다. 이번 기회를 통해서 아무런 생각 없이 썼던 기본적인 것도 돌아봐야겠다는 생각을 하게 되었다.
'개발일지 > TIL' 카테고리의 다른 글
[230708] Json 변환시 Entity 순환 참조 문제 (0) | 2023.07.08 |
---|---|
[230707] Git add할 때 CRSL 관련 에러 (0) | 2023.07.07 |
[230705] 미니 프로젝트(230628) 코드 피드백 및 적용 (0) | 2023.07.05 |
[230704] 즉시 로딩과 지연 로딩? (0) | 2023.07.04 |
[230703] JavaServlet에 대해 이해하기 (0) | 2023.07.03 |