코딩하는 털보

이펙티브 자바, 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 본문

Book/이펙티브 자바

이펙티브 자바, 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라

이정인 2021. 8. 30. 17:01

이펙티브 자바, 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라

잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다.

정보 은닉의 장점

  • 각 컴포넌트를 병렬로 개발할 수 있기 때문에 개발 속도를 높인다.
  • 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고 교체하는 부담도 적기 때문에 관리 비용을 낮춘다.
  • 다른 컴포넌트에 영향을 주지 않고 최적화할 수 있기 때문에 성능 최적화에 도움을 준다.
  • 외부에 의존하지 않고 독자적으로 동작하는 컴포넌트는 재사용성이 높다.
  • 개별 컴포넌트 동작 검증으로 큰 시스템을 제작하는 난이도를 낮춰준다.

접근 제한자를 제대로 활용하는 것이 정보 은닉의 핵심이다.

모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다.

  • 클래스의 접근 제한자
    톱레벨 클래스와 인터페이스의 접근 수준이 public인 경우 공개 API가 되고, package-private인 경우 해당 패키지에서만 이용할 수 있기 때문에 API가 아닌 내부 구현이 되어 클라이언트에 아무런 피해 없이 변경할 수 있다. 고로 패키지 외부에서 쓸 이유가 없다면 package-private.
    한 클래스에서만 사용하는 package-private 톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static 으로 중첩시킨다.

  • 멤버의 접근 제한자
    공개 API를 설계한 후, 그 외의 모든 멤버를 private으로 하고, 같은 패키지의 다른 클래스가 접근해야 한다면 package-private로 풀어주기.
    보통의 private, package-private는 공개 API가 아니지만, Serializable을 구현한 경우 의도치 않게 공개 API가 될 수 있다.
    public 클래스는 상속에 대한 제한을 두지 않기 때문에 public 클래스의 protected 멤버는 공개 API에 속한다. protected 멤버는 적을수록 좋다.
    public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다. 가변 객체를 참조하거나 final이 아닌 인스턴스 필드를 public 으로 선언하면 불변식을 보장할 수 없다.
    final을 사용하더라도 가변 객체를 참조한다면 다른 객체를 참조하지만 못할 뿐, 참조된 객체 자체는 수정될 수 있다.
    public 가변 필드를 갖는 클래스는 일반적으로 thread-safe하지 않다.
    **public 클래스는 상수용 public static final 필드 외에는 어떠한 public 필드도 가져서는 안 된다.

Comments