Java, Immutable - 불변 객체 값 변경하기

앞 글에서 불변 객체의 값은 변경할 수 없다고 하였다. 하지만 개발 요청 사항이 복잡해질수록 불변 객체 변경되어야 하는 상황이 발생하는데, 이럴 때 어떻게 값 수정할지 살펴본다.

새로운 클래스로 멤버 필드가 숫자로 주어지고, 더할 수 있는 메소드가 제공한 경우 사용 예시를 살펴본다.

MutableObj.java

public class MutableObj {

    private int value;

    public MutableObj(int value) {
        this.value = value;
    }

    public void add(int value) {
        this.value += value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

MutableMain.java

public class MutableMain {
    public static void main(String[] args) {
        MutableObj obj = new MutableObj(10);
        obj.add(33);
        System.out.println("obj의 value 값: " + obj.getValue());
    }
}

출력결과

obj의 value 값: 43

메인함수를 살펴보면 생성자를 통해 초기 value 값을 10 이 주어졌다.
그리고 add 메소드를 통해 33 값을 더한 후 기존에 있던 value 변수 10 값을 제거한 다음 합한 43 값이 할당이 된다.

여기서 value 변수 10 값이 제거되고 재할당이 일어난다는 것을 살펴볼 수 있는데, 그렇다면 MutableObj 객체를 불변 객체로 만든다면 이 메인 함수는 실행되지 않을 것이다.


불변 객체로 값 수정하는 함수

새로운 클래스로 Immutable 이름으로 불변 객체를 만들어 주도록 한다. 그리고 불변 객체의 값 수정 필요 시 ImmutableObj 핵심 메소드로 add 반환 타입을 주어지고 새롭게 반환되어야 한다.

ImmutableObj.java

public class ImmutableObj {

    private int value;

    public ImmutableObj(int value) {
        this.value = value;
    }

    public ImmutableObj add(int value) {
        int result = this.value + value;
        return new ImmutableObj(result);
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

ImmutableMain.java

public class ImmutableMain {
    public static void main(String[] args) {
        ImmutableObj obj1 = new ImmutableObj(10);
        ImmutableObj obj2 = obj1.add(33);

        System.out.println("obj1의 value 값: " + obj1.getValue());
        System.out.println("obj2의 value 값: " + obj2.getValue());
    }
}

출력결과

obj1의 value 값: 10
obj2의 value 값: 43

불변 객체의 값 변경이 필요한 경우 수식을 계산한 다음 새로운 객체로 할당한다.