String literal ("") 과 new String("") 차이

김운채·2023년 5월 2일
0

Java

목록 보기
5/11

1. String literal

'A'와 같이 작은 따옴표로 문자 하나를 감싼 것을 '문자 리터럴'이라고 한다. 두문자 이상은 큰따옴표로 감싸야 하며, '문자열 리터럴'이라고 한다.

이 경우, Java Virtual Machine (JVM) 내부의 String Constant Pool이라는 메모리 영역에 저장된다. String Constant Pool은 JVM의 메모리 구조 중의 하나로, 문자열 리터럴이 중복되지 않도록 하고(가변성(immutable)이 허용되지 않음), 문자열에 대한 빠른 참조를 가능하게 한다.

이후 같은 문자열 리터럴이 사용될 경우, 자바는 String Pool에서 이미 존재하는 값을 재사용하여 객체를 생성힌다. 이러한 문자열은 수정할 수 없으며, 변경할 경우 새로운 객체를 생성한다.

String str1 = "Hello";
String str2 = "Hello";

만약 위와 같이 두개의 string 을 선언하면 JVM은 "Hello"라는 문자열 리터럴을 String Constant Pool에 저장하고, str1과 str2가 동시에 "Hello"를 가리킨다.

2. new String("")

new String()은 새로운 문자열 객체를 생성하는 방법이다. 이 경우, 문자열이 Heap 메모리에 저장된다. new String()을 사용하여 문자열을 생성하면 문자열의 값이 같더라도 서로 다른 객체를 참조한다. 또한, 이러한 문자열은 변경할 수 있다.

String strHeap1 = new String("Hello");
String strHeap2 = new String("Hello");

위와 같이 new 연산자를 사용하여 String 객체를 생성하면, 해당 객체는 Heap 메모리 영역에 생성된다. 이때, strHeap1은 String Constant Pool이 아닌 Heap 메모리 영역에 생성된 객체를 가리키게 된다.

👉따라서, String literal은 문자열을 읽기 전용으로 사용하며, new String()은 동적으로 문자열을 생성하고 변경할 때 사용한다.

String literal은 JVM의 메모리 영역 중 하나인 constant pool에 저장되고, new String()은 Heap 메모리에 저장된다.

0개의 댓글