[이펙티브 자바] 클래스와 멤버의 접근 권한을 최소화하라

Dev. 로티·2022년 1월 31일
1

자바

목록 보기
8/9

요즘 공부중인 이펙티브 자바의 목록 중 “클래스와 멤버의 접근 권한을 최소화하라” 파트 부분을 읽고 정리하였습니다.

개인적인 생각이 포함되어 있으니 참고 부탁드리겠습니다 ^^


잘 설계된 컴포넌트

잘 설계된 컴포넌트와 그렇지 못한 컴포넌트의 차이는 클래스의 내부 구현을 외부로 부터 얼마나 잘 숨겼느냐(정보 은닉)에 따라 결정되는데요.

외부 컴포넌트는 특정 공개 API(public으로 풀어놓은) 만을 통해 소통해야한다고 합니다.

이해한 내용을 기준으로 그림을 한번 그려보았습니다....


정보은닉의 장점

  • 개발 속도를 높일 수 있고, 병렬 컴포넌트 작업이 가능하다.

  • 컴포넌트에 대해 쉽게 파악이 가능하여 유지보수 비용을 낮출 수 있다.

  • 자체만으로는 성능을 높이진 못하지만, 성능 최적화를 하는데에 있어 도움을 줄 수는 있다.

  • 컴포넌트의 재사용성을 높일 수 있다.

  • 개별 컴포넌트의 동작을 쉽게 검증할 수 있다.


자바에서는 정보은닉을 위한 접근 제어 메커니즘을 제공하고 있는데요.

각종 접근 제어자들의 특성을 잘 파악하고 재대로 활용하는것이 정보은닉의 핵심이라고 할 수 있습니다.

접근 제한자

private : 해당 컴포넌트 내에서만 접근이 가능하다.

package-private (선언하지 않을 경우 default) : 컴포넌트가 작성된 패키지 내에서만 접근이 가능하다.

protected : 같은 패키지 내부에서 접근이 가능하며, 해당 컴포넌트를 상속한 컴포넌트에서 또한 접근이 가능하다.

public : 모든 패키지, 상속한 컴포넌트에서 모두 접근이 가능하다.

  • public 접근 제한자를 가진 인스턴스를 사용할 경우 Thread safe 하지 않을 수 있기 때문에 final로 지정하여 사용하는것이 좋다.

  • 테스트를 위해 절대로 인스턴스 혹은 멤버, 메소드를 절대로 공개 API(protected, public)으로 지정하면 안된다 !
    [why??] 테스트 코드를 테스트할 컴포넌트와 패키지 경로를 같게하면 pacakge-private 요소로 얼마든지 접근이 가능하기 때문이다.

  • public static final 객체를 사용하거든 해당 객체가 불변성을 가졌음을 보장하고, private static final 객체를 사용하거든 기존 객체가 영향을 받지 않기 위해 복제하여 사용하는 것을 권장한다.

0개의 댓글