Post

[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 는 값을 복사함 → ab 는 완전히 별개

참조형은 참조값 복사 (공유 발생)

1
2
3
4
Address a = new Address("서울");
Address b = a;
b.setValue("부산"); // 사이드 이펙트 발생
System.out.println(a); // 부산
  • ab 가 같은 객체를 참조 → 하나 변경 시 사이드 이펙트 발생

사이드 이펙트란?

  • 의도하지 않은 값 변경 효과
  • 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);
}
  • 기존 객체는 유지
  • 새 객체에 결과 저장 → 함수형 스타일

  • 참조형은 공유되기 때문에 사이드 이펙트 주의
  • 불변 객체는 공유돼도 안전 → 값을 변경할 수 없기 때문
  • 자바 기본 클래스(StringIntegerLocalDate) 대부분 불변 객체
  • 불변 객체는 안정성, 멀티스레드, 캐시, 값 타입 등에서 유용

출처: 김영한의 실전 자바 - 중급 1편

This post is licensed under CC BY 4.0 by the author.

Trending Tags