불변성이란 한번 생성된 객체가 생명 주기 동안 어떤 상황에서도 상태 (인스턴스 변수의 값) 가 변하지 않음을 뜻한다.
setter를 뚫어 놓는다면 당연히 그 객체는 불변하지 않다.
getter 역시도 값을 JVM Stack에 저장하지 않고 heap의 메모리 주소의 참조값을 제공하는 자료형을 리턴하는 (예: Collection) 경우 값을 hard copy 받는 게 아닌 heap에 있는 같은 값을 가리키고 있는 shallow copy가 되므로, 해당 자료를 반환받은 메소드에서 자료에 변경을 가하게 되면 (예를 들어 Collection에 원소를 추가/제거하게 되면) setter로 자료를 제공했던 객체에도 원치 않게 반영되게 된다.
자바는 자료의 불변성을 보장하는 수식어를 따로 제공하지 않는다.final
이 그런 역할을 한다고 오해하는 경우도 있지만, **final은 재할당을 금지하는 것이지 값의 불변을 보장하는 것이 아니다. **예를 들어 Collection의 경우 final이 걸려도 새로운 Collection을 할당하는 것이 불가능할 뿐 기존 Collection에 원소를 추가하거나 삭제하는 것이 가능하다.
이런 자바에서 자료의 불변성을 유지하기 위해 취할 수 있는 방법은 크게 두 가지가 있다.
값을 변경할 수 있는 메소드를 없애기
getter와 setter를 비롯하여 값에 변경을 가할 가능성이 있는 모든 메소드를 없애면 불변성은 유지될 수 있다.
unmodifiableCollection(Collection c)
굳이 컬렉션을 외부로 가져가는 getter를 뚫어야 한다면 읽기 전용 상태로 만드는 방법이 있다.
Collections.unmodifiableList(List list)
, Collections.unmodifiableSet(Set set)
… 등 Collections 클래스가 제공하는 unmodifiable~ 메소드들로 컬렉션을 읽기 전용으로 만들 수 있다.
Comments powered by Disqus.