잘 설계된 컴포넌트와 그렇지 않은 컴포넌트의 가장 큰 차이는 내부 데이터와 내부 구현 정보를 얼마나 잘 숨겼느냐 이다. => 캡슐화
정보 은닉의 장점
여러 컴포넌트를 병렬적으로 개발할 수 있게 만든다.
다른 컴포넌트로 교체하거나 컴포넌트를 이해하기 쉽다.
부분적으로 성능을 높일 수 있어 성능 최적화에 도움을 준다.
독립적으로 구성되어 다른 환경에서도 작동할 가능성이 높다.
개별적인 테스트를 통해 쉽게 검증할 수 있다.
그러므로, 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다.
구현하기
해당 패키지에서만 사용하고 클라이언트에 공개되지 않는 인터페이스, 클래스는 package-private 으로 설정하자.
하나의 클래스에서만 사용되는 package-private 클래스나 인터페이스는 해당 클래스 내에 private static 로 중첩시켜보자.
공개 API 를 세심히 설계하고 그 외에 모든 멤버는 private으로 만들자.
권한을 풀어주는 일이 자주 발생한다면 컴포넌트가 더 분리되어야하는 것은 아닌지 고민해보자.
public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다.
해당 값이 언제든 변할 수 있으므로 불변식을 보장할 수 없고, 스레드 안전하지 않다.
꼭 public이 필요하다면 public static final 을 불변 객체, 기본 타입 값으로 선언해 상수로 사용하자.
자바 9 에서 추가된 모듈을 이용한 접근 제어가 가능하나, 고려할 것이 많기 때문에 꼭 필요한 게 아니라면 다른 방식으로 풀자.