본문 바로가기

programming/java

Item 15. 클래스와 멤버의 접근 권한을 최소화하라

[WHY]

잘 설계된 컴포넌트는 얼마나 정보 은닉(캡슐화)를 고려했는지 여부이다.

내부 요소를 외부에 최소한으로 노출하기 위해서 접근 권한을 최소화하는 것이다.

[WHEN]

컴포넌트를 설계할 때.

[HOW]

  • 꼭 필요한 것만 골라 최소한의 public API를 설계하자. 그 외에는 클래스, 인터페이스, 멤버가 의도치 않게 API로 공개되는 일이 없도록 해야 한다.
  • public 클래스는 상수용 public static final 필드 외에는 어떠한 public 필드도 가져서는 안 된다.
  • public static final 필드가 참조하는 객체가 불변인지 확인하라.

[캡슐화]

정보 은닉(캡슐화)의 장점

  1. 시스템 개발 속도를 높인다.
  2. 시스템 관리 비용을 낮춘다.
  3. 성능 최적화에 도움을 준다.
  4. 소프트웨어 재사용성을 높인다.

정보 은닉 기본원칙

  • 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다.

상위 클래스의 메서드를 재정의할 때는 그 접근 수준을 상위 클래스보다 좁게 설정할 수 없다. 확장은 가능하다.

public class Parent{
    void method(){}//package-private
}

public class Child{
    @Override
    public void method(){}//가능

    @Override
    private void method(){}//불가능
}

주의점

  1. public 클래스의 인스턴스 필드는 되도록 public이 아니어야한다.
    • public 가변 필드를 갖는 클래스는 일반적으로 스레드 안전하지 않다.
  2. 클래스에서 public static final 배열 필드를 두거나 이 필드를 반환하는 접근자 메서드를 제공해서는 안된다.
    • 배열의 참조값을 안다면 배열의 내용을 수정할 수 있기 때문에 위험하다.
    • 꼭 필요하다면 복제된 배열을 전달하거나 불변리스트Collections.UnmodifiableList()를 사용하는 것이다.

모듈 시스템 : Java 9

모듈 : 자신에 속하는 패키지 중 공개 (export) 할 것들을 선언한다. [module-info.java 파일에]

클래스를 외부에 공개하지 않으면서도 같은 모듈을 이루는 패키지 사이에서 자유롭게 공유할 수 있다.

암묵적 접근 수준 : public, protected 수준의 효과가 모듈 내부로 한정된다.