본문 바로가기

Today I Learned

리팩터링 2판 챕터12 - 상속 다루기

1. 메서드 올리기 (↔️ 메서드 내리기)

메서드의 코드가 중복된다면, 해당되는 중복 메서드를 슈퍼클래스로 올리자.

 

2. 필드 올리기 (↔️ 필드 내리기)

기법1과 마찬가지로 중복되는 필드가 있다면 슈퍼클래스로 올리자.

 

3. 생성자 본문 올리기

서브 클래스들이 중복되는 메서드를 가지고 있다면 슈퍼클래스로 올리자.

 

4. 메서드 내리기 (↔️ 메서드 올리기)

특정 서브클래스에만 관련된 메서드는 해당 클래스에만 추가하는 것이 좋다.

 

5. 필드 내리기 (↔️ 필드 올리기)

서브 클래스에서만 사용하는 필드는 해당 서브클래스에서만 쓰자.

 

6. 타입 코드를 서브클래스로 바꾸기

*타입코드란? 객체를 식별하기 위한 코드

타입코드가 매력적인 이유

- 조건에 따라 다르게 동작할 수 있는 다형성을 가지고 있다.
- 특정 타입에서만 의미 있는 동작을 한다.

 

7. 서브클래스 제거하기

더 이상 쓰이지 않는 서브클래스는 제거하고 슈퍼클래스의 필드로 대체하자.

 

8. 슈퍼클래스 추출하기

비슷한 일을 하는 두 클래스가 있으면 슈퍼 클래스 하나로 만들자.

 

9. 계층 합치기

독립적으로 존재해야할 이유가 없으면 계층 구조를 없애자(부모와 자식 구조를 하나로 합치자)

 

10. 서브클래스를 위임으로 바꾸기

동작이 달라지는 객체들은 상속으로 표현하는 것이 자연스럽다. 하지만 상속은 한 번만 사용할 수 있다는 단점이 있다. 그래서 처음에는 상속으로 접근하고, 문제가 생기면 위임으로 바꾸는 것을 추천한다.

*위임이란? 객체를 클래스의 필드로 가지는 것이다.

상속 (Inheritance) 자식 클래스는 부모의 속성을 모두 가진다. 부모 클래스를 한 번 수정하면 자식 클래스도 수정해야하는 영향을 끼친다.
위임 (Delegation) 상속보다 낮은 결합도. 객체와 객체 사이의 일반적인 관계를 가진다.

 

11. 슈퍼클래스를 위임으로 바꾸기

슈퍼클래스의 기능들이 서브클래스에는 어울리지 않는다면, 그 기능은 상속을 통하면 안된다는 뜻이다.

(예) 자바의 스택