일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 서브 타이핑
- 명령-쿼리 분리
- 객체 생성 사용 분리
- 객체지향
- dip
- Swift#flatMap#map#Monad#함수형 프로그래밍#Optional
- 추상화
- 컴파일 타임 의존성
- 유여난 설계
- 런타임 의존성
- 유연한 설계
- 메서드를 통한 해결
- 책임주도설계
- OOP
- 다형성
- 상속 조합 폭발적 증가
- iSP
- 상속
- 행동 호환성
- OCP
- 믹스인
- 오브젝트
- 의존성
- 일관성 있는 협력
- 하향식 접근
- 알고리즘
- '기존 설계 재사용
- 설계 재사용
- Apple # HIG #iOS15 #iOS14 #Human #Interface #Guidelines #Apple developer # Apple human interface guidelines
- 합성
Archives
- Today
- Total
도니의 iOS 프로그래밍 세상
[오브젝트 2회독] 13장 - 서브 클래싱과 서브 타이핑 본문
상속의 두가지 용도
- 타입 계층 구현
- 코드 재사용
1. 타입
객체지향 패러다임 관점의 타입
- 개념 관점에서 타입이란 공통의 특징을 공유하는 대상들의 분류
- 프로그래밍 언어 관점에서 타입이란 동일한 오퍼레이션을 적용할 수 있는 인스턴스의 집합
- 객체지향 관점에서 객체가 수신할 수 있는 메시지의 집합은 퍼블릭 인터페이스
- 결국 같은 퍼블릭 인터페이스를 제공 한다면, 객체 지향 관점에서는 동일한 타입
2. 서브클래싱과 서브타이핑
언제 상속을 사용해야 하는가?
- is-a 관계를 만족할 때
- 클라이언트 입장에서 부모 클래스 타입을 자식 클래스로 사용해도 무방할 때
is-a 관계, 행동 호환성
- is-a 관계에서 만족시켜야 할 것은 직관이 아닌, 클라이언트 입장에서 대체 가능성
- 클라이언트 입장에서 is-a 관계를 만족시킨다면 타입 계층으로 설정할 수 있음
- 극단적으로 클라이언트 입장에서 강아지가 조류라는 클래스를 대체할 수 있다면, 같은 타입임
- 모든것은 클라이언트의 관점에서 호환이 가능하다면 같은 타입 계층으로 규정
클라이언트의 기대에 따라 계층 분리
- 클라이언트에 기대에 맞게 상속 계층을 분리하고 행동 호환성을 맞출 수 있는 타입 계층을 구성
- 클라이언트에 따라 인터페이스를 분리하면 변경에 대한 영향을 제어하기가 더욱 수월해짐
- 클라이언트 기대에 따라 분리함으로써 변경에 의해 영향을 제어하는 설계원칙을 ISP라고 함
- ISP의 핵심은 자신이 사용하지 않는 메서드에 의존하지 않는 것인데, 결국 클라 기대에 따라 분리함으로써 만족시킬 수 있음
서브클래싱과 서브타이핑
- 서브 클래스는 코드를 재사용할 목적으로 상속을 사용하는 경우
- 서브 타이핑은 타입 계층을 구성하기 위한 상속을 사용하는 경우
- 서브 타이핑 관계 유지를 위해 서브 타입은 슈퍼 타입의 행동 호환성을 만족시켜야 함(대체 가능성)
3. 리스코프 치환 원칙(LSP)
- 서브 타입이 기반 타입에 대해 대체 가능해야 함
클라이언트와 대체 가능성
- 상속으로 인해 자식 클래스가 부모 클래스의 규칙을 위반한다면, 이는 서브 클래싱 관계로서 리스코프 치환 원칙을 위반함
- 객체가 리스코프 치환 원칙을 위반한지 확인하기 위해선 기존 클라이언트와 협력할 수 있어야 함
- 결국 대체 가능성을 판단하는 건 클라이언트
LSP는 유연한 설계의 기반
- LSP는 클라가 어떤 자식 클래스와도 협력할 수 상속 구조를 설계하는 가이드라인 제공
- DIP, LSP, OCP 원칙들이 어우러져 유연한 설계를 가능하게 함
- DIP를 통해 추상 클래스에 의존하고, LSP를 통해 자식 클래스들과 무한한 협력이 가능
- 위 두 원칙들로 인해, 다양한 기능을 추가해도 기존 코드 수정이 없이 확장 가능하여 OCP를 만족
결론
- 상속의 가장 큰 목적은 타입 계층을 구축하는 것
- 객체 지향에서 같은 타입이란 동일한 퍼블릭 인터페이스를 제공하는 집합
- 서브 클래싱은 단순 코드 재사용이 목적이며, 서브 타이핑은 타입 계층 구축이 목적
- 서브 타이핑을 유지하기 위해선 LSP를 만족시켜야 함
- LSP란 서브 타입 인스턴스가 슈퍼 타입을 대체할 수 있어야 함
- 대체 가능성을 판단하는 건 클라이언트이므로, 기존 클라이언트와 협력할 수 있어야 함
- LSP, DIP, OCP 원칙들이 어우려져 유연한 설계를 가능하게 함
'OOP' 카테고리의 다른 글
[오브젝트 2회독] 15장 - 디자인 패턴과 프레임 워크 (1) | 2024.11.19 |
---|---|
[오브젝트 2회독] 14장 - 일관성 있는 협력 (0) | 2024.11.19 |
[오브젝트 2회독] 12장 - 다형성 (0) | 2024.11.19 |
[오브젝트 2회독] 11장 - 합성과 유연한 설계 (0) | 2024.11.19 |
[오브젝트 2회독] 10장 - 상속과 코드 재사용 (0) | 2024.11.19 |
Comments