불변 객체란?

상태를 변경할 수 없는 클래스의 객체를 불변 객체라고 한다.

장점

  • 식별자 변경 문제가 발생하지 않는다. 불변 객체는 아래와 같은 코드가 발생해도 상태가 변하지 않기 때문에 five 가 출력된다.
Map<Cash, String> map = new HashMap<>(); Cash five = new Cash("$5");
Cash ten = new Cash("$10");
map.put(five, "five");
map.put(ten, "ten");
five.mul(2);
map.get(five);System.out.println(map.get(five));
  • 객체가 완전하고 견고한 상태이거나 아니면 아예 실패하는 실패 원자(failure atomicity)를 가진다. 가변 객체는 상태 수정 중간에 실패하는 문제가 발생할 수 있다.
  • 시간적 결합(temporal coupling)을 없앨 수 있다. 순서에 의존하지 않는 객체를 만들 수 있다.
  • 스레드 안정성: 객체가 여러 스레드에서 동시에 사용될 수 있고 예측 가능한 결과를 보장하는 객체의 품질을 보장한다.
  • 불변 객체는 생성자 안에서만 상태를 초기화 하기 때문에 단순성을 가지고, 응집도가 높아지고, 유지보수가 쉬워진다.

구현

원시 타입만 있는 경우

필드가 원시 타입만 있으면 final키워드로 불변 객체를 만들 수 있다.

참조 타입이 있는 경우

final 키워드 추가와 setter를 작성하지 않는다. 그리고 추가적인 조건이 더 필요하다.

  • 참조 변수가 일반 객체인 경우 멤버 변수를 불변 객체로 만든다.
  • Array일 경우 getter 사용시 배열의 clone을 반환하도록 한다.
  • List인 경우 getter 사용시 리스트를 방어적 복사한다.

참고 자료

댓글남기기