조영호님의 책 오브젝트를 보며 정리한 내용입니다.
문제가 될 시 해당글 삭제하겠습니다.
Chapter 10 상속과 코드 재사용
[상속과 중복코드]
중복코드의 단점..
- 중복 코드는 변경을 방해한다! (중복 코드를 제거해야 하는 이유)
- 코드를 수정하는데 드는 노력이 몇배나 증가한다.
- 요구사항이 변경 됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다!
DRY 원칙(Don't Repeat Youtself)
- 모든 지식은 시스템 내에서 단일하고, 애매하지 않고, 정말로 믿을 만한 표현 양식을 가져야한다.
상속
- 객체지향에서 중복코드를 제거하는 첫번째 방법!
- 하지만 상속을 통한 중복코드 제거는 부모클래스와 자식클래스의 결합도를 높인다는 단점이 있다.
[취약한 기반 클래스 문제]
- 취약한 기반 클래스 문제 : 부모 클래스의 변경에 의해 자식 클래스가 영향을 받는 현상을 말한다.
- 이는 캡슐화를 약화시키고 결합도를 높인다.(객체지향의 기본은 캡슐화를 통한 변경의 통제라는 점을 명심해라!
- 불필요한 인터페이스 문제 : 자식 클래스가 불필요한 부모 클래스의 메서드를 상속 받게 되어, 자식 클래스 내부규칙이 무너질수 있다.
- 메서드 오버라이딩 오작용 문제 : 자식 클래스가 부모 클래스의 메서드를 오버라이딩 할 경우, 부모 클래스가 자신의 메서드를 사용하는 방법이 자식 클래스에 결합될 수 있다..
- 부모 클래스와 자식 클래스의 동시 수정 문제 : 클래스를 상속하면 결합도로 인해 자식 클래스와 부모 클래스의 구현을 영원히 변경하기 않거나, 자식 클래스와 부모 클래스를 동시에 변경하거나 두가지 선택지밖에 없다.
[상속으로 인한 피해를 최소화하는 방법]
- 추상화에 의존하자!!
- 추상화에 의존하는 방법
- 차이를 메서드로 추출하라 : 상속관계에 있는 클래스 사이에 메서드는 차이가 있는 부분을 메서드로 빼, 동일한 부분을 만들어준다.
- 중복 코드를 부모 클래스로 올려라1 : 동일한 부분이 생겼다면, 동일 부분을 부모 클래스로 올려 각 클래스가 부모 클래스를 상속받는 구조를 만들어준다.
- 중복 코드를 부모 클래스로 올려라2 : 차이가 있는 부분은 추상메서드로 만들어, 자식 클래스에서 상속받아 사용할 수 있도록 한다.
-> 각각의 클래스는 하나의 변경 이유만을 가지는 구조로 변경된다(단일 책임 원칙)!
-> 하지만 상속은 어떤 방식으로든 부모클래스와 자식클래스를 결합시킨다.
[상속 챕터를 마치며]
- 객체지향 세계에서 중복 코드를 제거하고 코드를 재사용할 수 있는 가장 유명한 방법은 상속이다.
- 하지만 객체지향에 대한 이해가 깊어진다면 맹목적으로 코드 재사용을 막는 방법으로 상속을 사용하는 것은 위험한 방법이다.
- 상속은 코드 재사용과 관련된 우아한 방법이 아니다. 더 좋은 방법은 합성이다!
Chapter 11 합성과 유연한 설계
- 합성은 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존하게 된다.
-> 합성을 사용하게 되면 포함된 객체의 내부 구현이 변경되더라도 영향을 최소화할 수 있기 때문에 변경에 안정적인 코드를 얻게된다. - 상속은 클래스 사이에 정적인 관계인데 비해, 합성의 관계는 객체 사이의 동적인 관계이다.
-> 상속은 컴파일타임 의존성을 띄지만, 합성은 런타임 의존성을 띤다.
[상속으로 인한 조합의 폭발적인 증가]
- 상속으로 변경사항을 도입하고자 할 때, 부모클래스 자식클래스의 구조를 만들어주고 추가적으로 자식클래스를 상속받는 손자클래스를 만드는 방식이다.
-> 폭발적으로 결합도가 증가됨을 느낄 수 있다.
-> 부모 클래스에서 공통되는 사항을 메서드로 묶고, 추상메서드를 추가 하더라도 모든 자식들이 오버라이딩 해야하는 문제가 생긴다. (Java8 에서 생긴 default 키워드를 통해서 해결할 수도 있을 것 같다!)
-> 대부분의 객체 지향 언어는 단일 상속만을 지원하기 때문에, 상속으로 인한 중복코드 문제를 해결하기가 쉽지 않다.
중복 코드의 덫
- 서비스 변경사항은 자유롭게 조합할 수 있어야 하며, 적용되는 순서 역시 임의로 결정할 수 있어야 한다.
- 하지만 상속을 이용한 해결 방법은 모든 가능한 조합별로 자식 클래스를 하나씩 추가하는 방법으로, 조합과 순서에 있어 부모 클래스에 종속되어 유연하지 못하다.
- 이처럼 상속의 남용으로 하나의 기능을 추가하기 위해서 필요 이상으로 많은 수의 클래스를 추가해야 하는 경우를 가리켜, 클래스 폭발 혹은 조합의 폭발 이라고 부른다.
-> 이 방법을 해결하는 가장 근본적인 해결 방법은 상속을 포기하는 것이다!
객체 합성이 클래스 상속보다 더 좋은 방법이다.
- 객체지향에서 코드를 재사용하기 위해 사용되는 대표적인 방법은 상속이다.
- 하지만 코드를 재사용하면서도 건전한 결합도를 유지할 수 있는 더 좋은 방법은 합성을 이용하는 것이다.
- 상속은 구현 상속과 인터페이스 상속 두가지로 나뉘게 되는데, 상속에 모든 단점들은 구현 상속에 국한된다!
'아키텍처 > OOP' 카테고리의 다른 글
[오브젝트] Chapter13 서브클래싱과 서브타이핑 (0) | 2022.11.19 |
---|---|
[오브젝트] Chapter12 다형성 (0) | 2022.11.17 |
[오브젝트] Chapter9 유연한 설계 (0) | 2022.11.04 |
[오브젝트] Chapter8 의존성 관리하기 (2) | 2022.11.04 |
[오브젝트] Chapter7 객체 분해 (0) | 2022.11.03 |