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
불변 객체의 값 변경이 필요한 경우 수식을 계산한 다음 새로운 객체로 할당한다.