728x90
1. String 불변객체 (Immutable Object)
- 불변(Immutable): 한 번 생성된 객체의 상태(값)가 변경되지 않는 객체
- Java String 클래스가 대표적인 불변객체
특징
- String 객체는 한 번 생성되면 내부에 저장된 문자(char 배열)가 바뀌지 않음
- 문자열을 변경하는 연산(예: concat, replace 등)을 하면 실제로는 새로운 String 객체가 만들어짐
- 불변성 때문에 여러 스레드에서 안전하게 공유 가능(스레드 안정성)
- 메모리 관리와 최적화에 유리 (String Pool 활용)
예시
String s1 = "hello";
String s2 = s1.concat(" world"); // 새로운 객체 생성, s1은 변경되지 않음
2. String 가변객체 (Mutable Object)
- 가변(Mutable): 객체 생성 후 내부 상태를 변경할 수 있는 객체
- Java에서는 대표적으로 StringBuilder, StringBuffer가 있음
특징
- 문자열을 변경할 때 새로운 객체를 생성하지 않고 내부 버퍼를 직접 수정
- 성능상 이점 (특히 문자열을 자주 수정할 때)
- StringBuffer는 동기화(Synchronized) 지원해서 멀티스레드 환경에 안전
- StringBuilder는 동기화 안 해서 단일 스레드 환경에서 더 빠름
예시
StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 기존 객체 내부가 변경됨
요약 표
| 구분 | 불변 객체(Immutable) | 가변 객체(Mutable) |
| 대표 클래스 | String | StringBuilder, StringBuffer |
| 상태 변경 시 | 새로운 객체 생성 | 기존 객체 내부 변경 |
| 멀티스레드 안정성 | 기본적으로 안전 | StringBuffer는 안전, StringBuilder는 비안전 |
| 성능 | 변경 많으면 비효율적 | 문자열 변경 작업에 효율적 |
String 불변객체와 힙(Heap) 영역 관련 핵심 정리
- String 객체는 힙 영역에 저장된다.
실제로 String 객체는 힙(heap) 영역에 생성되고, 내부에는 문자(char 배열)가 저장돼 있어. - 불변객체라서 ‘내부 문자 배열’이 바뀌지 않는다.
즉, 생성된 String 객체의 문자 배열은 바뀌지 않고 그대로 유지돼. - 참조 변수는 힙에 있는 String 객체의 주소값(참조값)을 가진다.
예를 들어,여기서 s는 스택(stack)에 저장된 참조 변수이고, 실제 문자열 "hello"는 힙 영역에 저장된 String 객체 내부에 있다.
String s = "hello";
- 새로운 문자열 연산이 일어나면 기존 문자열을 변경하는 게 아니라, 새로운 힙 영역에 다른 String 객체가 만들어지고 참조 변수가 새 객체를 가리킨다.이때는 새로운 String 객체가 힙에 생성되고, s는 새 객체를 참조하게 됨.
s = s + " world";
핵심
- 불변객체는 기존 힙 영역의 값을 직접 변경하지 않고
- 참조 변수는 힙 영역에 저장된 객체(문자열 데이터)의 주소를 가리키는 것 뿐임.
728x90
'Java & Spring > Java' 카테고리의 다른 글
| Java 컬렉션 프레임워크인가 아닌가..? (1) | 2025.01.21 |
|---|---|
| Java Stream(스트림) (0) | 2025.01.21 |
| Java 컬렉션 프레임워크란? (1) | 2025.01.19 |
| 객체지향 프로그래밍 7장(30강 ~ 35강) (0) | 2022.06.07 |
| 객체지향 프로그래밍 7장(25강 ~ 29강) (0) | 2022.06.06 |