경주장

12장 다형성 본문

기술서적/오브젝트

12장 다형성

달리는치타 2021. 9. 6. 14:57

상속의 관점에서 다형성이 구현되는 기술적인 메커니즘을 살펴보자.

다형성이 런타임에 메시지를 처리하기에 적합한 메서드를 동적으로 탐색하는 과정을 통해 구현되며, 상속은 이런 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하기 위한 방법이다.

내용은 기술적이지만 문체가 상당히 담백하게 느껴져서 크게 와닿는다.

 

이전 장에서 부주의한 상속의 문제점을 꾸준히 언급한것에 이어서 계속해서 같은 목소리를 다형성의 측면에서 재조명한다.

 

01 다형성

 

a. 오버로딩 다형성

클래스 내에서 하나의 메시지(메서드 명)가 여러 메서드를 가지는 경우를 일컫는다.

 

b. 강제 다형성

동일한 연산자를 다양한 타입에 사용할 수 있는 방식을 가리킨다.

 

c. 매개변수 다형성

- 제네릭 프로그래밍에서 클래스의 인스턴스 변수나 메서드의 매개변수 타입을 임의의 타입으로 선언 한 후 사용하는 시점에 구체적인 타입으로 지정하는 방식을 가리킨다.

 

d. 포함 다형성 (서브타입 다형성)

메시지가 동일 하더라도 수신한 객체의 타입에 따라 실제로 수행되는 행동이 달라지는 능력을 의미한다.

객체지향 프로그래밍에서 가장 널리 알려진 형태의 다형성이며 특별한 언급이 없다면 포함 다형성을 의미하는 것이 일반적이다.

 

상속의 목적은 포함 다형성을 통해 서브타입 계층을 구축하여 개념적으로 묶는 것이다.

 

02 상속의 양면성

 a. 데이터 관점의 상속

자식 클래스의 인스턴스 안에 부모 클래스의 인스턴스가 포함되는 것으로 생각하는 것이 유용하다.

 

b. 행동 관점의 상속

 

메서드를 호출하면 발생하는 일련의 과정을 살펴보자

. 처음 자기 자신의 .class(클래스 포인터)를 통해 자신의 클래스 정보에 접근하여 적절한 메서드가 존재하는지 살핀다.

. 없다면 .parent(부모의 클래스 포인터)를 통해 부모의 클래스 정보에 접근하여 적절한 메서드가 존재하는지 살핀다.

 

 

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

 

업캐스팅 - 부모 클래스 타입으로 선언된 변수에 자식 클래스의 인스턴스를 할당하는 것

- 김영한 선생님 曰 부모는 마음이 넓어 자식을 품을 수 있다.

 

동적 바인딩 ~ 서브타입 다형성이 런타임에(동적으로) 동작하는것 

 

업매스팅과 반대로 부모 클래스의 인스턴스를 자식 클래스 타입으로 변환 하기 위해 명시적인 타입 캐스팅을 하여 할당하는것 

 

04 동적 메서드 탐색과 다형성

  • 메시지를 수신한 객체는 먼저 자신을 생성한 클래스에 적합한 메서드가 존재하는지 검사한다. - 존자하면 메서드를 실행하고 탐색을 종료한다.
  • 메서드를 찾지 못했다면 부모 클래스에서 메서드 탐색을 계속한다. 이 과정은 적합한 메서드를 찾을 때 까지 상속 계층을 따라 올라가며 계속된다.
  • 상속 계층의 가장 최상위 클래스에 이르렀지만 메서드를 발견하지 못한 경우 예외를 발생시키며 탐색을 중단한다.

self 참조 - 동적 메서드 탐색 과정에서 직접 상속 계층의 역방향으로 이동하며 탐색을 수행하는 참조 주체(?)

 

동적 메서드 탐색의 탐색 방향 (상속 계층의 역방향)에 따라 자연스럽게 메서드 오버라이딩시에 자식 클래스의 메서드가 먼저 검색되어 실행된다.