티스토리 뷰

상속은 객체지향 언어에서 매우 중요한 역할을 한다. 객체지향 프로그래밍의 주요 3요소가 상속’, ‘캡슐화’, ‘다형성이라는 말까지 있을 정도이니 말이다. 상속은 사용하던 프로그램이 환경이나 다른 문제에 의해 사용하기 까다로운 상황이 되었을 때 프로그램 수정을 간단하게 하기 위해 사용한다. 보통 상속의 객체는 부모 객체자식 객체로 나뉘는데, 직관적으로 생각해도 부모가 자식을 여러 명 낳는 것은 문제가 되지 않지만, ‘자식이 부모를 둘, 셋 이상 가지는 것은 이상하다고 생각된다.(부모 객체가 아버지와 어머니를 모두 포함한다고 했을 때를 가정.) 하지만 그런 일이 현실에서도 아예 없는 것은 아니고, 역시 프로그래밍에서도 (특히 C++에서) 이것을 허용하며 이를 다중 상속이라고 한다.

다중 상속은 심각한 취약점을 가지고 있다고 평가되기도 한다. 다시 현실로 돌아와, 부모가 여럿이 있다고 생각해보면, 우선 족보가 매우 꼬이고 후에 유산의 문제가 생길 수 있다. 다중 상속에서도 이러한 문제가 생기는데, 이를 직관적으로 표현 한 것이 죽음의 다이아몬드(the Deadly Diamond of Death)’이다.

 자식 이기는 부모는 없다고, 자식 객체는 부모의 물건을 사용할 수 있다. 하지만 부모가 자식의 물건에 손을 대면 자식이 불같이 화를 내기 때문에(후레자식...) 부모 객체는 자식의 물건에 손을 대지 않는다. 한 객체의 자식 객체의 자식 객체가 있다고 했을 때, 최상위 부모 객체의 자식 객체가 1개가 아니라 2 이상일 수도 있다. 그리고 위에서 말했던 다중 상속이 일어나 위 그림과 같은 상황이 일어날 수도 있다. 위 그림을 살펴보면, 만약 ComboDrive에서 brun();을 사용했다면 CDBurnerDVDBurner, DigitalRecorder 중 어느 객체의 함수를 사용한 것일까? 아니 애초에 어느 객체의 함수를 사용할 것인 지 애매한 상황이 생긴다. 또한, i라는 변수에 접근을 한다면 도대체 어떤 부모함수를 거쳐 DigitalRecorder에 접근할지 애매한 상황이 생긴다. 프로그래밍 언어는 같은 구문이 두 가지 이상의 의미로 해석되지 않아야 한다.다중 상속은 이러한 문제를 야기할 수 있으며, 따라서 일부 프로그래머들에게 없어져야 할 문법이라는 비난을 받기도 한다. 물론 C++에서는 가상 상속이라는 개념을 이용하면서 이 다중 상속을 계속 이끌어 나가지만, 그럼에도 불구하고 사실상 최대한 사용하지 말아야 할 문법이라는 오명은 씻지 못하는 상황이다.



혹시 잘못된 내용이나 오류가 있다면 댓글로 알려주세요!! 공부를 위해 올린 글이니 태클은 언제나 환영입니다!!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함