클래스, 멤버의 접근 권한 최소화
캡슐화, 내부 데이터, 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는가에 대한 내용이다.
- 여러 컴포넌트를 병렬로 개발할 수 있다.
- 시스템 관리 포인트를 줄일 수 있다. 다른 컴포넌트로 교체하는 부담도 적다.
- 정보 은닉 자체가 성능을 높이지는 않지만, 성능 최적화에 도움을 준다. ( 서로 간섭이 적기에 디버깅이 편하다. )
- 외부 의존도가 떨어지므로 라이브러리의 경우 유지보수가 용이해준다.
기본 원칙은 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다. 그렇지 않으면 open 되므로 하위 호환을 위해서 영원히 기존 구현을 바꿀 수 없게 된다.
그런데 멤버 접근성을 좁히지 방해하는 제약이 있다. 상위 클래스 메소드 보다 접근 수준을 좁게 설정할 수 없다. 이 제약은 리스코프 치환 원칙을 지키기 위해 필요하다.
public 클래스 멤버를 private로 하는 것이 기본이다. package-private까지 낮추는 건 괜찮지만 pulblic은 정말 아니어야만 한다. public 가변 필드를
두면 ThreadSafe하지 않다. final을 붙이면 내부 구현을 바꿀 수 없어서 리팩토링에 제약이 생긴다. 특히 배열은 public static final로 두거나 이 필드를
반환하는 접근자 메소드를 두면 배열이 변경 가능성이 있으므로 제공하지 않는 것이 좋다.
추가로 두 가지 암묵적 접근 수준이 있다. 모듈은 자신에 속하는 패키지 중 공개(export)할 것들을 선언할 수 있다. 모듈 시스템을 활용하면 클래스를 외부에 공개하지 않으면서도 같은 모듈을 이루는 패키지 사이에는 자유롭게 공유할 수 있다.