불변객체 - 예제

SungMin·2026년 5월 23일

자바 심화 정리

목록 보기
9/34
package lang.imutable.address;

public class MemberV1 {
    private String name;
    private Address address;

    public MemberV1(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "MemberV1{" +
                "name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}
package lang.imutable.address;

public class MemberMainV1 {
    public static void main(String[] args) {
        Address address = new Address("서울");
        MemberV1 memberA = new MemberV1("회원A", address);
        MemberV1 memberB = new MemberV1("회원B", address);

        // 회원A, 회원B 처음 주소는 모두 서울
        System.out.println("memberA = " + memberA);
        System.out.println("memberB = " + memberB);

        // 회원B의       주소를 부산으로 변경
        memberB.getAddress().setValue("부산");
        System.out.println("부산 -> memberB.address");
        System.out.println("memberA = " + memberA);
        System.out.println("memberB = " + memberB);
    }
}

사이드 이펙트가 발생해서 B의 주소를 변경할 시에, A의 주소도 같이 변경된다.


불변 클래스 사용

package lang.imutable.address;

public class MemberV2 {
    private String name;
    private ImutableAddress address;

    public MemberV2(String name, ImutableAddress address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ImutableAddress getAddress() {
        return address;
    }

    public void setAddress(ImutableAddress address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "MemberV2{" +
                "name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

변경이 불가능한 Immutable 클래스를 사용하고 있다.

package lang.imutable.address;

public class MemberMainV2 {
    public static void main(String[] args) {
        ImutableAddress address = new ImutableAddress("서울");
        MemberV2 memberA = new MemberV2("회원A", address);
        MemberV2 memberB = new MemberV2("회원B", address);

        // 회원A, 회원B 처음 주소는 모두 서울
        System.out.println("memberA = " + memberA);
        System.out.println("memberB = " + memberB);

        // 회원B의 주소를 부산으로 변경
        // memberB.getAddress().setValue("부산");

        memberB.setAddress(new ImutableAddress("부산"));
        System.out.println("부산 -> memberB.address");
        System.out.println("memberA = " + memberA);
        System.out.println("memberB = " + memberB);
    }
}

회원 B의 주소를 변경하려고 한다.
하지만, ImmutableAddress는 값을 변경할 수 있는 메서드가 없다.
따라서 새로운 Address 객체를 생성해서 참조해야 한다.


[정리]

  • 가변 객체는 공유 상태에서 값 변경 시 사이드 이펙트가 발생할 수 있다.
  • 불변 객체는 생성 이후 값을 변경할 수 없다.
  • 값을 변경하려면 새로운 객체를 생성해야 한다.
  • 불변 객체를 사용하면 공유로 인한 사이드 이펙트를 방지할 수 있다.
profile
오늘도 한 걸음씩 나아가

0개의 댓글