반응형
이 내용은 이펙티브 자바 Effective Java 3/E
를 읽으면서 정리한 내용을 포함하고 있습니다.
불변 클래스란 간단히 말해 그 인스턴스의 내부 값을 수정할 수 없는 클래스입니다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않습니다.
불변 클래스 규칙
- 객체의 상태를 변경하는 메소드(변경자)를 제공하지 않습니다.
- 클래스를 확장할 수 없도록 합니다.
- 상속을 막는 대표적인 방법은 클래스를 final로 선언하는 것입니다.
- 모든 필드를 final로 선언합니다.
- 시스템이 강제하는 수단을 이용해 설계자의 의도를 명확히 드러내는 방법입니다.
- 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는 데도 필요합니다.
- 모든 필드를 private으로 선언합니다.
- 필드가 참조하는 가변 객체를 클라이언트에서 직접 접근해 수정하는 일을 막아주게 됩니다.
- 기술적으로는 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변 객체가 되지만 권하는 방법은 아닙니다.
- 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 합니다.
특징
- 불변 객체는 단순합니다.
- 생성된 시점의 상태를 파괴될 때까지 그대로 간직합니다.
- 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요 없습니다.
- 클래스를 스레드 안전하게 만드는 가장 쉬운 방법입니다.
- 불변 객체는 안심하고 공유할 수 있습니다.
- 불변 객체에 대해서는 그 어떤 스레드도 다른 스레드에 영향을 줄 수 없습니다.
- 한번 만든 인스턴스를 재활용하기를 권장히며, 자주 쓰이는 값들을 상수(
public static final
)로 제공하는 것입니다.
- 불변 객체는 자유롭게 공유할 수 있음은 물론, 불변 객체끼리는 내부 데이터를 공유할 수 있습니다.
- 불변 객체는 그 자체로 실패 원자성을 제공합니다.
- 상태가 절대 변하지 않으니 잠깐이라도 불일치 상태에 빠질 가능성이 없습니다.
정리
- Getter가 있다고 해서 무조건 Setter를 만들지 말아야 합니다.
- 클래스를 꼭 필요한 경우가 아니라면 불변이어야 합니다.
- 불변 클래스는 장점이 많으면, 단점이라곤 특정 상황에서의 잠재적 성능 저하뿐입니다.
- 모든 클래스를 불변으로 만들 수는 없습니다.
- 불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄여야 합니다.
- 객체가 가질 수 있는 상태의 수를 줄이면 그 객체를 예측하기 쉬워지고 오류가 생길 가능성이 줄어들게 됩니다.
- 그러니 꼭 변경해야 할 필드를 뺀 나머지 모두를 final로 선언해야 합니다.
- 다른 합당한 이유가 없다면 모든 필드는 private final이어야 합니다.
- 생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 합니다.
- 확실한 이유가 없다면 생성자와 정적 팩터리 외에는 그 어떤 초기화 메서드도 public으로 제공해서는 안됩니다.
- 객체를 재활용 목적으로 상태를 다시 초기화하는 메서드도 안됩니다.
- 복잡성만 커지고 성능 이점은 거의 없습니다.
반응형
'독서이야기 > 이펙티브 자바 3 edition' 카테고리의 다른 글
[아이템18] 상속보다는 컴포지션을 사용하라 (0) | 2022.09.18 |
---|---|
[아이템16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2022.09.18 |
[아이템15] 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2022.09.18 |
[아이템14] Comparable을 구현할지 고려하라 (0) | 2022.09.18 |
[아이템13] clone 재정의는 주의해서 진행하라 (0) | 2022.09.18 |
댓글