앞서 살펴본 것처럼 상속의 목적은 코드 재사용아 이니다. 상속의 목적은 타입 계층을 구조화하기 위함이다. 클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 묶기 위해서만 상속을 사용해야 한다.

최근의 언어들을 상속 이외에도 다형성을 구현할 수 있는 다양한 방법을 제공하고 있기에 상속의 중요성이 크지 않다. 이번 장에서는 다형성이 구현되는 기술적 메커니즘을 살펴본다.

다형성

컴퓨터 과학에서는 다형성을 하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력으로 정의한다. 간단히 말하면 다형성은 여러 타입을 대상으로 동작할 수 있는 코드를 작성할 수 있는 방법이라고 할 수 있다.

객체지향 프로그래밍에서 사용되는 다형성은 아래 그림처럼 분류된다.

Untitled

하나의 클래스 안에 동일한 이름의 메서드가 존재하는 경우를 오버로딩 다형성이라고 부른다.

public class Money {
	public Money plus();
	public Money plus(Money amount);
	public Money plus(long amount);
}

강제 다형성은 언어가 지원하는 자동적인 타입 변환이나 사용자가 직접 구현한 타입 변환을 이용해 동일한 연산자를 다양한 타입에 사용하는 것이다. 파이썬에서 1 + 1 은 2지만 ‘1’ + ‘1’ 은 ‘11’ 인 것과 같은 경우를 말한다.

매개변수 다형성제네릭과 관련이 높다. 인스턴스 변수나 매개변수 타입을 임의의 타입으로 선언한 후 사용하는 시점에 구체적인 타입으로 지정하는 방식을 가리킨다. 자바의 컬렉션은 요소 타입을 T로 지정한다.

포함 다형성은 메시지가 동일해도 수신한 객체의 타입에 따라 실제 수행되는 행동이 달라지는 능력이다. 서브타입 다형성이라고도 부른다. 흔히 객체지향에서 다형성을 말할 때는 포함 다형성을 의미한다.

이번 장에서는 다형성의 다양한 측면 중 포함 다형성에 대해 중점적으로 다룰 것이다. 목표는 포함 다형성의 관점에서 런타임에 상속 계층 내에서 적절한 메서드를 선택하는 방법을 이해하는 것이다. 비록 상속을 기준으로 설명하지만 본 개념들은 상속 이외에도 포함 다형성을 구현할 수 있는 다양한 방법에 공통적으로 적용할 수 있는 개념이다.

2. 상속의 양면성

다시 한 번 강조하지만 상속의 목적을 코드 재사용이 아니다. 상속은 프로그램을 구성하는 개념들을 기반으로 다형성을 가능하게 하는 타입 계층을 구축하기 위한 것이다. 이를 위해 상속의 메커니즘을 이해하는데 필요한 개념을 살펴본다.