phpclass/객체모델2002. 12. 21. 15:24
다중 상속(Multiple Inheritance)
다중 상속이란?
다중 상속(multiple inheritance)은 자식클래스가 하나 이상의 부모클래스로부터 그 특성을 상속받는 것을 말합니다. 다중 상속된 자식클래스는 모든 부모클래스의 멤버변수 및 멤버함수의 특성을 다 가지게 되므로 부모클래스의 멤버변수 및 멤버함수를 사용할 수 있습니다.
다중상속의 필요성
객체지향 프로그래밍을 하다보면 많은 경우에 접하게 되는 것이 다중 상속 개념입니다. 다중 상속이야말로 특성 상속의 가장 기본적인 것이라고 할 수 있습니다.
 
< 다중 상속의 예 >
그림의 예에서 보듯이 서로 독립적인 4개의 클래스(더하기, 빼기, 곱하기, 나누기 클래스)로부터 멤버변수 및 멤버함수를 상속받은 계산기 클래스가 만들어지게 됩니다.
다중 상속으로 생기는 문제점
다중 상속이 가진 문제점은 클래스 상속 구조가 매우 복잡해지고, 멤버 특성의 상속 관계가 모호해 진다는 것입니다.
예를 들면, 만일 동일한 이름의 멤버변수 x가 더하기, 빼기 클래스에서 각각 정의되어 있을 때 더하기, 빼기 클래스를 다중으로 상속받게 되는 계산기 클래스에서 멤버변수 x에 접근할 때 더하기 클래스에 있는 멤버변수 x에 접근해야 할지 아니면 빼기 클래스에 있는 멤버변수 x에 접근해야 할지 혼란이 발생하게 됩니다. 따라서 각 클래스에서 멤버변수를 정의할 때는 하위클래스에서 동일한 이름의 멤버변수를 참조할 경우를 대비하지 않으면 안됩니다. 이러한 문제는 멤버함수를 정의할 때도 동일하게 나타나는 문제입니다.
멤버변수의 경우라면 이러한 것을 방지할 목적으로 Zend 엔진 2.0부터 지원되는 private 멤버변수를 이용하는 것도 좋은 방법이라고 생각됩니다. 이와같이 멤버변수를 private로 지정할 경우에 자식클래스에서 동일한 이름의 멤버를 접근하는데 혼란이 발생하지는 않을 것입니다.
PHP에서의 다중 상속
Zend 엔진 1.0
Zend 엔진 1.0에서는 단일 상속에 관하여는 별문제없이 그 부모클래스의 특성을 상속받을 수 있습니다. 그러나 복수의 부모클래스의 특성을 상속받을 수는 없습니다. 이러한 다중상속의 문제는 웹사이트 구조가 복잡해 질 수록 절실해지게 되며, 자원(클래스)의 재사용이란 측면에서 볼 때도 꼭 필요한 기능이라고 할 수 있습니다.
Zend 엔진 2.0
다중 상속은 역시 객체지향 프로그래밍에서 뜨거운 감자인 것 같습니다. Zend Engine 2.0 설계 초안에서 포함되어 발표되었던 다중 상속 개념이 정식으로 릴리즈된 Zend 엔진 2.0 알파 버전에서는 쏙 빠져 버렸습니다. 다중 상속 개념이 Zend 엔진 2.0 정식 버전에 포함될 지는 미지수입니다.
2001년 11월경에 발표된 Zend 엔진 2.0 설계 초안에 의하면 다중 상속의 경우는 아래와 같이 표기될 것으로 보입니다.
[code php;gutter:false] class child extends parent1, parent2, … {

}; [/code]
자바에서는 오로지 단일 상속만 지원합니다. 단일 상속이 클래스 계층 구조를 단순화할 수 있기는 하지만 공통된 동작을 필요로 하는 계층 구조를 구현하기에는 매우 제한적이라는 문제가 발생하지요. 자바에서는 이러한 문제를 피하기 위해(해결하기 위해?) 인터페이스라는 계층구조를 제공합니다. 자바 인터페이스는 추상적인 메소드 정의와 상수만을 포함하고 있으며 멤버변수(인스턴스 변수) 또는 메소드를 구현하고 있지는 않습니다.
Zend 엔진 2.0이 기본적으로 자바의 객체 모델을 기반으로 설계되었다는 것이 이유가 될 지는 모르겠으나 Zend 엔진 2.0에서도 직접적으로 다중 상속을 지원하기 보다는 자바와 같이 인터페이스와 같은 별도의 계층구조를 지원하는 것은 어떨까 하는 생각이 듭니다.

Posted by 방글24