본문 바로가기
책(독서)

[이펙티브자바] ~135p item 17~20

by DevJR 2020. 10. 13.

아이템 17 - 변경 가능성을 최소화하라

 

- 불변클래스 : 인스턴스의 내부 값을 수정할 수 없는 클래스

- 이 불변 클래스는 가변클래스보다 단순하고 설계 및 구현하기 쉬우며, 오류가 생길 여지가 적다.

- 그래서 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다.

- 불변으로 만들 수 없는 클래스라도 변경 가능한 부분을 최소한으로 줄인다.

 

아이템 18 - 상속보다는 컴포지션을 사용하라 [다시 읽기]

 

- 상속은 코드를 재사용하게 해주는 좋은 수단이지만, 캡슐화를 해친다는 단점이 있다. 

- 상속은 상위 클래스와 하위 클래스가 순수한 is-a 관계일 때만 써야 한다.

 > is-a 관계 예시

    자식클래스 is 부모클래스 성립하는 경우

    ex) 코끼리(자식)는 동물(부모)이다.

class 자식클래스 extends 부모클래스 {
	생성자 () {
    	super();
    }
}

- is-a 관계일 때도 안심할 수는 없다고 한다. 하위 클래스의 패키지가 상위 클래스와 다르고 상위 클래스가 확장을 고려해 설계되지 않았다면 문제가 될 수 있다고 한다.

- 상속대신 컴포지션과 전달 사용. -> 래퍼 클래스를 사용하자.

 

아이템 19 - 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.

 

- 18번에서는 상속사용하지 말라더니 여기선 갑자기 또 고려해서 설계하라네..

- 요지는 확장해야 할 명확한 이유가 떠오르지 않는다면 상속을 막고, 이런식으로 상속을 막기 위해서는 클래스를 final로 선언하거나 생성자 모두를 외부에서 접근할 수 없도록 만들면 된다.

- 상속 클래스를 구현할 때에는 하위 클래스에서 그 문서화 된 것을 보고 믿고 쓸 수 있도록 해야 한다. (문서화 된 내용은 반드시 지켜야 한다는 의미)

 

아이템 20 - 추상 클래스보다는 인터페이스를 우선하라

 

- 기존 클래스에 새로운 인터페이스를 구현하는 것이 추상 클래스를 새로 끼워 넣는 것보다 쉽다.

- 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다.

   ** 믹스인 : 클래스 원래의 '주된 타입' 외에 선택적 기능을 제공하는 효과를 가지는 것.

- 인터페이스는 추상 클래스와 달리 '계층이 없는' 타입 프레임워크를 만들 수 있다.

   -> 객체간에는 꼭 계층으로만 구별되지 않는 경우가 많은데, 이 때에 인터페이스로 정의하면

       이 구조를 잘 표현할 수 있다.

- 다중 구현을 위해서는 인터페이스를 사용하는 게 좋다.