Item 15
클래스와 멤버의 접근 권한을 최소화하라
- 클래스의 내부 구현 정보를 외부 컴포넌트로부터 잘 숨기는 것이 중요
- API를 통해서만 다른 컴포넌트와 소통 가능하게 만들어야 함
- 이렇게 정보 은닉을 잘 하는 경우, 다음과 같은 이점 존재
- 개발 속도 증가
- 관리 비용 감소
- 재사용성 증가
- 큰 시스템 제작 난이도 감소
- 정보 은닉을 위해서는, 클래스와 멤버의 접근성을 좁혀야 함
- 가장 바깥 클래스 혹은 인터페이스는
package-priavate
혹은 public
두 가지 중 하나로 부여 public
으로 부여하는 경우 공개 API가 됨public
일 필요가 없는 클래스는 최대한 package-private
로 좁히자
- 멤버는
private
을 기본으로 설계하자- 같은 패키지 내부에서 접근해야 하는 경우에만
package-private
로 설정 protected
이상인 경우, 다른 패키지에 공개되므로, 영원히 지원되어야 함
- 리스코프 치환 원칙 때문에, 상위 클래스보다 하위 클래스에서 접근 범위를 좁게 설정 불가능하므로 조심해야 함
- 테스트를 위해 클래스, 인터페이스, 멤버의 접근 제어 수준을 어느 정도 수정은 가능
private
을 package-private
으로 바꾸는 정도- 그러나 이를 공개하는 것은 문제가 됨
public
클래스의 인스턴스 필드는 되도록 public
이 아니어야 함- 값을 제한할 수도 없고, 스레드 안전하지도 않음
- 특히
public static final
배열 역시 변경 가능하므로, 설정에 주의해야 함
- 자바 9에서는 모듈 시스템이 도입되면서, 두 가지 접근 수준이 추가됨
- 그러나 꼭 필요한 경우가 아니라면 사용하지 않는 쪽이 좋아보임
References
- 조슈아 블로크 - Effective Java 3/E