검수요청.png검수요청.png

"다중상속"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
잔글
잔글 (같이 보기)
72번째 줄: 72번째 줄:
 
* [[상속]]
 
* [[상속]]
  
{{프로그래밍|토막글}}
+
{{프로그래밍|검토 필요}}

2020년 8월 31일 (월) 16:44 판

다중상속(multiple inheritance)은 객체 지향 프로그래밍에서 한 클래스가 한 번에 두 개 이상의 클래스를 상속받는 경우를 말한다. 다중상속을 받은 클래스의 경우 두 개 이상의 부모 클래스를 가지게 된다.

개요

다중상속(multiple inheritance)이란 객체 지향 프로그래밍의 특징 중 하나이며, 어떤 클래스가 하나 이상의 상위 클래스로부터 여러 가지 행동이나 특징을 상속받을 수 있는 것을 말한다. 다중상속을 허용하면 여러 클래스로부터 상속 받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있지만 프로그래밍을 복잡하게 만들 수 있기 때문에 실용성이 떨어진다.[1]

특징

다중 상속을 지원하게 되면 하나 이상의 상위 클래스로부터 여러가지 특징을 상속 받을 수 있다. 하지만 이러한 장점 때문에 상속 구조에 문제가 생겨 오히려 프로그래밍을 복잡하게 만들 수 있다는 특징을 가지고 있다.

C++

단일 상속과는 다르게 두 개 이상의 클래스를 하나가 동시에 상속받는 것으로 클래스를 선언할 때 클래스명 옆 : 연산자 뒤에 여러 개의 클래스를 콤마(,)로 나열한다.

class A{
   public:
       void sampleA(){
           cout<<"A : example"<<endl;
       }
};

class B{
   public:
       void sampleB(){
           cout<<"B : example"<<endl;
       }
};

class C : public A, public B{
   public:
       void sampleC(){
            sampleA();
            sampleB();
       }
};

int main(){
      C exampleC;
      exampleC.sampleC();
      
      return 0;
}

클래스 C에서 A와 B 클래스를 상속 받았다. 이 때 두 개 이상의 클래스를 동시에 상속받은 C는 다중 상속을 받았다고 하며 클래스A와 클래스B가 가지고 있는 속성들을 사용할 수 있다.

이 때 클래스A의 sampleA 함수와 클래스B의 sampleB 함수가 sample이라는 함수로 정의되어 있을 때 클래스 C에서 함수를 사용할 때 아래와 같이 작성이 되어 모호성이 발생한다.[2]

class C : public A, public B{
   public:
       void sampleC(){
            sample(); //A클래스의 sample
            sample(); //B클래스의 sample
       }
};

위와 같은 모호성 때문에 생기는 문제를 다이아몬드 문제라고 하는데 이는 구조가 다이아몬드 형태를 띄우고 있어 붙여진 이름이다.

다이아몬드 문제

다중상속문제.PNG

위의 클래스 다이어그램과 같은 상속 구조에서 발생되는 문제가 다이아몬드 문제이다. Grand라는 클래스에서 example이라는 메소드를 가질 때 상속을 받은 ParentsA와 ParentsB에서는 example이라는 메소드를 오버라이딩한다. 이 때 son에서 example이라는 메소드를 불러올 때 어떤 부모의 메소드를 불러와야 하는지 모호해져서 충돌이 생기게 된다. 이를 다이아몬드 문제라고 하는데 자바에서는 이러한 문제를 사전에 방지하기 위해서 다중 상속을 지원하지 않는다.

자바

자바는 다이아몬드 문제를 방지하기 위해 다중 상속을 지원하지 않는다. 하지만 이런 문제가 있음에도 불구하고 인터페이스를 통해 다중상속의 기능을 사용할 수 있다. 인터페이스를 이용한 다중 상속은 실제로 구현했을 때 아무런 문제를 발생시키지 않는다. 그 이유는 인터페이스의 기능 때문이다. 인터페이스는 메소드의 기능에 대해 선언만 해두기 때문에 다이아몬드 상속이 되더라도 충돌할 여지가 없다.[3]

각주

  1. 힘껏 날아 오르자!, 〈다중상속과 단일상속의 장단점〉, 《개인블로그》, 2009-03-11
  2. Pac, 〈상속의 마지막, 다중 상속(Multiple Inheritance)〉, 《개인블로그》, 2010-09-17
  3. 사용자 siyoon210, 〈자바는 왜 다중상속을 지원하지 않을까? (다이아몬드 문제)〉, 《개인블로그》, 2019-02-24

참고자료

같이 보기


  검수요청.png검수요청.png 이 다중상속 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.