-
아이템 15. 클래스와 멤버의 접근 권한을 최소화 하라잘 설계된 컴포넌트 VS 어설프게 설계된 컴포넌트차이점 : 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는가 ??잘 설계된 컴포넌트
즉 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. --> 정보 은닉, 캡슐화WHY) 왜 정보 은닉을 해야하는가 ?장점
HOW) 어떻게 정보 은닉을 해야하는가 ?우리는 자바에 대한 공부를 하고 있으니 자바에서는 어떻게 정보 은닉을 하는지 알아보자. 자바는 정보 은닉을 위한 다양한 장치를 제공함.
접근 제한자를 제대로 활용하는 것이 정보 은닉의 핵심!접근 제한자 종류
이러한 접근제한자를 제대로 활용하는 원칙에 대해 알아보자 접근 제한자 활용 원칙
1. 톱레벨 클래스(가장 바깥이라는 의미)와 인터페이스에 부여할 수 있는 접근 수준은 package-private, public 두가지 이다.
패키지 외부에서 쓸 이유가 없다면 package-private로 선언하자 --> 그러면 API가 아닌 내부 구현이 되어 언제든 수정할 수 있음 (클라이언트에 아무런 피해 없이 수정, 교체, 제거 가능) --> public으로 선언했더라면 API가 되므로 하위 호환을 위해 영원히 관리해줘야만 함..2. 한 클래스에서만 사용하는 package-private 톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static으로 중첩시키자 (아이템 24 참고)
3. 클래스의 공개 API를 세심히 설계한 후, 그 외의 모든 멤버는 private로 만들자, 그런 다음 오직 같은 패키지의 다른 클래스가 접근해야 하는 멤버에 한하여 (private 제한자를 제거해) package-private로 풀어주자
4. protected 멤버의 수는 적을 수록 좋다.
5. 리스코프 치환 원칙(#26 참고) 을 지키기 위해 클래스가 인터페이스가 정의한 모든 메서드를 public으로 선언해야하는 제약(예외)이 존재한다.
6. 코드를 테스트하기 위한 목적으로 클래스, 인터페이스, 멤버의 접근 범위를 넓히진 말자 (적당한 수준까지는 괜찮음)
7. public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다. (#39 참고)
8. 7 의 예외가 존재 : 해당 클래스가 표현하는 추상 개념을 완성하는 데 꼭 필요한 구성요소로써의 상수라면 public static final 필드로 공개해도 됨.
9. 클래스에서 public static final 배열 필드를 두거나 이 필드를 반환하는 접근자 메서드를 제공해선 안된다.
public static final Thing[] VALUES = {}; 위의 코드는 보안에 허점이 존재함. 해결책두 가지 해결 방법이 존재한다.
public static final List<Thing> VALUES = {};
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
// public static final List<Thing> VALUES = List.of(PRIVATE_VALUES);
// List.of() 또한 불변 리스트를 반환함
private static final Thing[] PRIVATE_VALUES = {};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
모듈 시스템JAVA 9 부터 모듈 시스템이라는 개념이 도입되면서 두 가지 암묵적 접근 수준이 추가됨 모듈 : 패키지 묶음
암묵적 접근 수준 : public, protected 수준의 효과가 모듈 내부로 한정
두가지 암묵적 접근 수준
두가지 암묵적 접근 수준의 주의 사항
모듈 시스템의 활용
ETC
모듈의 장점을 활용하는 법
모듈 시스템의 현재
정리컴포넌트를 잘 설계하기 위해선 -> 정보 은닉, 캡슐화정보은닉을 위한 접근 제한자를 잘 활용하자 -> 접근 제한자 활용 원칙모듈 시스템이라는 것도 있다 |
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 10 replies
-
접근 제한자 활용 원칙에서 5. ~~ 은 아직 in progress 로 보면 될까요? |
Beta Was this translation helpful? Give feedback.
-
정리 감사합니다!
이 뜻이 테스트 코드와 테스트 대상 코드를 같은 패키지에 두고 작성하라는 뜻이겠죠? 실 개발할 때 위와 같은 방식으로 package-private 까지 접근 제한자를 열어두고 테스트 코드를 작성하는지 궁금합니다.!
모듈 시스템과 암묵적 접근 수준은 저에게 생소한 개념이라 이번 기회에 알게 되었습니다. 조금 더 찾아봐야겠지만 |
Beta Was this translation helpful? Give feedback.
-
@coalong 아 그리고 모듈 이야기가 나와서 생각해보니 스프링에서 maven, gradle 빌드 툴로 멀티 모듈 프로젝트 만드신 경험이 있는 것으로 압니다. 그 부분도 기억나신다면 정리해주시면 감사하겠습니다. .ㅎㅎ^^ |
Beta Was this translation helpful? Give feedback.
접근 제한자 활용 원칙에서 5. ~~ 은 아직 in progress 로 보면 될까요?