[Java] String 리터럴과 new String("")의 차이점

청포도봉봉이·2024년 2월 12일
1

java

목록 보기
14/20
post-thumbnail

String 리터럴과 new String("")의 차이점에 대해 알아보겠습니다.

1. String 리터럴:

Java에서 String 리터럴 (예: "Hello")은 String Pool이라는 특별한 영역에 저장됩니다. 이 영역은 JVM의 힙 영역에 위치해 있습니다. String 리터럴을 사용하면, JVM은 먼저 String Pool에서 같은 내용의 문자열이 있는지 확인합니다. 만약 동일한 문자열이 있다면, 그 참조를 재사용하고, 없다면 새로운 문자열을 String Pool에 생성합니다.

String 리터럴도 객체인가?

  • String 리터럴 또한 객체입니다.
  • Java에서 String은 클래스입니다.
  • String 리터럴로 생성된 객체는 JVM의 String Pool이라는 특별한 영역에 저장됩니다.
    • 이 영역은 동일한 문자열에 대한 참조를 재사용하므로 메모리 사용 효율성을 향상시킵니다.

ex)

String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true

String pool 이 뭘까?

String Pool은 Java 가상 머신(JVM)의 힙 영역에 위치한 특수 메모리 영역입니다.
이 영역은 특히 String 리터럴과 interned String 객체를 저장하고 관리하는데 사용됩니다.

  • String Pool에는 문자열 리터럴이 저장됩니다.
  • String Pool은 동일한 문자열에 대한 중복을 피하기 위해 사용됩니다.
  • new 키워드를 사용하여 생성된 String 객체는 일반 힙 영역에 생성되지만, 이 객체의 문자열은 String Pool에 저장됩니다. 이 경우, new를 사용하여 강제로 새 객체를 생성하면, 새로운 참조가 생성되지만, 그 내부의 문자열 데이터는 여전히 String Pool에서 관리되는 데이터를 사용합니다.
  • intern() 메서드를 사용하면 일반 힙 영역에 있는 String 객체를 String Pool에 저장할 수 있습니다. 이 메서드는 호출하는 String 객체의 값과 동일한 String이 String Pool에 있는지 확인하고, 있으면 그 참조를 반환하며, 없으면 String Pool에 String을 추가합니다.
  • 메모리 사용량을 줄이고 성능을 향상시키는데 도움이 됩니다.
    • 동일한 문자열에 대한 여러 참조가 모두 동일한 메모리 위치를 가리키기 때문에 메모리를 효율적으로 사용할 수 있기 때문입니다.

2. new String(""):

new String("")을 사용하면, 새로운 String 객체가 힙 메모리에 생성됩니다. 이 경우에는 String Pool을 사용하지 않고, 각각의 new String("")이 항상 새로운 객체를 만듭니다.

ex)

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // false

위 예제에서 str1str2는 내용은 같지만, 서로 다른 메모리 위치에 있기 때문에 == 연산자로 비교하면 false가 출력됩니다. equals() 메서드를 사용하면 내용을 비교하기 때문에 true를 반환합니다.

profile
서버 백엔드 개발자

0개의 댓글