티스토리 뷰

변경 불가능(immutable) 클래스는 그 객체를 수정할 수 없는 클래스다. 객체 내부의 정보는 객체가 생성될 때 주어진 것이며, 객체가 살아 있는 동안 그대로 보존된다. 자바 플랫폼 라이브러리에는 이런 클래스가 많다. String, 기본 자료형 클래스, BigInteger, BigDecimal 등이 그런 클래스다. 변경 불가능 클래스를 만드는 이유는 단순하다. 우선 변경 불가능 클래스는 변경 가능 클래스보다 설계하기 쉽고, 구현하기 쉬우며, 사용하기도 쉽다. 오류 가능성도 적고, 더 안전하다.

변경 불가능 클래스를 만들 때는 아래의 다섯 규칙을 따르면 된다.

1. 객체 상태를 변경하는 메서드(setter)를 제공하지 않는다.

2. 계승할 수 없도록 한다.

  • 계승을 금지하려면 보통 클래스를 final로 선언하면 된다

3. 모든 필드를 final로 선언한다.

  • 동기화 없이 다른 스레드로 전달되어도 안전하다.

4. 모든 필드를 private로 선언한다.

  • 캡슐화의 이점을 살리기 위해 private로 선언한다.

5. 변경 가능 컴포넌트에 대한 독점적 접근권을 보장한다.

  • 방어적 본사본을 만들어야 한다.

 

immutable 클래스의 장점


  1. 변경 불가능 객체는 단순하다. 생성될 때 부여된 한 가지 상태만 갖는다.
  2. 스레드에 안전(thread-safe) 할 수밖에 없다. 어떤 동기화도 필요 없으며, 여러 스레드가 동시에 사용해도 상태가 훼손될 일이 없다. 스레드 안정성을 보장하는 가장 쉬운 방법이다. 따라서 변경 불가능한 객체는 자유롭게 공유할 수 있다.
  3. 정적 팩토리 메서드를 사용하면 클라이언트는 새로운 객체를 만드는 대신 기존 객체들을 공유하게 되므로 클라이언트 코드를 변경하지 않고도 캐시 기능을 추가할 수 있다.
  4. 방어적 복사본을 만들 필요가 없다. 만들어 봐야 원래 객체와 영원히 같은 상태이기 때문이다.
  5. 변경 불가능한 객체는 그 내부도 공유할 수 있다.
  6. 변경 불가능한 객체는 다른 객체의 구성요소로도 훌륭하다. 변경 불가능 객체는 맵의 키나 집합의 원소로 활용하기 좋다. (ex Map, Set)

 

immutable 클래스의 단점


변경 불가능한 객체의 유일한 단점은 값마다 별도의 객체를 만들어야 한다는 점이다. 따라서 객체 생성 비용이 높을 가능성이 있다.

 

요약하자면, 모든 get 메서드마다 그에 대응하는 set 메서드를 두는 것은 피해야 한다. 변경 가능한 클래스로 만들 타당한 이유가 없다면, 반드시 변경 불가능 클래스로 만들어야 한다. 만약 변경 불가능한 클래스로 만들 수 없다면, 변경 가능성을 최대한 제한하라. 객체가 가질 수 있는 상태의 가짓수를 줄이면 객체 상태를 추론하기 쉬워지고 오류 가능성도 줄어든다. 따라서 특별한 이유가 없다면 모든 필드를 final로 선언하라.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함