개념
정보은닉
1. 뜻
클래스 내부 데이터, 구현정보를 외부 컴포넌트에서 분리시키는 것
2. 장점
2.1 시스템 개발 속도 높인다. : 여러 모듈 동시에 개발 가능
2.2 다른 컴포넌트로 교체가 쉽다.
2.3 소프트웨어의 재사용성을 높인다. (필요한 모듈만 분리하여 타 프로그램에 붙이면 됨)
접근 제어자
private: 멤버가 선언된 클래스 내
default: 접근 제어자 생략시 자동 부여. 동일 패키지 내
protected: 동일 패키지 내 or 상속했을 경우
public: 어디서든
정보 은닉 원칙
1. 모든 클래스&멤버의 접근성을 가능한 낮춘다.
2. public 클래스의 인스턴스 필드는 가능한 public이 아니어야한다.
- 값의 불변성을 보장해야한다.
- thread-safe하지 않다.
3. 클래스가 표현하는 추상 개념을 완성하는데 꼭 필요한 개념이라면 사용 가능
예) product 클래스 내에서 할인률을 표현할 경우
public static final DISCOUNT_RATE
4. 길이가 0이 아닌 배열은 모두 변경 가능
>> 클래스에서 public static final 배열 필드를 두거나, 이 필드를 반환하는 접근자 메서드를 제공하지 말자.
예) public static final Things[] VALUES = {...};
4.1 final인데 왜 변환이 가능할까?
final은 주소값이 바뀌지 않는 것을 뜻한다. final에서 값을 추가/삭제 할 수 있다.
4.2 해결 방법
4.2.1 public 배열을 private으로 만들고, public 불변 리스트 추가
private static final Things[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES = Collections.unmodifiableListArrays.asList(PRIVVATE_VALUES)
4.2.2 배열을 private으로 만들고 그 복사본을 반환하는 public 메소드를 추가한다.
private static final Things[] PRIVATE_VALUES = { ... };
public static final Things values() {
return PRIVATE_VALUES.clone();
}
** 이해 안 가는 부분
97p
반면 public으로 선언하면 API가 되므로 하위 호환을 위해 영원히 관리해줘야한다.
: 하위호환은 어떤 내용을 이야기하는걸까?
'개발 > [스터디] 이펙티브 자바' 카테고리의 다른 글
[이펙티브자바]아이템27. 비검사 경고를 제거하라 (0) | 2022.01.02 |
---|---|
[이펙티브자바]아이템26. 로타입은 사용하지 말라 (0) | 2022.01.01 |
[책 요약]이펙티브자바 21~25 (0) | 2021.12.26 |
아이템 17. 변경 가능성을 최소화해라 (0) | 2021.12.19 |
아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하여라. (0) | 2021.12.19 |