Java: String의 불변성 (Immutability)


1. 개요

Java의 String 클래스는 불변 객체(Immutable Object) 로 설계되어 있다.


2. 왜 불변(Immutable)한가?

불변성은 단순히 설계 철학이 아니라, 실제 Java 플랫폼의 안정성과 효율성을 위한 필수적인 요소이다.

2.1 보안(Security)

String dbUrl = "jdbc:mysql://localhost";
dbUrl.replace("localhost", "hacker-site.com");  // String은 수정되지 않음

2.2 성능(Performance)

String a = "hello";
String b = "hello";
System.out.println(a == b);  // true → 동일 객체 공유

2.3 스레드 안전성(Thread Safety)


3. 작동 방식 – 변경은 실제로 “새 객체 생성”

3.1 코드 예시

String a = "hello";
String b = a;

a = a + " world";

System.out.println(a);  // hello world
System.out.println(b);  // hello

3.2 메모리 구조 흐름

[초기 상태]
a ───▶ "hello"
b ───┘

[수정 후]
a ───▶ "hello world"
b ───▶ "hello"

📌 변경이 아닌 “대체”다. 기존 객체는 절대 바뀌지 않음!


4. 불변 객체의 특징 요약

항목

설명

변경 가능 여부

❌ 불가능 – 항상 새로운 객체 생성됨

스레드 안전성

✅ 동기화 없이 공유 가능

공유 가능 여부

✅ 문자열 리터럴 풀에서 객체 공유 가능

메모리 구조

Heap 영역 + String Constant Pool 최적화

관련 API 특징

replace()

,

concat()

등 모두 새 객체 반환


5. 관련 클래스 구분

5.1 불변 객체 (Immutable)

5.2 가변 객체 (Mutable)

📝 불변 클래스는 equals(), hashCode() 재정의에 유리하며, 객체 캐싱 및 보안 측면에서도 장점을 가짐.


6. 성능상의 주의점

6.1 반복 연결 시 성능 저하

String s = "";
for (int i = 0; i < 1000; i++) {
    s += "a";  // 매 반복마다 새 객체 생성
}

→ 이 방식은 1000개의 String 객체를 생성
→ 해결 방법: StringBuilder 사용

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append("a");
}
String result = sb.toString();

7. 결론




Revision #6
Created 20 May 2025 02:21:03 by Dain
Updated 20 May 2025 06:22:51 by Dain