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

클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐가 잘 설계된 컴포넌트의 기준이다.

모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다.

오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다.

정보 은닉, 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다.

정보 은닉의 장점

톱레벨 클래스와 인터페이스에 부여할 수 있는 접근 수준은 package-private과 public 두 가지다.

public.으로 선언하게 되면 API가 되며 package-private으로 선언하면 해당 패키지 안에서만 사용할 수 있다.

패키지 외부에서 쓸 이유가 없다면 package-private으로 선언하자.

public으로 선언하면 영원히 API로서 관리해야 한다.

public 가변 필드를 갖는 클래스는 일반적으로 스레드 안전하지 않다.

핵심정리

프로그램 요소의 접근성은 가능한 한 최소한으로 하라.

꼭 필요한 것만 골라 최소한의 public API를 설계하자. 그 외에는 클래스, 인터페이스, 멤버가 의도치 않게 API로 공개되는 일이 없도록 해야 한다.

public 클래스는 상수용 public static final 필드 외에는 어떠한 public 필드도 가져서는 안된다!