본문 바로가기
개발

[파이썬&루비] 다중상속(Multiplex Inheritance)

by 마스터누누 2017. 6. 2.
728x90
반응형

다중상속(Multiplex Inheritance)




기존에 부모 객체로 부터 메소드를 받을 수 있는 것을 상속이라고 하며,

여러개의 부모객체로 부터 상속을 받는 것을 다중 상속이라고 한다.

객체 지향을 하는 언어들이 모두 다중 상속을 지원 하는 것은 아니며, 대부분은 지원하지 않는다.

이유는 죽음의 다이아몬드라는 다중상속의 크나큰 단점때문인데,

이 때문인지 몰라도 루비에서는 다중상속을 지원하지 않고 파이썬에서는 지원한다.

대신 루비에서는 Mixin이라는 기능을 이용해서 비슷한 목적을 이룰수 있다.

따라서 이번에는 파이썬 코드만 보도록 하겠다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# python
class C1():
    def c1_m(self):
        print("c1_m")
    def m(self):
        print("C1 m")
 
class C2():
    def c2_m(self):
        print("c2_m")
    def m(self):
        print("C2 m")
 
class C3(C2, C1):
    def m(self):
        print("C3 m")
 
= C3()
c.c1_m()
c.c2_m()
c.m()
print(C3.__mro__)
cs


C3는 C1과 C2로부터 상속을 받는다.

따라서 C3의 뒤쪽에 C1과 C2를 명시해줌으로써 상속을 받게 된다.

이로인해 기존에 부모객체가 가지고 있던 모든 메소드를 사용할 수있게되며,

C1이 가지고 있는 m이라는 메소드만 오버라이드 한 상태이다.

따라서 아래의 메소드 호출 코드 3줄은 모두 정상적으로 동작하게 된다.


이렇게 다중상속은 상당히 편리한 기능을 제공하고 있는듯 하지만 제한적인 환경에서만 유용하다.

실제로 규모가 커진 상태에서 다중 상속을 사용하게되며면, 알수 없는 여러가지 문제점이 발생하기때문에

다중상속을 사용하는 부분에서는 상당히 신중해야한다.

이때문에 일부 언어들이 다중상속을 지원하지 않는 것이다.


그렇다면 다중상속이 일으킬수 있는 복잡한 상황들이란 어떤것일까.

만약 부모 객체에서 같은 이름의 메소드를 동시에 가지고 있다면 어떤것을 호출해야하는지 생각해보자.

자신이 만든 부모 객체가 아니면 내부 구조가 어떻게 이루어 져있는지 모르기때문에 상황이 더욱 복잡해진다.

또한 상속받는 부모객체도 부모가 있다면 상황은 걷잡을수 없이 악화된다.

소프트웨어는 조금의 조작 만으로도 금방 복잡해지기 때문에 이와같은 상황은 자주 일어날수 있다.


부모 객체에서 같은 이름의 메소드를 호출하면, 앞쪽에 등장한 부모객체의 우선 순위가 높다.

만약 객체.__mro__라는 명령어를 호출하면 우선순위를 확인할 수 있다.




출처 : 생활코딩, 파이썬&루비



반응형

댓글