ComputerProgrammingwithGNUSmalltalk:5.2
상속
인간은 무언가를 분류하는 것을 좋아합니다. 분류를 하면 짜임새가 생기게 되고, 짜임새 있는 것은 다루기가 쉽습니다. 비슷한 것들은 모여서 그룹(혹은 분류)를 만들고, 그 그룹의 특성들 중에는 다른 그룹에는 없는 것이 있을 것입니다. 우리는 유사성에 따라 어떤 그룹들을 같이 모을 수도 있습니다. 이러한 과정은 모든 다른 그룹의 조상이라는 하나의 큰 그룹으로 도달할 때까지 계속됩니다. 이것은 실제로 삶의 시뮬레이션 그 자체입니다.
위에서 말한 요소는 객체이며, 그룹은 클래스입니다. 요소에 대하여 가장 일반적으로 사용하는 표현은 무엇일까요? 그 답은 객체입니다. 우리는 모든 것을 객체라고 부를 수 있으며, 이들 객체로부터 특별한 종류의 객체를 이끌어 내어 우리는 자동차, 집, 동물 등과 같은 이름을 붙입니다. 이들 객체로부터 특별한 종류의 객체를 이끌어 내어 우리는 자동차, 집, 동물 등과 같은 이름을 붙입니다. 따라서 우리가 자동차, 집, 동물을 부를 때, 실제로는 클래스에 관하여 말하고 있는 것입니다.
이 다이어그램에서 각 노드는 클래스를 표현합니다. 어떤 클래스는 다른 클래스로부터 도출하였습니다. 가지들은 다른 클래스로부터 도출하였다는 것을 표현하기 위한 것입니다. 예를 들어, Class2, Class3 그리고 Class4는 모두 Class1으로부터 도출하였습니다. 또한 Class5, Class6, Class7은 Class2로부터 도출하였습니다. 그리고 마지막으로 Class8과 Class9는 Class4로부터 도출하였습니다. 클래스간의 이러한 관계를 나타내기 위해 두가지 정의를 만들 것입니다.
다른 클래스로부터 도출해 낸 클래스들을 도출해 내는데 사용한 클래스의 하위클래스subclass 라고 부릅니다. 예를 들어, Class2, Class3와 Class4는 모두 Class1의 하위 클래스들입니다. 또한 Class5, Class6 그리고 Class7은 모두 Class2의 하위클래스입니다.
모든 클래스는 자신의 하위클래스의 상위클래스superclass입니다. 예를 들어, Class1은 Class2, Class3, Class4의 상위 클래스입니다.
도출한 클래스(하위 클래스)들은 그들의 조상(상위클래스)의 모든 속성과 동작을 상속받습니다.
위의 다이어그램에서 어떤 클래스들은 하위 클래스를 가지고 있으며, 모든 클래스는 Class1을 제외하고 상위클래스를 가지고 있다. 클래스들은 하나 이상의 하위클래스들을 가질 수는 있어도, 여러 개의 상위클래스를 가질 수는 없습니다.
아래의 예제 그림은 객체 개념의 관점에서 자동차와 비행기를 어떻게 생성하는지 보여주고 있습니다.
이 그림에서 각 노드는 클래스를 나타냅니다. 8개의 클래스가 있으며, 각각 Object, Engine, Body, Wing, Tire, Vehicle, Car, Plane이라고 이름붙였습니다. Engine, Body, Wing 그리고 Vehicle은 모두 Object의 모든 하위 클래스입니다. Car와 Plane은 Vehicle의 하위클래스입니다. 하나의 클래스는 다른 클래스들의 인스턴스로 구성할 것입니다. Vehicle, Car, Plane 클래스 안의 그러한 예제를 봅시다. Vehicle 클래스는 Engine과 Body 클래스의 인스턴스를 갖고 있습니다. Car와 Plane 클래스들은 Vehicle의 하위클래스이기 때문에 상위클래스인 Vehicle의 모든 속성과 행동을 상속받습니다. Engine과 Body 객체들을 상속받은 후, 두 객체를 구분하기 위해 Car 클래스에는 4개의 Tire 객체들을 추가하고, Plane 클래스에는 두 개의 Wing 객체를 추가합니다.
상속에 관한 혼란을 피하기 위해 만들 두 가지 개념이 있습니다. 그것들은 아마도 객체들간의 두 가지 관계일 것입니다. 먼저 객체는 다른 객체로부터 도출할 것입니다. 이것을 is-a 관계라고 부릅니다. 예를 들어, Car는 Vehicle입니다 (Car is a Vehicle). 다음으로 객체는 다른 객체들로 이루어져 있습니다. 이러한 관계를 has-a 관계라고 부릅니다. 예를 들어, Vehicle은 Body를 가지고 있습니다 (Vehicle has a Body).
상속 개념은 is-a 관계와 관련이 있으며, has-a 와는 관련이 없습니다.
다중 상속과 단일 상속
어떤 프로그래밍 언어는 프로그래머가 하나 이상의 클래스로부터 속성과 동작을 상속받는 클래스를 만들 수 있도록 허용합니다. 따라서, 어떤 클래스들은 하나 이상의 상위클래스를 갖습니다. 이를 다중 상속 이라고 합니다. 다른 상속 형식은 오로지 하나의 상위클래스만을 허용합니다. 이를 단일 상속single inheritance이라고 합니다.
아주 이전에 주어졌던 예제는 단일 상속이었으며, 앞으로 나올 예제들도 단일 상속일 것입니다. 왜냐하면 스몰토크는 클래스를 다루기 위해 단일 상속만을 사용하기 때문입니다. 이 부분은 객체 지향 설계에서 다중 상속이 필요한지 아니면 단순히 상속을 더욱 복잡하게 할지 아직도 논란의 여지가 많습니다.