본문 바로가기
책/오브젝트

13. 서브클래싱과 서브타이핑

by 오오오오니 2025. 3. 17.

13. 서브클래싱과 서브타이핑

비어 있음
2024년 5월 14일
올바른 타입 계층을 구성하는 원칙을 살펴보자

🏁 타입

객체의 타입이란 객체가 수신할 수 있는 메시지의 종류를 정의하는 것이다.
⇒ 퍼블릭 인터페이스

🏁 타입 계층

타입 계층을 구성하는 두 타입 간의 관계에서 더 일반적인 타입을 슈퍼타입, 더 특수한 타입을 서브타입이라고 부른다.

🏁 서브클래싱과 서브타이핑

언제 상속을 사용해야 하는가?

상속 관계가 is-a관계를 모델링하는가?
is-a로 연결해 문장을 만들어도 어색하지 않은 단어로 타입의 이름을 정하라
클라이언트 입장에서 부모 클래스의 타입으로 자식 클래스를 사용해도 무방한가?
행동의 호환 여부를 판단하는 기준은 클라이언트의 관점이다.
인터페이스를 클라이언트의 기대에 따라 분리함으로써 변경에 의해 영향을 제어하는 설계 원칙을 인터페이스 분리 원칙이라고 부른다.

서브 타이핑

타입 계층을 구성하기 위해 상속을 사용하는 경우
인터페이스 상속
서브 타입이 슈퍼타입이 하는 모든 행동을 동일하게 할 수 있어야 한다.
행동 호환성을 만족시켜야 한다.
부모 클래스에 대한 자식 클래스의 대체 가능성을 포함한다.

🏁 리스코프 치환 원칙

서브 타입은 그것의 기반 타입에 대해 대체 가능해야 한다는 것
예제
“정사각형은 직사각형이다.”
is-a라는 말은 얼마나 우리의 직관에서 벗어날 수 있는지를 잘 보여준다.

클라이언트와 대체 가능성

리스코프 치환 원칙은 클라이언트와 격리한 채로 본 모델은 의미 있게 검증하는 것이 불가능하다.

리스코프 치환 원칙은 유연한 설계의 기반이다.

의존성 역전 원칙: 구체클래스인 MovieOverlappedDiscountPolicy 모두 추상 클래스인 DiscountPolicy에 의존한다.
리스코프 치환 원칙 : DicountPolicy와 협력하는 Movie의 관점에서 DiscountPolicy 대신 OverlappedDiscountPolicy와 협력하더라도 아무런 문제가 없다.
개방-폐쇄 원칙 : 중복할인 정책이라는 새로운 기능을 추가하기 위해 자식클래스를 추가하더라도 Movie에 영향을 끼치지 않는다.

🏁 계약에 의한 설계와 서브타이핑

어떤 타입이 슈퍼타입에서 정의한 사전 조건보다 더 약한 사전조건을 정의하고 있다면 그 타입은 서브타입이 될 수 있지만 더 강한 사전조건을 정의한다면 서브타입이 될 수 없다.
어떤 타입이 슈퍼타입에서 정의한 사후조건보다 더 강한 사후조건을 정의하더라도 그 타입은 여전히 서브타입이지만 더 약한 사후조건을 정의한다면 서브타입의 조건이 깨지고 만다.

느낀점

초반부터 상속의 해로운점을 줄곧 말하고 인터페이스 상속은 괜찮다고 했는데
이 장을 읽고 궁금증이 풀려서 좋았다.
상속이 서브클래싱과 서브타이핑으로 나눌 수 있다는 것이 신기했다.
서브타이핑으로 설계한 상속이 의미있다는 것을 배웠다.
또한 위의 내용을 잘 몰랐기 때문에 그동안 lsp를 재대로 몰랐었다는 것을 알았다.
상속과 인터페이스를 너무 당연하게 설명한것 같다고 생각했는데 서브타이핑을 알고 더 중요하고 더 어려운 말이였구나하는 생각이 들었다.
“치환”이라는 말이 서브클래스가 아닌 서브타이핑이라는 것을 의미하는 것을 알았다.

' > 오브젝트' 카테고리의 다른 글

15. 디자인 패턴과 프레임워크  (0) 2025.03.17
14. 일관성 있는 협력  (0) 2025.03.17
12. 다형성  (0) 2025.03.17
11. 합성과 유연한 설계  (0) 2025.03.17
10. 상속과 코드 재사용  (0) 2025.03.17