2023.09.07 THU
346p ~ 377p
26일차 내용 ⬇️
2023.09.05 - [개발 서적 기록/오브젝트_조영호] - 26일차 - 중복 코드를 추상화에 의존하는 부모 클래스로 올리기
26일차 - 중복 코드를 추상화에 의존하는 부모 클래스로 올리기
2023.09.05 TUE 335p ~ 348p 25일차 내용 ⬇️ 2023.09.04 - [개발 서적 기록/오브젝트_조영호] - 25일차 - 상속의 위험성 : 결합도 증가&캡슐화 감소 25일차 - 상속의 위험성 : 결합도 증가&캡슐화 감소 2023.09.04
magenta-ming.tistory.com
상속의 한계
상속을 통해서 부모 클래스의 코드를 재사용할 수 있다. 이 점을 이용해서, 부모 클래스와 다른 부분만 추가하거나 재정의해서 확장성을 가질 수 있다.
하지만, 자식 클래스는 부모 클래스의 내부 구현에 대해 상세하게 알아야 하므로, 결합도가 높아진다.
합성은 구현에 의존하지 않는다
합성은 퍼블릭 인터페이스에 의존하기 때문에, 구현에 의존하지 않는다.
따라서 포함된 객체의 내부 구현이 변경되어도, 변경에 대한 영향을 최소화할 수 있다.
합성은 실행시점에 객체간의 관계가 결정된다
상속은 클래스간의 정적인 관계다. 코드를 작성할 때 상속 관계를 결정해야하기 때문이다.
반면에 합성은 객체 사이에 동적인 관계를 가지기 때문에, 실행 시점에 동적으로 관계를 변경할 수 있다.
따라서 합성을 통해서 더 변경에 유연하게 설계할 수 있다.
합성은 결합도를 낮춘다.
상속은 부모 클래스의 내부 구현을 알아야하고 의존하기 때문에 결합도가 높아진다.
반면, 합성은 구현에 대한 의존성이 아닌, 퍼블릭 인터페이스에 대한 의존성을 가지기 떄문에 클래스 간의 결합도를 객체 간의 결합도로, 낮은 결합도로 설계할 수 있다.
합성은 상속의 문제점을 해결한다
상속의 문제점은 아래와 같다.
- 불필요한 오퍼레이션을 상속받아야한다.
- 메서드 오버라이딩이 영향을 받을 수 있다.
- 부모 클래스를 변경하면, 자식 클래스를 함께 변경해야한다.
위와 같은 문제를 해결하기 위해서 상속 관계를 합성의 형태로 변경해야한다.
다음과 같이 변경할 수 있다.
- 자식 클래스의 상속 관계를 제거한다.
- 부모 클래스의 인스턴스를 자식 클래스의 인스턴스 변수로 선언한다.
상속 남용 - 클래스 폭발, 조합 폭발
상속이 남용되어서, 하나의 기능을 추가하기 위해서 필요 이상으로 많은 수의 클래스가 추가되는 나쁜 경우가 발생할 수 있다.
이를 클래스 폭발 class explosion / 조합의 폭발 combinational explosion 문제라고 부른다.
상속은 관계가 코드를 작성하면서 결정되기에, 다양한 조합의 자식-부모 관계가 필요하다면 그 조합의 수만큼 새로운 클래스를 추가해야한다.
기능을 추가할 때 뿐만 아니라, 기능을 수정할 때도 관련한 코드가 여러 클래스에 영향을 끼치기에 변경에 대한 영향이 커진다.
따라서 이런 경우에는 상속을 포기해야한다.
'개발 서적 기록 > 오브젝트_조영호' 카테고리의 다른 글
30일차 - 다형성의 종류 (0) | 2023.09.10 |
---|---|
29일차 - 믹스인을 통해서 상속 대체하기 (0) | 2023.09.08 |
26일차 - 중복 코드를 추상화에 의존하는 부모 클래스로 올리기 (0) | 2023.09.05 |
25일차 - 상속의 위험성 : 결합도 증가&캡슐화 감소 (0) | 2023.09.04 |
24일차 - DIP와 중복 코드 제거하기 (0) | 2023.08.29 |