다중상속의 필요성


안녕하세요. 다중상속에 대해서 좀더 알아보기 위해서 글을 남깁니다. 다중상속이라 함은 꼭 쓰지 말이야 하느냐 아님 필요에 따라서는 제네릭 같은과 조합해서 쓰는게 괜찮냐 이건데요 만약 쓰게된다면 얻을수 있는 이점 과 쓰지 말아야 한다면 단점에 대해서 논리정연하게 코드와 같이 실생활속 아이템과 비교해서 설명해 주실분 있나요?

감사합니다.


조회수 194


1 답변


넓은 의미에서는 모든 객체지향 언어가 다중상속을 지원합니다. 실제로 다중상속을 하지 않고, 설계를 끝낼 수 있는 경우는 극히 드문 경우입니다. 다만 기피해야 다중상속이 있습니다.

C++의 경우.

  1. 매우 폭 넓은 다중상속을 사용할 수 있습니다.
  2. base 클래스들에서 같은 이름을 사용하는 멤버가 있을 경우, 이를 지칭하기 위한 방법을 잘 사용해야 합니다.
  3. C++에서 다중상속과 관련하여 가장 잘 알려진 문제점은 다이아몬드 문제(2번과 관계있음)입니다.

Java의 경우.

  1. 언어적으로 Class의 종류를 구분하며, Class와 Interface가 이에 해당합니다. (interface는 C++의 pure virtual class와 유사하다고 이해하시면 됩니다.)
  2. C++의 다이아몬드를 피하기 위해서, Class의 경우는 다중상속을 못합니다. Interface는 다중상속이 가능합니다.

다중상속이 나쁜 것은 아닙니다. 다만, 다중상속으로 생길 수 있는 문제를 정확히 진단할 수 있고, 이를 피할 수 있는 수단이 마련되어 있지 않다면, 실수를 유발할 수 있습니다. 이 실수가 위의 다이아몬드 문제처럼, 다시 설계해야 하는 상황을 유도할 수 있기 때문에 주의를 요합니다.

실제로 Java의 경우 다이아몬드 문제와 같이 표현의 모순이 생기는 것을 막기 위해서 객체지향설계에 어느 정도 제약을 언어적으로 둔 것입니다.

제네릭

자바에서 Generic이 포함되는 경우, 다중상속에 대해 완전히 열려있지 않습니다. 사용 규칙에 대해서 명확히 이해하는 것이 좋습니다.

한 예로, 함수 시그니처에서 Generic 필드이름으로 구분하지 않습니다. 이는 T,E과 제니릭 변수라고 할 때, add(T item)과 add(E item)는 같은 함수 시그니처임으로 동시에 가질 수 없습니다.

언어의 장단점에 대한 태도

언어에서 제공하는 기술에 대한 장단점을 파악하는 것은 좋은 태도입니다. 하지만 언어에서 그러한 기능을 제공하는 것은 나름의 이유가 있습니다. 이를 제대로 이해하고 적재적소에 사용하는 것이 중요합니다.

  • "어떤 것은 단점이 많으니까 쓰지 말아야한다." 같은 생각은 성급한 판단이라고 생각합니다.
  • 그럼에도 불구하고 가급적 사용하지 않도록 권고하는 것은 대체로 사람들로 하여금 실수를 만들게 하는 것들이며, 이에 더해 이 실수를 쉽게 알아챌 수 없는 경우들입니다.
  • 개발자 본인과 같이 개발하는 동료들 간에 이해할 수 있는 방식으로 언어를 사용하시면 됩니다.
  • 2016년 06월 05일에 수정됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.
  • 2016년 06월 05일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close