이처럼 str1과 str2라는 변수 옆에 기본 자료형에서 했던 것처럼 바로 값을 넣어도 인스턴스가 생성됩니다. 물론 str3와 str4처럼 일반 클래스와 똑같이 new를 이용해도 됩니다. new를 사용하지 않으면 똑같은 문자열일 경우 같은 메모리 공간을 사용합니다. str1과 str2는 같은 문자열을 참조하게 됩니다. new를 사용하면 같은 문자열이어도 매번 메모리에 새롭게 할당됩니다. String 클래스는 다른 클래스와 다르게 new를 사용하지 않고 사용할 수 있으므로 메모리를 아끼려면 new를 사용하지 않고 사용하는 것이 좋습니다.
두 가지 방법을 이용해 String 문자열 객체를 생성했습니다. 그런데 사용하는 방법에 따라 메모리에 올라가는 방법이 달라집니다. 어떻게 다른지 더 자세히 알아보겠습니다.
방금 작성한 코드는 모두 ‘hello’라는 문자열을 생성합니다.
String str1 = "hello"; String str2 = "hello";
첫 번째 ‘hello’를 생성하면 이 ‘hello’라는 문자열은 메모리 중에 상수들을 저장하는 영역에 저장됩니다. 상수는 앞서 배웠듯이 변하지 않는 값을 말합니다. 변하지 않는다는 것을 잘 생각하면 같은 상수가 두 개 생성될 필요가 없다는 의미입니다. 그런데 첫 번째와 두 번째, 모두 ‘hello’를 생성하네요.
자, 흐름을 따라가 보겠습니다. 첫 번째 ‘hello’라는 인스턴스가 상수 영역에 하나 만들어졌고, 그 ‘hello’를 str1이 가리킵니다. 그런데 다음 줄에서 str2도 hello를 가리키라고 하네요. 그럼 일단 str2는 상수 영역에 똑같은 hello가 있는지 살펴봅니다. 있으면 새로 만들지 않고, 기존에 있는 ‘hello’를 가리킵니다. 따라서,
str1와 str2는 같은 인스턴스를 가리킨다. 같은 인스턴스를 참조한다.
이렇게 이해하고 기억하면 됩니다.