Item15
클래스 멤버의 접근 권한을 최소화하라
1 개요
- 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는가로 정해진다
2 캡슐화(정보 은닉) 장점
시스템 개발 속도 향상
- 여러 컴포넌트 병렬 개발
시스템 관리 비용 절약
- 컴포넌트 이해도가 높아져 디버깅이 쉽고 컴포넌트 교체 부담이 적다
성능 최적화 도움
- 최적화할 컴포넌트를 정해 다른 컴포넌트 영향을 주지않고 해당 컴포넌트만 수정 가능
소프트웨어 재사용성 높임
- 외부에 거의 의존하지 않고 독자적으로 동작해 다른 환경에서 유용하게 쓰임
큰 시스템을 제작하는 난이도 낮춤
- 시스템 전체가 개발되지 않아도 개별 컴포넌트의 동작을 검증할 수 있음
3 접근 제한자
-
접근 제한자는 클래스, 인터페이스, 멤버의 접근성을 명시한다.
-
멤버에 부여할 수 있는 접근 제한자는 총 4가지 이를 제대로 활용하는 것이 정보 은닉의 핵심이다.
- private, package-private, proteced, public
-
모든 클래스와 멤버의 접근성을 가능한 좁혀야 한다.
private
- 멤버를 선언한 톱레벨 클래스에만 접근 가능
package-private
- 접근 제한자를 명시하지 않은 경우 적용 됨
- 단 인터페이스는 기본적으로 public
- 멤버가 소속된 패키지 안의 모든 클래스에서 접근 가능
proteced
- package-private의 접근 범위 포함
- 동일 패키지 및 상속받은 하위 클래스에서 접근 가능
public
- 모든 곳에서 접근 가능
4 기본 원칙
- 클래스와 멤버의 접근 권한을 최소 화하라
4.1 톱레벨 클래스
- 톱레벨 클래스와 인터페이스에 사용할 수 있는 접근 제한자는 public과 package-private 뿐이다
- 톱레벨 클래스란 가장 바깥 클래스를 의미한다.
public
- 공개 API가 된다
- 하위 호환을 위해 영원히 관리해야 한다
package-private
- 해당 패키지 안에서만 이용할 수 있다
- 패키지 외부에서 쓸 이유가 없다면 package-private으로 선언하라
- 공개 API가 아니기 때문에 언제든 수정 가능하다
- 클라이언트에 아무런 피해 없이 다음 릴리즈에서 수정, 교체 , 제거 할 수 있다
4.2 한 클래스에서만 사용하는 private-package 클래스
- 한 클래스에서만 사용하는 private-package 톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static으로 중첩하라
- 이렇게 하면 같은 패키지의 모든 클래스가 접근하는 것에서 바깥 클래스 하나만 접근하는 것으로 접근 범위가 줄어든다.