도니의 iOS 프로그래밍 세상

[오브젝트 2회독] 12장 - 다형성 본문

OOP

[오브젝트 2회독] 12장 - 다형성

Donee 2024. 11. 19. 19:32
  • 상속의 타입 계층을 구조화 하기 위해 사용하는 것이지 코드 재사용이 아님

1. 다형성

  • 서브타입 다형성은 메세지가 동일하더라도 수신한 객체의 타입에 따라 실제 수행되는 행동이 달라지는 것
  • 우리가 부르는 다형성은 일반적으로 서브타입 다형성 의미
  • 상속은 다형성을 위한 서브타입 계층을 구축하여, 런타임에 상속 계층 안에서 적절한 메서드 선택을 가능하게 함

2. 상속의 양면성

객체 지향 패러다임의 아이디어는 객체라고 불리우는 실행 단위 안으로 데이터와 행동을 통합하는 것

  • 데이터와 행동 관점에서만 바라본다면, 상속이란 부모 클래스의 데이터와 행동을 자식 클래스와 자동적으로 공유할 수 있는 메카니즘
  • 진정한 목적은 타입 계층을 구조화 하는 것

3. 업캐스팅과 동적 바인딩

같은 메시지, 다른 결과

  • 업캐스팅이란 부모 클래스 타입으로 선언된 변수에 자식 클래스 인스턴스를 할당하는 것
  • 동적 바인딩이란 선언된 변수 타입이 아닌 메시지 수신 객체 타입에 따라 실행 메서드가 결정되는 것
  • OCP의 의도는 코드 변경 없이 기능 추가가 가능한 것이며, 업캐스팅과 동적 메서드 탐색을 통해 이루어질 수 있다.
    • 결국 OCP가 목적이고, 업캐스팅과 동적 바인딩이 방법

업캐스팅

  • 컴파일러는 명시적 타입 변환 없이도 자식 클래스가 부모 클래스 대체 가능
  • 이런 특성을 이용하여 부모 타입으로 선언된 파라미터에 자식 클래스 인스턴스를 전달하는게 가능
  • 다운 캐스팅이란 부모를 자식으로 변환하기 위해선 명시적인 타입 캐스을 하는 것
  • 컴파일러 관점에서 자식 클래스는 부모 클래스를 대체할 수 있어, 부모 클래스와 협력하는 클라이언트의 경우 다양한 자식 클래스 인스턴스와 협력 가능
  • 결국 어떠한 자식 클래스와도 협력할 수 있는 무한한 확장 가능성을 가짐

결론

  • 상속의 진정한 목적은 코드 재사용이 아닌, 타입 계층을 구조화
  • 다형성은 타입 계층을 구조화 하여 런타임때 수신 객체에 따라 결과가 달라짐
  • 다형성을 상속을 통해 구현할 수 있는 까닭은 컴파일러가 업캐스팅 및 동적 바인딩을 지원하기 때문
  • 업캐스팅을 통해 부모 클래스와 협력하는 객체는 무한한 자식 클래스와 제약없는 협력이 가능하며, 동적 바인딩을 통해 부모가 아닌 자식 인스턴스가 메시지를 수신하여 실행함
  • 결과적으로 타입 계층의 자식 클래스들이 한가지 기능을 다양한 방식으로 실행함으로써, 공통된 다양한 기능에 대응할 수 있는 구조를 설계할 수 있음
Comments