이번장은 은닉화, 캡슐화와 관련된 내용이다.

최대한 외부에서 내부 구현 정보를 알 수 없게 하는것이 객체 지향적인 설계이다.

 

정보 은닉의 장점은

 

  • 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다.
  • 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다.
  • 정보 은닉 자체가 성능을 높여주지는 않지만 성능 최적화에 도움을 준다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할 수 있기 때문이다.
  • 소프트웨어 재사용성을 높인다. 외부에 거의 의존하지 않고 독자적으로 동작 할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않은 낯선 환경에서도 유용하게 쓰일 가능성이 크기 때문이다.
  • 큰 시스템을 제작하는 난이도를 낮춰준다. 시스템 전체가 아직 완성되지 않은 상태에서도 개별 컴포넌트의 동작을 검증할 수 있기 때문이다.

 

그 중에서도 정보 은닉을 위해 접근성을 어떻게 관리 해야 하는가이가 이번장의 키 포인트이다.

자바의 접근 제어자는

1. private : 해당 클래스에서만 접근 가능
2. default : 기본값, 해당 패키지 내에서만 접근 가능
3. protected : 동일 패키지내의 클래스 또는 해당 클래스를 상속받은 외부패키지의 클래에서 접근 가능
4. public : 어떤 클래스에서라도 접근 가능

총 4가지이며 1에서 4로 갈수록 더 많은 접근을 허용한다.

 

책에서 추천하는 방법

클래스의 공개 API를 세심히 설계한다(public) ->

그 외의 모든 멤버는 private으로 설정 ->

같은 패키지의 다른 클래스가 접근해야 하는 멤버에 한하여 default로 변경->

너무 자주 풀어준다면 설계가 잘못된 것일수도 있다.

++ 고려사항 : Serializable을 구현한 클래스에서는 그 필드들도 의도치 않게 공개 API가 될 수 있음

 

 

public 클래스의 인스턴스 필드는 되도록 public이 아니어야 함

그렇지 않으면

  1. 불변식을 보장할 수 없게 된다.
  2. thread-safe하지 않다.
  3. 내부 구현 변경시 연결된 다른 소스코드 모두를 찾아가 수정해야 함

but, 상수의 경우 public static final 필드로 공개해도 됨

정리

프로그램 요소의 접근성을 가능한 한 최소화

+ Recent posts