도니의 iOS 프로그래밍 세상

[오브젝트 2회독] 13장 - 서브 클래싱과 서브 타이핑 본문

OOP

[오브젝트 2회독] 13장 - 서브 클래싱과 서브 타이핑

Donee 2024. 11. 19. 19:33

상속의 두가지 용도

  • 타입 계층 구현
  • 코드 재사용

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 원칙들이 어우려져 유연한 설계를 가능하게 함
Comments