조슈아 블로크 님의 "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 자체 모듈화
'Java' 카테고리의 다른 글
[Effective Java] 4-3. 클래스와 인터페이스: 인터페이스 (0) | 2024.12.27 |
---|---|
[Effective Java] 4-2. 클래스와 인터페이스: 상속보다는 컴포지션을 사용하라 (2) | 2024.12.27 |
[Effective Java] 3. 모든 객체의 공통 메서드 (0) | 2024.12.27 |
[Effective Java] 2-8. 객체 생성과 파괴: 소멸자 사용을 피하라 (3) | 2024.12.27 |
[Effective Java] 2-7. 객체 생성과 파괴: 다 쓴 객체의 참조를 해제하라 (0) | 2024.12.27 |