불변 객체를 사용하지만 그래도 값을 변경해야 하는 메서드가 필요하면 어떻게 해야할까?
예를 들어서 기존 값에 새로운 값을 더하는 add() 와 같은 메서드가 있다.
먼저 변경 가능한 객체에서 값을 변경하는 간단한 예를 만들어보자.
package lang.immutable.change;
public class MutableObj {
private int value;
public MutableObj(int value) {
this.value = value;
}
public void add(int addValue) {
value = value + addValue;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
package lang.immutable.change;
public class MutableMain {
public static void main(String[] args) {
MutableObj obj = new MutableObj(10);
obj.add(20);
//계산 이후 기존 값은 사라짐
System.out.println("obj = " + obj.getValue());
}
}
obj = 30
MutableObj 을 10 이라는 값으로 생성한다.
이후에 obj.add(20) 을 통해서 10 + 20 을 수행한다.
계산 이후에 기존에 있던 10 이라는 값은 사라진다.
MutableObj 의 상태(값)가 10 30 으로 변경되었다.
obj.getValue() 를 호출하면 30 이 출력된다.
이번에는 불변 객체에서 add() 메서드를 어떻게 구현하는지 알아보자.
참고로 불변 객체는 변하지 않아야 한다.
package lang.immutable.change;
public class ImmutableObj {
private final int value;
public ImmutableObj(int value) {
this.value = value;
}
public ImmutableObj add(int addValue) {
int result = value + addValue;
return new ImmutableObj(result);
}
public int getValue() {
return value;
}
}
add() 메서드이다. package lang.immutable.change;
public class ImmutableMain1 {
public static void main(String[] args) {
ImmutableObj obj1 = new ImmutableObj(10);
ImmutableObj obj2 = obj1.add(20);
//계산 이후에도 기존값과 신규값 모두 확인 가능
System.out.println("obj1 = " + obj1.getValue());
System.out.println("obj2 = " + obj2.getValue());
}
}