불변 객체란?
상태를 변경할 수 없는 클래스의 객체를 불변 객체라고 한다.
장점
- 식별자 변경 문제가 발생하지 않는다.
불변 객체는 아래와 같은 코드가 발생해도 상태가 변하지 않기 때문에
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
사용시 리스트를 방어적 복사한다.
댓글남기기