클래스와 멤버의 접근 권한을 최소화하라(Effective Java).

Choizz·2023년 8월 14일
0

이펙티브 자바

목록 보기
11/13

이번 포스팅은 이펙티브 자바의 토픽 중 "클래스와 멤버의 접근 권한을 최소화하라"에 대한 내용입니다.

Java에서 접근 권한은 접근 지시자로 설정할 수 있습니다.

  • public, default(package-private), protected, private 등이 있죠!

이 지시자들을 사용함으로써 클라이언트에서 클래스, 필드, 메서드 등으로의 접근을 제한할 수 있습니다.

이것은 캡슐화와 은닉화와 관련이 크다고 할 수 있습니다.

  • 캡슐화는 관련 데이터와 메서드들을 같은 클래스에 묶음으로써 내부와 외부를 구별하는 것을 의미합니다.
  • 은닉화는 private 키워드를 사용해서 클래스 내부 정보의 접근하지 못하도록 하는 것을 의미합니다.

특히 이번 주제는 은닉화와 관련이 큰 것 같군요!


정보 은닉의 장점

(1) 시스템 개발 속도를 높인다.

  • 정보 은닉을 하다 보면 인터페이스를 설계하게 됩니다. 보통 클라이언트는 인터페이스를 의존하게 되고 어떻게 구현되었는지는 신경을 쓰지 않도록 하기 때문입니다.
  • 인터페이스를 설계한다면, 인터페이스를 구현하는 정의하는 팀과 구현하는 팀이 동시에 개발이 가능하게 되어 시스템 개발 속도를 높일 수 있습니다.

(2) 시스템 관리 비용을 낮춘다.

  • 인터페이스로 설계를 한다면, 인터페이스 위주로 파악하면 되기 때문에 컴포넌트를 더 빨리 파악할 수 있습니다.

(3) 성능 최적화에 도움을 줄 수 있다.

  • 마찬가지로, 캡슐화와 은닉화되어 있다면, 해당 성능의 병목 지점을 찾는데 유리합니다.

(4) 소프트웨어의 재사용성을 높일 수 있다.

  • 컴포넌트가 다른 프로젝트에서도 사용할 수 있다는 것을 전제합니다.

(5) 시스템 개발 난이도를 낮춘다.

  • 전체를 만들기 전 개별 컴포넌트를 검증할 수 있습니다.

접근 제어자 사용 원칙

  • 모든 클래스와 멤버의 접근성을 가능한 좁혀야 합니다.
  • 톱 레벨 클래스와 인터페이스에 package-private이나 public을 사용할 수 있습니다 (private, protected 사용 x).
    • public으로 선언하면 api가 되므로 하위호환성을 유지하려면 지속적으로 관리를 해줘야합니다.
  • 패키지 외부에서 쓰지 않을 클래스나 인터페이스라면 package-private으로 선언하여 접근성을 좁힙니다.
  • 한 클래스에서만 사용하는 package-private 클래스나 인터페이스는 해당 클래스에서 내부 클래스를 만들어 사용합니다.
    • private static class로 만들어야 독립적인 클래스로 사용가능합니다.
    • 외부 클래스의 요소들을 사용할 수 없기 때문입니다.

멤버(필드, 메서드, 내부 클래스..)의 접근 제어자 원칙

  • private과 package-private은 내부 구현으로 사용합니다.
  • public과 protected는 공개 api가 됨을 인식해야 합니다.
  • 코드를 테스트하는 용도로 private을 package-private으로 풀어주는 것은 허용할 수 있습니다.
    • 하지만, 테스트만을 위해서 멤버를 공개 api로 만들어서는 안됩니다.
  • public class의 인스턴스 필드는 되도록 public이 아니어야 합니다.
  • 클래스에서 public static final로 배열 필드를 두거나, 이 필드를 반환하는 접근 메서드를 제공해선 안됩니다.
    • static 영역에서 배열의 요소가 변경될 수 있기 때문입니다.

정리

  • 애플리케이션을 설계할 때, 정보 은닉에 대한 고려를 하는 것이 매우 중요할 것 같습니다.
  • 특히, 어떤 클래스가 다른 패키지에서 사용할일이 없다면, package-private을 적용하고, 인터페이스를 두는 형식을 생각해봐야 할 것 같습니다.

refernce

profile
집중

0개의 댓글