불변 객체 - 값 변경

불변 객체를 사용하지만 그래도 값을 변경해야 하는 메서드가 필요하면 어떻게 해야할까? 예를 들어서 기존 값에 새로운 값을 더하는 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

MutableObj10 이라는 값으로 생성한다. 이후에 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;
      }
  }
  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());
	
			}
}