9osari.log
← 목록으로

[JAVA] 불변 객체

2025년 5월 1일 · #java#김영한-java-중급

자바 데이터 타입 분류


기본형은 값 복사

int a = 10;
int b = a;
b = 20;
System.out.println(a); // 10

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

//참조형 변수는 하나의 인스턴스를 공유한다.
//즉, 참조형 변수는 같은 참조값(x001)을 통해 같은 인스턴스를 참조
Address a = new Address("서울"); //새로운 객체 참조
Address b = a;  //참조값(x001) 복사해 전달 (참조값의 공유를 막을 방법 X)

System.out.println("a = " + a);
System.out.println("b = " + b);

System.out.println("b 를 부산으로 변경");
b.setValue("부산");
System.out.println("a = " + a); //사이드 이펙트 발생 -> 특정부분 변경이 예기치 않게 다른 부분에 영향을 줌 (나는 b만 바꾸고 싶었는데?)
System.out.println("b = " + b);

//참조형 변수는 참조값을 통해 같은 객체(인스턴스)를 공유

사이드 이펙트란?


해결 1: 객체 공유 안 하기

Address a = new Address("서울");
Address b = new Address("서울");
//a와 b가 서로다른 인스턴스 참조

객체 공유를 막을 수 없는 이유

Address a = new Address("서울");
Address b = a; // 정상 문법, 막을 방법 없음

해결 2: 불변 객체로 설계

//불변 객체 예제 (불변 클래스)
public class ImmutableAddress {
  private final String value; //final로 선언해 내부 값 변경 불가능

  public ImmutableAddress(String value) {
    this.value = value;
  }

  public String getValue() {
    return value;
  }

  @Override
  public String toString() {
    return "ImmutableAddress{" +
      "value='" + value + '\'' +
      '}';
  }
}

불변 객체 사용 시

ImmutableAddress a = new ImmutableAddress("서울");
ImmutableAddress b = a; //참조값 대입을 막을 수 없다
System.out.println("a = " + a);
System.out.println("b = " + b);

System.out.println("b -> 부산");
//b.setValue("부산"); //컴파일 오류 발생 setValue 없어 변경 불가
b = new ImmutableAddress("부산"); //신규 생성
System.out.println("a = " + a);
System.out.println("b = " + b);

//final로 단순한 제약을 만들어 사이드 이펙트라는 큰 문제를 막음
//불변객체의 값을 변경하고 싶으면 새로운 불변객체 생성

가변 객체 vs 불변 객체

구분가변 객체 (Address)불변 객체 (ImmutableAddress)
값 변경 가능✅ setValue() 있음❌ 없음
사이드 이펙트 발생 가능성높음없음
공유 참조 안전성낮음높음

불변 객체 활용 예

//불변 객체는 값을 변경하면 안됨, 기존 값에 새로운 값을 더해야 함
public ImmutableObj add(int addValue) {
  return new ImmutableObj(value + addValue);  //객체는 기존값을 변경하지 않고 계산값을 새로운 객체로 만들어 반환
}

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

···
← PREV [JAVA] Object 클래스 NEXT → [JAVA] String 클래스