자주 사용하는 String 얼마나 알고있는 걸까?
Java 공부를 시작했을때 객체의 생성 원리를 배웠던 적이 있다.
몇 년이 지난 오늘 다시 한번 정리하는 시간을 갖는다.
이름에서 알 수 있듯이 java의 String Pool 은 Java Heap Memory에 저장된 String의 pool이다.
기본적으로 String 클래스는 자바에서 제공하는 클래스로 new 연산자와 "" 큰따옴표를 이용해 객체를 만들 수 있다.
JAVA의 String Pool
다음은 JAVA heap 공간에서 문자열이 유지되는 방법과 문자열을 작성하기 위해 다른 방법을 사용할때
발생하는 상황들을 명확하게 설명하는 다이어그램이다.
큰따옴표로 만들어진 문자열을 생성할때 JVM은 가장 먼저 String Pool에 같은 값이 있는 문자열이 있는지 확인한다.
있다면 해당 문자열의 레퍼런스를 리턴하고 만약 없다면 새로운 문자열을 등록한다.
반면에, new 연산자를 사용하는 경우
String 클래스가 힙공간에 새로운 String 객체를 만들도록 한다.
package com.journaldev.util;
public class StringPool {
/**
* Java String Pool example
* @param args
*/
public static void main(String[] args) {
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.println("s1 == s2 :"+(s1==s2));
System.out.println("s1 == s3 :"+(s1==s3));
}
// return
// s1 == s2 :true
// s1 == s3 :false
}
다음과 같이 정의하는 경우 String Pool 에서 몇 개의 문자열이 생성될까?
Java 인터뷰에서 String pool에 관한 질문을 받게됩니다. 예를 들어, 아래 명령문에서 몇 개의 문자열이 작성되는지;
String str = new String("Cat");
몇개가 생성되는지에 대한 의견은 대부분 1개 또는 2개였다.
댓글을 읽어보니 이런 의견이 나오는건 버전의 차이 때문인것 같았다.
아래의 테스트를 진행해보니
결론적으론 나는 1개가 생성된다고 생각한다.
public static void main(String[] args) {
String a = "aaa";
String b = "aaa";
String c = new String("aaa");
String d = new String("aaa");
System.out.println(a == b); //true
System.out.println(a == c); //false
System.out.println(c == d); //false
System.out.println(a.equals(b)); //true
System.out.println(a.equals(c)); //true
System.out.println(c.equals(d)); //true
// intern() 메소드는 String Pool에 문자열을 확인 후 있다면 번환
// 아닌경우는 문자열을 풀에 등록하고 해당 문자열을 반환한다.
String s1 = "Genie";
String s2 = "Genie";
String s3 = new String("Genie");
String s4 = new String("Genie").intern();
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s1 == s4); // true
}
String만 파보아도 이렇게 재미난 이야기들이 있다.. ㅎ
내용에 오류가 있다면 댓글로 알려주시면 감사하겠습니다^^
참고
'Java' 카테고리의 다른 글
JAVA ) 직접 경험한 경력직 기술 면접 질문 모음 (0) | 2020.07.20 |
---|---|
JAVA 언어의 장단점 (0) | 2020.07.13 |
JVM 그것이 알고싶다. (0) | 2020.07.12 |
Java Collection 총 정리~~~!! (0) | 2020.07.12 |
JAVA 설치 및 환경설정! (0) | 2020.07.09 |