프로그래밍언어/파이썬[중급]

[파이썬][중급] Chapter04. 다중 상속과 MRO 이해

about_IT 2025. 5. 18. 21:35
728x90

파이썬은 다중 상속(Multiple Inheritance)을 지원하는 언어로, 하나의 클래스가 둘 이상의 부모 클래스를 상속받을 수 있습니다. 다중 상속은 유연한 설계가 가능하게 하지만, 메서드 호출 순서를 명확히 이해하지 않으면 예기치 않은 동작을 유발할 수 있습니다.


● 다중 상속이란?

하나의 클래스가 여러 클래스로부터 속성과 메서드를 상속받는 것을 말합니다. 파이썬에서는 클래스 정의 시 괄호 안에 여러 부모 클래스를 나열하면 됩니다.

class A:
    def greet(self):
        print("Hello from A")

class B:
    def greet(self):
        print("Hello from B")

class C(A, B):
    pass

위의 예제에서 C 클래스는 A와 B를 동시에 상속받습니다. 이때 C().greet()을 호출하면 어떤 클래스의 메서드가 실행될까요? 이것이 바로 MRO(Method Resolution Order)의 개념입니다.


● MRO(Method Resolution Order)

MRO는 클래스 상속 관계에서 메서드나 속성을 검색하는 순서를 의미합니다. 파이썬은 C3 선형화 알고리즘을 사용하여 이 순서를 결정합니다.

print(C.mro())  # [C, A, B, object]

즉, C 클래스에서 메서드를 찾을 때 A → B → object 순으로 검색합니다. 따라서 위 예제에서는 A 클래스의 greet 메서드가 호출됩니다.


● super() 함수와 MRO

다중 상속에서 super()는 MRO에 따라 다음 클래스의 메서드를 호출하는 방식으로 동작합니다. 이를 통해 중복 호출을 방지하고 확장 가능한 구조를 만들 수 있습니다.

class A:
    def greet(self):
        print("A")
        super().greet()

class B:
    def greet(self):
        print("B")

class C(A, B):
    def greet(self):
        print("C")
        super().greet()

C().greet()

출력 결과는 C → A → B 순으로 실행됩니다. 이는 C3 MRO 순서에 따른 것입니다.


● 주의할 점

  • 다중 상속 시 이름 충돌이 발생할 수 있으므로 구조를 명확히 설계해야 합니다.
  • 가능하면 공통 기능은 상위 추상 클래스에, 특수 기능은 하위 클래스에 구현합니다.
  • super()는 항상 MRO 순서를 따른다는 점을 기억하세요.

● 마무리

다중 상속은 강력하지만 신중하게 사용해야 하는 도구입니다. MRO의 개념을 명확히 이해하면 복잡한 클래스 구조 속에서도 예측 가능한 동작을 설계할 수 있습니다.

728x90