다시 한 번 말하지만 상속은 두 가지 용도로 사용된다.

첫 째, 타입 계층을 구현하기 위함, 타입 계창 안에서 부모 클래스는 일반적 개념을, 자식 클래스는 특수한 개념을 구현한다. 이 관점에서 부모는 자식의 일반화(generalization)이고 자식은 부모의 특수화(specialization)이다.

두 번째는 코드 재사용이다. 간단한 선언만으로 부모 클래스의 코드를 재사용할 수 있다. 허나 이 경우 부모 자식이 강하게 결합되어 변경하기 어려운 코드를 얻게 될 확률이 높다.

그렇기에 상속을 사용하는 일차적인 목표는 코드 재사용이 아니라 타입 계층을 구현하는 것이 되어야 한다. 상속의 가치는 타입 계층을 구현할 수 있는 쉽고 편안한 방법을 제공한다는 데 있다.

이번 장의 주제는 올바른 타입 계층을 구성하는 원칙이다.

1. 타입

개념 관점의 타입

이 관점에서 타입은 우리가 인지하는 세상의 사물의 종류다. 그리고 어떤 대상의 타입으로 분류될 때 그 대상을 타입의 인스턴스라고 부른다. 그리고 타입의 인스턴스를 객체라고 한다.

프로그래밍 언어 관점의 타입

이 관점에서 타입은 연속적인 비트에 의미와 제약을 부여하기 위해 사용되고 두 가지 목적을 위해 사용된다.

  1. 타입에 수행될 수 있는 유효한 오퍼레이션 집합을 정의하기 위해 → 자바에서 + 연산자는 숫자, 문자열엔 가능하나 다른 클래스의 인스턴스에서는 사용할 수 없다.
  2. 타입에 수행되는 오퍼레이션에 대해 미리 약속된 문맥을 제공한다. → a, b가 숫자라면 +가 두 수를 더할 것이고 String이라면 두 문자열을 하나로 합친다. 이렇게 타입이 연산자의 문맥을 정의하게 된다.

정리하면 타입은 적용 가능한 오퍼레이션의 종류와 의미를 정의해 코드의 의미를 명확하게 전달하고 개발자의 실수를 방지하기 위해 사용된다.

객체지향 패러다임 관점의 타입

위에서 본 타입의 정의를 객체지향 패러다임 관점에서 보자.

타입 in 프로그래밍 == 호출 가능한 오퍼레이션의 집합 오퍼레이션 in OOP == 객체가 수신할 수 있는 메시지의 종류