문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 상속(프로그래밍) (문단 편집) ==== 죽음의 다이아몬드 ==== [[파일:svvHZGt.jpg|width=400]] The Deadly Diamond of Death(DDD) C++에서 super 키워드가 없는 이유.[* super는 자신의 상위 클래스를 나타내는 키워드다. 예를 들어, 만약 이 예시를 단일 상속이라는 가정하에 DigitalRecorder가 CDBurner만 상속받은 상태였다면 DigitalRecorder의 super.burn()은 CDBurner의 burn()을 호출했을 것이다. 그러나 C++은 다중 상속이 허용된 프로그래밍 언어라, 위의 예시대로라면 DigitalRecorder의 super.burn()은 CDBurner의 burn()인지 아니면 DVDBurner의 burn()인지 모호해지기 때문에 super라는 키워드가 C++에 존재했었다고 해도 모호성에 의해 컴파일을 실패했을 것이며, 이런 이유 때문에 super 키워드가 존재하지 않는다. 다만, C++을 사용하는 프레임워크라고 무조건 super 키워드가 없는 것은 아니다. 예를 들면, [[언리얼 엔진]]은 C++을 스크립트 언어로 사용하는데도 super 키워드가 존재한다. 당연한 소리지만 이는 언리얼 엔진의 C++에서는 다중 상속을 허용하지 않는다는 의미다. 무엇보다도, C++은 다중 상속이 '허용'되어 있는 것 뿐이지, C++에서도 다중 상속을 하는 걸 추천하지 않는다.] [[프로그래밍 언어]]란 [[컴퓨터]]에게 내릴 명령을 순서대로 정리해 놓은 문서라고 볼 수 있으며, 가장 중요한 특징 중 하나는 '''같은 구문이 두 가지 이상의 의미로 해석될 여지가 있어서는 안 된다'''[* 이를 프로그래밍 용어로 '''모호성''' 이라고 표현한다.]라는 것이다. 그런데 다중 상속이 허용될 경우 이러한 상황이 발생할 가능성이 있으며, 그 중 한 예가 바로 위의 그림과 같은 "죽음의 다이아몬드"이다. 예를 들어 '[[사람]]'이라는 기본 클래스가 있고, 여기에는 '성격()'과 '키()' 메소드가 있다. 이제 '사람' 클래스를 상속받은 '[[아빠]]'와 '[[엄마]]' 클래스가 있고, 이 둘을 동시에 상속받은 '[[자식]]' 클래스가 있다고 하자. 이렇게 되면 '자식' 클래스에서 '성격()' 혹은 '키()' 메소드를 호출할 때 '''어느 부모의 메소드를 따라야 하는지가 한 가지로 명확히 정해지지가 않는다.''' 예컨대 프로그래머는 '아빠'의 "키()" 메소드를 따르고 "엄마"의 "성격()" 메소드를 따르는 것을 의도했지만 전혀 의도하지 않은 정반대의 결과물이 나올 가능성이 존재한다는 것. 이것이 바로 '죽음의 다이아몬드'이다. 상속 관계가 마름모꼴(다이아몬드 형)으로 생겼다고 해서 붙여진 이름. C#(.net)하고 Java에선 이것을 방지하기 위해 다중상속 자체를 제한해 놨다. 상속은 기본적으로 일반 클래스는 무조건 하나만 가능하다. 두개의 이상의 클래스를 상속받는 상황을 보조하기위해 추상메소드라는 개념이 있다. 다만 이름과 의미만 정해져 있고 실제 내용없는 빈 깡통으로 정의되며, 여차하면 내용을 참고하지 않으므로 문제를 일으키지 않는다. 예를들어 인터페이스는 추상 메소드만 모아놓은 것이기 때문에 실질적으로 쓰이는 것은 하위 클래스에서 실질적으로 구현된 유일한 메소드 뿐이지, 단순히 메소드 이름만 가진걸로는 아무련 효과가 없다. 즉 실제 내가 무언가 만들기 전까지 아무런 일도 하지 않으므로 죽음의 다이아몬드고 뭐고 뭘 호출할지 모호함이 발생할 여지를 만들지 않는 개념이다. 물론 추상 메소드만 쓰는 인터페이스 특성상 클래스마다 똑같은 기능을 매번 구현해야 하고 이로 인해 코드의 재사용성이 크게 저하되는 문제점이 있다. 결국 이름만 지정된 아무것도 아닌 메소드를 구현하는건 다른클래스에 똑같은걸 그대로 구현하는것과 실질적으로 같은 모양새인 셈. 이 문제 때문에 최근에 나오는 언어들은 트레이트나 믹스인 같이 일반 메소드가 있어도 다중 상속이 가능한 모델을 고안하고 있다. 위의 죽음의 다이아몬드에 대한 해결책도 새로 나온게 있는데, 바로 상속의 우선순위를 두는 것이다. 앞에 오는 클래스의 메소드만 상속하고 그 외의 클래스의 메소드는 무시해 버리는 것. [[Python]]이 이런 방식으로 구현되어 있다. 기존의 다중 상속 방식이 수학적으로는 클래스의 [[집합]] 위에 정의해야 했다면, 이런 방식은 클래스의 [[수열]] 위에 정의하였다고 볼 수 있다. 이런 경우 앞의 모호함 문제는 해결되지만 상속되는 클래스들의 순서가 바뀌면 가변하는 부분도 있는 등, [[프로그래머]]가 생각해야 할 부분이 늘어난다. 아니면 아예 상속을 받지 않는 조상 객체만 다중 상속이 가능하게 해도 공통 조상이 존재할 수 없어지기 때문에 죽음의 다이아몬드를 방지하는게 가능하다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기