요즘 공부중인 이펙티브 자바의 목록 중 “클래스와 멤버의 접근 권한을 최소화하라” 파트 부분을 읽고 정리하였습니다.
개인적인 생각이 포함되어 있으니 참고 부탁드리겠습니다 ^^
잘 설계된 컴포넌트와 그렇지 못한 컴포넌트의 차이는 클래스의 내부 구현을 외부로 부터 얼마나 잘 숨겼느냐(정보 은닉)에 따라 결정되는데요.
외부 컴포넌트는 특정 공개 API(public으로 풀어놓은) 만을 통해 소통해야한다고 합니다.
이해한 내용을 기준으로 그림을 한번 그려보았습니다....
개발 속도를 높일 수 있고, 병렬 컴포넌트 작업이 가능하다.
컴포넌트에 대해 쉽게 파악이 가능하여 유지보수 비용을 낮출 수 있다.
자체만으로는 성능을 높이진 못하지만, 성능 최적화를 하는데에 있어 도움을 줄 수는 있다.
컴포넌트의 재사용성을 높일 수 있다.
개별 컴포넌트의 동작을 쉽게 검증할 수 있다.
자바에서는 정보은닉을 위한 접근 제어 메커니즘을 제공하고 있는데요.
각종 접근 제어자들의 특성을 잘 파악하고 재대로 활용하는것이 정보은닉의 핵심이라고 할 수 있습니다.
private : 해당 컴포넌트 내에서만 접근이 가능하다.
package-private (선언하지 않을 경우 default) : 컴포넌트가 작성된 패키지 내에서만 접근이 가능하다.
protected : 같은 패키지 내부에서 접근이 가능하며, 해당 컴포넌트를 상속한 컴포넌트에서 또한 접근이 가능하다.
public : 모든 패키지, 상속한 컴포넌트에서 모두 접근이 가능하다.
public 접근 제한자를 가진 인스턴스를 사용할 경우 Thread safe 하지 않을 수 있기 때문에 final로 지정하여 사용하는것이 좋다.
테스트를 위해 절대로 인스턴스 혹은 멤버, 메소드를 절대로 공개 API(protected, public)으로 지정하면 안된다 !
[why??] 테스트 코드를 테스트할 컴포넌트와 패키지 경로를 같게하면 pacakge-private 요소로 얼마든지 접근이 가능하기 때문이다.
public static final 객체를 사용하거든 해당 객체가 불변성을 가졌음을 보장하고, private static final 객체를 사용하거든 기존 객체가 영향을 받지 않기 위해 복제하여 사용하는 것을 권장한다.