톱레벨 클래스와 인터페이스에 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를 구성할 수 있다. 작은 기기에서 구동할 애플리케이션을 개발할 때 유용하다.
출처 : 백기선 이펙트브 자바 강의
'JAVA' 카테고리의 다른 글
| CountDownLatch (0) | 2025.03.21 |
|---|---|
| Effective Java finalizer와 cleaner 사용을 피하라 (0) | 2023.04.20 |
| Effective Java 불필요한 객체 생성을 피하라 (1) | 2023.04.17 |
| Effective Java 의존 객체 주입 (0) | 2023.04.13 |
| Effective Java 싱글턴 part2. (feat. 메서드 참조, 함수형 인터페이스, 직렬화) (1) | 2023.04.11 |