독서이야기/이펙티브 자바 3 edition

[아이템17] 변경 가능성을 최소화하라

사랑꾼이야 2022. 9. 18. 13:55
반응형

이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다.

불변 클래스란 간단히 말해 그 인스턴스의 내부 값을 수정할 수 없는 클래스입니다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않습니다.

불변 클래스 규칙

  • 객체의 상태를 변경하는 메소드(변경자)를 제공하지 않습니다.
  • 클래스를 확장할 수 없도록 합니다.
    • 상속을 막는 대표적인 방법은 클래스를 final로 선언하는 것입니다.
  • 모든 필드를 final로 선언합니다.
    • 시스템이 강제하는 수단을 이용해 설계자의 의도를 명확히 드러내는 방법입니다.
    • 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는 데도 필요합니다.
  • 모든 필드를 private으로 선언합니다.
    • 필드가 참조하는 가변 객체를 클라이언트에서 직접 접근해 수정하는 일을 막아주게 됩니다.
    • 기술적으로는 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변 객체가 되지만 권하는 방법은 아닙니다.
  • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 합니다.

특징

  • 불변 객체는 단순합니다.
    • 생성된 시점의 상태를 파괴될 때까지 그대로 간직합니다.
  • 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요 없습니다.
    • 클래스를 스레드 안전하게 만드는 가장 쉬운 방법입니다.
  • 불변 객체는 안심하고 공유할 수 있습니다.
    • 불변 객체에 대해서는 그 어떤 스레드도 다른 스레드에 영향을 줄 수 없습니다.
    • 한번 만든 인스턴스를 재활용하기를 권장히며, 자주 쓰이는 값들을 상수(public static final)로 제공하는 것입니다.
  • 불변 객체는 자유롭게 공유할 수 있음은 물론, 불변 객체끼리는 내부 데이터를 공유할 수 있습니다.
  • 불변 객체는 그 자체로 실패 원자성을 제공합니다.
    • 상태가 절대 변하지 않으니 잠깐이라도 불일치 상태에 빠질 가능성이 없습니다.

정리

  • Getter가 있다고 해서 무조건 Setter를 만들지 말아야 합니다.
    • 클래스를 꼭 필요한 경우가 아니라면 불변이어야 합니다.
    • 불변 클래스는 장점이 많으면, 단점이라곤 특정 상황에서의 잠재적 성능 저하뿐입니다.
  • 모든 클래스를 불변으로 만들 수는 없습니다.
    • 불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄여야 합니다.
    • 객체가 가질 수 있는 상태의 수를 줄이면 그 객체를 예측하기 쉬워지고 오류가 생길 가능성이 줄어들게 됩니다.
    • 그러니 꼭 변경해야 할 필드를 뺀 나머지 모두를 final로 선언해야 합니다.
  • 다른 합당한 이유가 없다면 모든 필드는 private final이어야 합니다.
  • 생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 합니다.
    • 확실한 이유가 없다면 생성자와 정적 팩터리 외에는 그 어떤 초기화 메서드도 public으로 제공해서는 안됩니다.
    • 객체를 재활용 목적으로 상태를 다시 초기화하는 메서드도 안됩니다.
    • 복잡성만 커지고 성능 이점은 거의 없습니다.
반응형