불변성 (Immutability)
포스트
취소

불변성 (Immutability)

불변성이란 한번 생성된 객체가 생명 주기 동안 어떤 상황에서도 상태 (인스턴스 변수의 값) 가 변하지 않음을 뜻한다.

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~ 메소드들로 컬렉션을 읽기 전용으로 만들 수 있다.

This post is licensed under CC BY 4.0 by the author.

자바 HashMap 뜯어보기

시끄러운 아이폰 재난 문자 조용히 받기

Comments powered by Disqus.