Intro::
이펙티브 자바 정리본입니다.
결론
- 프로그램 요소의 접근성은 가능한 최소한으로 해야 합니다.
- 오직 같은 패키지의 다른 클래스가 접근해야 하는 멤버에 한하여 package-private으로 풀어주자.
- 상위 클래스의 메서드를 재정의할 때는 그 접근 수준을 상위 클래스에서보다 좁게 설정할 수 없습니다. 이는 리스코프 치환 원칙을 지키기 위해 필요합니다.
- 테스트만을 위해 클래스, 인터페이스, 멤버를 공개 API로 만들어서는 안됩니다.
- public 클래스의 인스턴스 필드는 되도록 public이 아니어야 합니다.
- public이게 된다면 불변식을 보장할 수 없기 때문입니다.
- 또한 가변 필드를 갖는 클래스는 일반적으로 스레드 안전하지 않기 때문입니다.
- 정적 필드도 마찬가지이나, 예외로 해당 클래스가 표현하는 추상 개념을 완성하는 데 필요한 상수라면 public static final 필드로 공개해도 좋습니다.
- 클래스에서 public static final 배열 필드를 두거나 이 필드를 반환하는 접근자 메서드를 제공해서는 안됩니다.
// 보안 허점이 숨어 있다. public static final Thing[] VALUES = { ... }; // 해결책 1 - 불변 리스트 추가 private static final Thing[] PRIVATE_VALUES = { ... }; public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES)) // 해결책 2 - 방어적 복사 private static final Thing[] PRIVATE_VALUES = { ... }; public static final Thing[] values() { return PRIVATE_VALUES.clone(); }
정보 은닉의 장점
- 시스템 개발 속도를 높입니다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문입니다.
- 시스템 관리 비용을 낮춥니다.
- 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 줍니다.
- 소프트웨어 재사용성을 높입니다.
- 큰 시스템을 제작하는 난이도를 낮춰줍니다.
접근제어자
- private
- 같은 클래스 내에서만 접근 가능합니다.
- package-private(default)
- 같은 패키지 내에서만 접근 가능합니다.
- protected
- 같은 패키지거나 상속을 받는다면 접근 가능합니다.
- public
- 모든 곳에서 접근 가능합니다.
References::
이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)
Loading Comments...