상속은 코드 재사용의 목적이 아닌 타입 계층을 구조화하기 위해 사용해야 한다.
타입 계층은 객체지향 프로그래밍의 중요한 특성 중 하나인 다형성의 기반을 제공한다.
상속은 클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 묶기 위해서 사용해야 한다.
이번 장에서는 상속의 관점에서 다형성이 구현되는 기술적인 메커니즘을 살펴보자.
이번 장을 읽고 나면 다형성이 런타임에 메시지를 처리하기에 적합한 메서드를 동적으로 탐색하는 과정을 통해 구현되며,
상속이 이런 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하기 위한 방법이라는 사실을 이해하게 될 것이다.
다형성
많은(poly)+형태(morph)를 의미하는 합성어
여러 타입을 대상으로 동작할 수 있는 코드를 작성할 수 있는 방법
상속의 양면성
타입 계층을 기반으로 한 다형성의 동작 방식을 이해하기 위한 몇 가지 개념
- 업캐스팅, 동적 메서드 탐색, 동적 바인딩, self 참조, super 참조
객체의 경우에는 서로 다른 상태를 저장할 수 있도록 각 인스턴스별로 독립적인 메모리를 할당받아야 한다.
하지만 메서드의 경우에는 동일한 클래스의 인스턴스끼리 공유가 가능하다.
클래스는 한 번만 메모리에 로드하고 각 인스턴스별로 클래스를 가리키는 포인터를 갖게 하는 것이 경제적이다.
동적 메서드 탐색과 다형성
메시지 탐색과 관련해서 이해해야 하는 중요한 변수가 self 참조이다.
동적 메서드 탐색은 self가 가리키는 객체의 클래스에서 시작해서 상속 계층의 역방향으로 이뤄진다.