Java

[Effective Java] 4-1. 클래스와 인터페이스: 클래스와 멤버의 접근 권한을 최소화하라

noahkim_ 2024. 12. 27. 17:41

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.


1. 내부 정보를 외부로부터 잘 숨기기

캡슐화

구현과 API를 분리
  • 컴포넌트들을 서로 분리시켜 개별적인 작업 수행 가능
  • 테스트, 최적화, 분석 등

 

정보 은닉 (접근 제한자)
  • 모든 클래스와 멤버의 접근성을 가능한 좁혀야 함

 

2. 접근성 제약사항

리스코프 치환 원칙

상위 클래스의 메서드를 재정의할 때, 접근 수준을 상위 클래스에서보다 더 좁게 설정 불가
  • 상위 클래스의 인스턴스는 하위 클래스의 인스턴스로 대체가 가능해야 하기 때문
  • 어길 경우, 컴파일 타임에서 오류 발생

 

3. public 필드를 지양하라

값 제한 불가

불변식 위반
  • 외부 코드에서 필드에 직접 접근하여 부적절한 값으로 설정할 수 있음

 

스레드 안정성

  • 외부에서 직접 수정할 수 있다면 멀티스레드 환경에서 값의 일관성을 유지하기 어려움
  • 동기화 매커니즘을 적용할 방법이 없음

 

예외사항

상수
  • public static final
  • 값이 고정되어 있어 불변성을 유지하므로, 외부에 공개해도 문제가 없음

 

4. Java 9 Modules

모듈

  • 패키지의 묶음

 

정의

module-info.java
module my.module {
    exports com.example.mylibrary; // 외부에 공개
    requires another.module; // 다른 모듈 의존성
}
  • exports
    • 공개할 패키지 선언
    • 공개한 package의 public 접근 제한자만 외부에서 접근 가능
  • requires
    • 의존성 패키지 선언 
    • 다른 모듈에서 export하는 클래스의 public 클래스에 접근 가능

 

장점

  • 캡슐화
  • 의존성 관리
  • JDK 자체 모듈화