안녕하세요. 제라툴입니다 .간만에 저두 토론에 참가해보죠 ㅋ
무지한 저로서는 어느것이 옳은지 잘모르겠내요 ㅋ
다중 상속을 사용하냐 안사용하냐 꼭필요하냐 안필요하냐의 차이는 아마 개개인의 코딩 습관과
관련 된거겠죠. 아래 김백일님의 글을 보니까.
Observer, Adaptor, Bridge 패턴의 구현이 원칙적으로 불가능 하다고 하셨는데..
그건 아마 처음 패턴을 만든 분이 다중 상속을 하셔서 사용했기때문입니다.
다중상속을 하지 않고도 충분히 구현이 가능하죠 ..
실 예로 Adaptor 같은 경우는 Multiplex Inherited Adapter와 Object Adapter로 나누어서 설명되죠
또한 상속을 받아 구현 하는 경우 보는다는 Object Adapter쪽이 좀더 유연한 코드로 인정받는 것도
사실이구요 .
개인적으로 OCP패턴 중 Guard 패턴을 굉장히 많이 사용하는데 Guard 패턴 같은 경우는 여러개의 Guard를 한꺼번에 사용할 경우가 많기 때문에
다중상속을 많이 사용하죠.. 하지만 반드시 다중상속이 좋다는 예기는 아닙니다. 이건 어디까지나
제 개인적인 코딩 습관이니까요.
다중상속이 1989년에 C++로 도입된 이후로 굉장히 많은 논란이 있었던걸로 알고 있습니다.
주로 다중상속이 사용되는 경우는 두개이상의 객체에 특성을 모두 담아야 하는 경우가 아니면
거의 없다고 생각합니다. 다중상속을 사용하지 않더라도 조금 힘을 드려 이러한 것을 단일 구조로
바꿀수 있는 것도 사실이고요 ... 또한 다중상속에 결정적인 단점이라면 DDD( Dreadful Diamond of Derivation )을 들수 있겠죠.
대표적인 예 iostream의 경우죠
class ostream : virtual public ios { /*..*/ }
class istream : virtual public ios { /*..*/ }
class iostream : public istream, public ostream { /*..*/ }
ios로 부터 상속된 virtual 들이 iostream에 내에서 과연 단일 인스턴스로 존재 할수 있는가라는
원초적인 다중상속에 문제를 가지고 있죠...
문론 Non-Virtual로 되어 있을 수도 있으니로 반드시 이 예가 맞다고는 할 수 없습니다.
또한 Implement-Dependent 문제라는 거죠. 이렇하기 때문에 약간의 오버해드를 감소해야 한다는 단점이 있습니다.
만약 Non-Virtual로 구현 되어 있다면 더 원초적인 개념으로 들어가서 상속에 의미가 있는가라는 원초적인 문제를 생각해 볼수 있죠..
VC의 MFC가 욕을 먹는 이유중에 하나가 이 다중상속과도 관련이 있다는 생각이 드내요.
예를 들면 CWnd와 제가 만든 인터페이스 두개를 상속 받아서 구현을 하면..
class TMyClass : public TInterface1,
public TInterface2,
public CWnd
{
/* something override function */
};
이러식을 클래스를 설계한후 CWnd에 있는 Function을 Override한 그 Function에서 CWnd에 Function을 Call하게 되면 작살라죠 ..
아마도 VCL이 C++ Builder에서 다중상속된다면 이와 비슷한 문제가 생기게 될겁니다.
하지만 아까 언급한거와 같이 Object Acdapter처럼 포인터를 이용한 구현으로 이를 쉽게 극복 할수
있기때문에 VCL을 쓰는데 큰 문제가 없는거죠 ..
뭐가 맞다 뭐가 아니다라는 건 잘모르겠습니다. 그때 그때 얼마나 유용하게 활용 할수 있느냐가
큰 문제죠 ^^ 다중상속이나 템플릿을 사용하면 C++다운거구 그렇지 않으면 C++ 다운게 아니라는
생각 자체는 아마도 C++이라는 언어의 근본적인 이론에 어긋나는 말입니다.
C++이라는 언어는 객체지향이라는 개념이 만이 포함된 언어가 아니라 프로그래머에게 좀더 많은
자유를 주기위한 언어이기 때문에 C++다운 프로그램이라는 말자체가 잘못된말입니다.
아는거 없는 제라툴이 괴변 몇자를 적어 봅니다.
From Zeratul
ps 춘천의 밤은 참 아름 답군요 서울에서 별을 본다는건 나무나도 힘든 일인데..
|