아이템 17 - 변경 가능성을 최소화하라
- 불변클래스 : 인스턴스의 내부 값을 수정할 수 없는 클래스
- 이 불변 클래스는 가변클래스보다 단순하고 설계 및 구현하기 쉬우며, 오류가 생길 여지가 적다.
- 그래서 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다.
- 불변으로 만들 수 없는 클래스라도 변경 가능한 부분을 최소한으로 줄인다.
아이템 18 - 상속보다는 컴포지션을 사용하라 [다시 읽기]
- 상속은 코드를 재사용하게 해주는 좋은 수단이지만, 캡슐화를 해친다는 단점이 있다.
- 상속은 상위 클래스와 하위 클래스가 순수한 is-a 관계일 때만 써야 한다.
> is-a 관계 예시
자식클래스 is 부모클래스 성립하는 경우
ex) 코끼리(자식)는 동물(부모)이다.
class 자식클래스 extends 부모클래스 {
생성자 () {
super();
}
}
- is-a 관계일 때도 안심할 수는 없다고 한다. 하위 클래스의 패키지가 상위 클래스와 다르고 상위 클래스가 확장을 고려해 설계되지 않았다면 문제가 될 수 있다고 한다.
- 상속대신 컴포지션과 전달 사용. -> 래퍼 클래스를 사용하자.
아이템 19 - 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.
- 18번에서는 상속사용하지 말라더니 여기선 갑자기 또 고려해서 설계하라네..
- 요지는 확장해야 할 명확한 이유가 떠오르지 않는다면 상속을 막고, 이런식으로 상속을 막기 위해서는 클래스를 final로 선언하거나 생성자 모두를 외부에서 접근할 수 없도록 만들면 된다.
- 상속 클래스를 구현할 때에는 하위 클래스에서 그 문서화 된 것을 보고 믿고 쓸 수 있도록 해야 한다. (문서화 된 내용은 반드시 지켜야 한다는 의미)
아이템 20 - 추상 클래스보다는 인터페이스를 우선하라
- 기존 클래스에 새로운 인터페이스를 구현하는 것이 추상 클래스를 새로 끼워 넣는 것보다 쉽다.
- 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다.
** 믹스인 : 클래스 원래의 '주된 타입' 외에 선택적 기능을 제공하는 효과를 가지는 것.
- 인터페이스는 추상 클래스와 달리 '계층이 없는' 타입 프레임워크를 만들 수 있다.
-> 객체간에는 꼭 계층으로만 구별되지 않는 경우가 많은데, 이 때에 인터페이스로 정의하면
이 구조를 잘 표현할 수 있다.
- 다중 구현을 위해서는 인터페이스를 사용하는 게 좋다.
'책(독서)' 카테고리의 다른 글
[이펙티브자바] ~169p item 25~28 (0) | 2020.10.20 |
---|---|
[이펙티브자바] ~149p item 21~24 (0) | 2020.10.19 |
[이펙티브자바] ~104p item 13~16 (0) | 2020.10.12 |
[이펙티브자바] ~76p item 9~12 (0) | 2020.10.12 |
[이펙티브자바] ~46p 아이템 5~8 (0) | 2020.10.08 |