[JAVA] 불변 객체
[JAVA] 불변 객체
자바 데이터 타입 분류
- 기본형(Primitive Type): 값을 직접 저장. 공유 X
- 참조형(Reference Type): 객체의 참조값을 저장. 공유 O
기본형은 값 복사
1
2
3
4
int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10
b = a
는 값을 복사함 →a
,b
는 완전히 별개
참조형은 참조값 복사 (공유 발생)
1
2
3
4
Address a = new Address("서울");
Address b = a;
b.setValue("부산"); // 사이드 이펙트 발생
System.out.println(a); // 부산
a
,b
가 같은 객체를 참조 → 하나 변경 시 사이드 이펙트 발생
사이드 이펙트란?
- 의도하지 않은 값 변경 효과
b
만 바꾸려 했는데a
도 바뀜 → 디버깅 어려움
해결 1: 객체 공유 안 하기
1
2
Address a = new Address("서울");
Address b = new Address("서울");
- 완전히 다른 객체 → 공유 안 됨
- 하지만 공유 방지 강제할 방법 없음
객체 공유를 막을 수 없는 이유
1
2
Address a = new Address("서울");
Address b = a; // 정상 문법, 막을 방법 없음
- 참조값은 언제든 다른 변수에 복사 가능
- 공유 자체는 막을 수 없음 → “값 변경”을 막는 게 핵심
해결 2: 불변 객체로 설계
1
2
3
4
5
6
7
8
9
10
11
public class ImmutableAddress {
private final String value;
public ImmutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
- 값 변경 메서드 제거 (
setValue()
없음) value
필드는final
- 변경이 필요하면 새 객체 생성
불변 객체 사용 시
1
2
3
4
5
6
ImmutableAddress a = new ImmutableAddress("서울");
ImmutableAddress b = a;
b = new ImmutableAddress("부산");
System.out.println(a); // 서울
System.out.println(b); // 부산
- 공유는 되지만 값은 절대 안 바뀜
- 사이드 이펙트 완전 차단
가변 객체 vs 불변 객체
구분 | 가변 객체 (Address ) |
불변 객체 (ImmutableAddress ) |
---|---|---|
값 변경 가능 | ✅ setValue() 있음 |
❌ 없음 |
사이드 이펙트 발생 가능성 | 높음 | 없음 |
공유 참조 안전성 | 낮음 | 높음 |
불변 객체 활용 예
1
2
3
public ImmutableObj add(int value) {
return new ImmutableObj(this.value + value);
}
- 기존 객체는 유지
- 새 객체에 결과 저장 → 함수형 스타일
- 참조형은 공유되기 때문에 사이드 이펙트 주의
- 불변 객체는 공유돼도 안전 → 값을 변경할 수 없기 때문
- 자바 기본 클래스(
String
,Integer
,LocalDate
) 대부분 불변 객체 - 불변 객체는 안정성, 멀티스레드, 캐시, 값 타입 등에서 유용
This post is licensed under
CC BY 4.0
by the author.