🔎 개요
Java에서 불변 객체(Immutable Object)는 한 번 생성되면 상태(state)가 변하지 않는 객체를 말합니다.
대표적으로 String, Integer, LocalDate 등 많은 표준 클래스들이 불변 객체로 설계되어 있습니다.
🧩 내용
✅ 불변 객체의 특징
- 객체의 모든 필드는 final로 선언
- 생성자에서만 값을 설정하고 이후에는 변경 불가
- Setter가 존재하지 않음
- 외부에서 내부 상태를 변경할 수 없도록 방어적 복사(Defensive Copy) 사용
✅ 왜 불변 객체를 사용할까?
- 안정성(Thread-Safety)
멀티스레드 환경에서 동시에 접근해도 안전합니다. 객체의 상태가 바뀌지 않으니 동기화 코드를 줄일 수 있습니다. - 예측 가능하고 디버깅 쉬움
값이 변하지 않기 때문에 프로그램 흐름을 추적하기 더 쉽습니다. - 함수형 프로그래밍에 적합
상태를 공유하지 않기 때문에 순수함수를 작성하는 데 유리합니다.
✅ 대표적인 불변 객체 예시
public final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter만 존재 (Setter 없음)
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
- 위 클래스는 final 필드와 생성자만으로 값을 초기화하며, 이후 값 변경이 불가능합니다.
✅ String은 왜 불변일까?
String a = "hello";
String b = a;
a = "world";
System.out.println(b); // hello
- a를 "world"로 바꿔도 b는 여전히 "hello"를 유지합니다.
- 이유: String은 내부적으로 final char[] 배열을 가지고 있어 값을 바꾸는 것이 아니라 새로운 객체를 생성합니다.
🧾 정리
개념 | 한 번 만들어지면 내부 상태가 바뀌지 않는 객체 |
장점 | 쓰레드 안정성, 예측 가능, 디버깅 쉬움 |
예시 | String, Integer, LocalDate, 커스텀 클래스 |
주의 | 가변 객체를 필드로 가질 경우, 방어적 복사를 통해 불변성 유지 필요 |
💬 덧붙임
불변 객체는 성능상 약간의 비용(불변 객체는 한 번 생성되면 내부 상태를 바꿀 수 없기 때문에, 값이 바뀌어야 할 경우 기존 객체를 수정하는 대신 새로운 객체를 만들어야 합니다.)이 들 수 있지만, 복잡한 시스템의 안정성을 높이고, 유지보수를 쉽게 만들어주는 핵심 설계 요소입니다.
특히 멀티스레드 환경이나 함수형 스타일 코딩을 추구한다면 적극적으로 사용하는 걸 추천드립니다.
'개발메모 > 간단정리' 카테고리의 다른 글
[간단정리] Java에서 Stack, Queue 그리고 Deque (1) | 2025.03.29 |
---|---|
[간단정리] RDBMS, NoSQL 특징 및 차이점 (1) | 2024.08.06 |
[간단정리] 객체 지향 프로그래밍 SOLID 원칙 (0) | 2024.07.19 |
[간단정리] {JSON}, <XML> 이란? (0) | 2024.07.18 |
[간단정리] 메세지 큐(Message Queue)란? (1) | 2024.07.13 |