String과 불변성
Java에서 String은 immutable, 즉 불변 객체이다. 불변(immutable)하다는 것은 문자열이 일단 생성되면 그 값이 고정되어 있으며, 변경되더라도 원래의 문자열 내용이 변경되는 것이 아닌 새로운 문자열 객체가 생성됨을 의미한다.
예를 들어,
String str1 = "Hello";
String str2 = str1;
str1 = str1 + " World";
위 코드에서는 "Hello"라는 문자열이 먼저 생성되고, 변수 str1과 str2가 이 문자열을 참조한다. 그리고 str1에 " World"를 추가한 새로운 문자열을 할당한다.
하지만 문자열은 변경할 수 없으므로, 실제로는 새로운 문자열이 생성되고 str1은 이 새로운 문자열을 참조하게 된다. str2는 여전히 "Hello"라는 원래의 문자열을 참조하고 있다. 원래의 문자열은 변경되지 않고 그대로 유지된다.
❗이러한 String의 불변성은 문자열 풀(String Pool)로 인해 이뤄질 수 있다.❗
String Pool
- 문자열 리터럴(String literal)이 저장되는 공간으로, 자바의 Heap 메모리 내에 위치한다.
- 문자열 상수 풀(String Constant Pool) 또는 문자열 인턴 풀(String Intern Pool)로도 불린다.
- 문자열 리터럴이 생성될 때마다 JVM은 새로운 문자열 객체를 생성하기 전에 먼저 String Pool을 확인한다.
- 이미 String Pool에 새로운 문자열이 존재할 경우 새로운 String 객체를 생성하지 않고, 이미 존재하는 문자열 참조를 변수에 할당한다.
new String()
- new 키워드를 사용하여 새로운 문자열을 생성할 경우 String Pool 외부에 있는 자바 힙 메모리에 메모리가 할당된다.
- 이러한 방식으로 생성된 문자열 객체들은 String Pool과는 독립적으로 메모리를 사용하며, String Pool 내에 동일한 값을 가진 문자열 리터럴과는 다른 객체이다.
이점
- String Pool을 통해 문자열의 캐싱과 재사용이 가능해지므로, 문자열을 자주 생성하고 변경하는 경우에도 효율적으로 메모리를 관리할 수 있다.
'Study' 카테고리의 다른 글
[JAVA] 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2023.10.18 |
---|---|
[Design Pattern] 디자인 패턴과 종류 (0) | 2023.06.19 |