톱레벨 클래스와 인터페이스에 package-private 또는 public을  쓸 수 있다.
  • public으로 선언하면 API가 되므로 하위 호환성을 유지하려면 영원히 관리해야 한다.
  • 패키지 외부에서 쓰지 않을 클래스나 인터페이스라면 package-private로 선언한다.
  • 한 클래스에서만 사용하는 package-private 클래스나 인터페이스는 해당 클래스에 private static으로 중첩 시키자.

 

/*
    Member를 위한 서비스 인터페이스 구현체 DefaultMemberService는
    다른 패키지에서 사용되지 않으므로 public 접근 제어자를 가질 필요가 없다.
    Member package-private 접근 제어자로 충분하다.
*/
class DefaultMemberService implements MemberService {

    private String name;

    // PrivateStaticClass는 DefaultMemberService에서만 사용함
    // PrivateStaticClass에서 DefaultMemberService을 사용하지 않음
    // 따라서 private static으로 중첩 시킴
    private static class PrivateStaticClass {
        // 외부 인스턴스를 참조하지 않음
        void doPrint() {
            // 불가능
            //System.out.println(name);
        }
    }

    private class PrivateClass {
        // 외부 인스턴스를 참조하는 필드가 자동으로 생성
        void doPrint() {
            System.out.println(name);
        }
    }

    public static void main(String[] args) {
        Arrays.stream(PrivateClass.class.getDeclaredFields()).forEach(System.out::println);
    }

}

 

멤버(필드, 메서드, 중첩 클래스/인터페이스)의 접근 제한자 원칙
  • private과 package-private는 내부 구현
  • public 클래스의 protected와 public은 공개 API
  • public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다.

 

자바 9 모듈
  • JSR-376 스팩으로 정의한 자바의 모듈 시스템
  • 안정성: 순환 참조 허용하지 않음, 실행 시 필요한 모듈 확인, 한 패키지는 한 모듈에서만 공개할 수 있음
  • 캡슐화: public 인터페이스나 클래스라 하더라도 공개된 패키지만 사용할 수 있다. 내부 구현을 보호하는 수단으로 사용할 수 있다.
  • 확장성: 필요한 자바 플랫폼 모듈만 모아서 최적의 JRE를 구성할 수 있다. 작은 기기에서 구동할 애플리케이션을 개발할 때 유용하다.

 

출처 : 백기선 이펙트브 자바 강의

+ Recent posts