String 리터럴과 new String("")
의 차이점에 대해 알아보겠습니다.
Java에서 String 리터럴 (예: "Hello")은 String Pool
이라는 특별한 영역에 저장됩니다. 이 영역은 JVM의 힙 영역
에 위치해 있습니다. String 리터럴을 사용하면, JVM은 먼저 String Pool에서 같은 내용의 문자열이 있는지 확인합니다. 만약 동일한 문자열이 있다면, 그 참조를 재사용하고, 없다면 새로운 문자열을 String Pool에 생성합니다.
String Pool
이라는 특별한 영역에 저장됩니다.String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true
String Pool은 Java 가상 머신(JVM)의 힙 영역에 위치한 특수 메모리 영역
입니다.
이 영역은 특히 String 리터럴과 interned String 객체를 저장하고 관리하는데 사용됩니다.
new
키워드를 사용하여 생성된 String 객체는 일반 힙 영역에 생성되지만, 이 객체의 문자열은 String Pool에 저장됩니다. 이 경우, new
를 사용하여 강제로 새 객체를 생성하면, 새로운 참조가 생성되지만, 그 내부의 문자열 데이터는 여전히 String Pool에서 관리되는 데이터를 사용합니다.
intern()
메서드를 사용하면 일반 힙 영역에 있는 String 객체를 String Pool에 저장할 수 있습니다. 이 메서드는 호출하는 String 객체의 값과 동일한 String이 String Pool에 있는지 확인하고, 있으면 그 참조를 반환하며, 없으면 String Pool에 String을 추가합니다.메모리 사용량을 줄이고 성능을 향상
시키는데 도움이 됩니다.new String("")
을 사용하면, 새로운 String 객체가 힙 메모리에 생성
됩니다. 이 경우에는 String Pool을 사용하지 않고, 각각의 new String("")
이 항상 새로운 객체를 만듭니다.
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // false
위 예제에서 str1
과 str2
는 내용은 같지만, 서로 다른 메모리 위치에 있기 때문에 ==
연산자로 비교하면 false
가 출력됩니다. equals()
메서드를 사용하면 내용을 비교하기 때문에 true
를 반환합니다.