index

두 방식의 근본적인 차이는 저장되는 저장공간의 차이

리터럴(Literal) 생성

  • 리터럴(Literal)을 사용하는 경우에는 String constant pool이라는 영역에 생성

    • String constant pool의 위치는 자바 7부터 Perm 영역 ➡️Heap 영역으로 옮겨짐

  • 만약 같은 값을 새로 생성할 때 String constant pool에 이미 존재한다면 생성되는 객체는 이미 존재하고 있는 값을 참조

  • 특히, String의 불변성(Immutable)은 문자열 비교와 같은 연산의 안정성을 위해 Literal 방식을 사용하는것을 추천

String의 불변성이란?

자바에서 String은 불변 객체(immutable)라고 한다. 즉, 객체 생성 이후 내부의 상태가 변하지 않는 객체라는 뜻

String str = "CSI";
str = "CSI2";

str 이라는 String 객체가 생성된 이후 "CSI"를 "CSI2" 로 바꾼다고 해도 실제 내부적으로는 최초 생성된 String 객체의 값이 변경되는 것이 아니라 새로운 String 객체가 생성, 그 참조가 str 변수에 할당된 것 즉, 불변성이란 문자열을 재할당할 때 해당 문자열을 참조하는 객체를 수정하는 것이 아니라 새 문자열을 만들고, 변경된 문자열을 할당한다는 것

new String() 생성

  • new 연산자를 사용하여 String을 생성하게 되면 객체로 생성이 되어 Heap메모리 영역에 저장

  • new 연산자로 생성한 String 객체는 같은 값이 String pool에 존재하더라도, Heap 영역에 별도로 객체를 생성

아래 예시를 통해 살펴보자.

String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";

위의 코드에 의해 생성되는 객체는 아래 그림과 같이 생성된다.

생성예시 이미지

리터럴(Literal)로 생성한 str2str3은 동일한 객체를 바라보지만, new String()으로 생성한 str1은 다른 메모리 주소의 객체를 바라봄

참고 문헌 1arrow-up-right 참고 문헌 2arrow-up-right 참고 문헌 3arrow-up-right

Last updated