Java ‐ 클래스와 멤버의 접근 권한을 최소화하라[Effective Java Item 15] - dnwls16071/Backend_Summary GitHub Wiki

클래스와 멤버의 접근 권한을 최소화하라

  • 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐이다.
  • 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 분리한다.
  • 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 간섭하지 않는다.
  • 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리이다.

정보 은닉의 장점

  • 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다.
  • 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅을 할 수 있고, 다른 컴포넌트로 교체하는 부담도 적다.
  • 정보 은닉 자체가 성능을 높여주지는 않으나 성능 최적화에 도움을 준다.
  • 소프트웨어 재사용성을 높인다. 외부에 거의 의존하지 않고 독자적으로 동작할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않은 낯선 환경에서도 유용하게 쓰일 가능성이 높다.
  • 큰 시스템을 제작하는 난이도를 낮춰준다
  • 결과적으로 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다. 달리 말해, 소프트웨어가 올바르게 동작하는 한 항상 가장 낮은 접근 수준을 부여해야 한다.
해당 클래스 안에서 접근 가능? 같은 패키지 안에서 접근 가능? 상속받은 클래스에서 접근 가능? 외부에서 접근 가능?
public O O O O
protected O O O X
package-private O O X X
private O X X X
  • 정말로 꼭 필요한 것만 골라 최소한의 public API를 설계하자. public 클래스는 상수(불변) 외에는 public 필드를 가지면 안 된다.