Home 다중 상속에서 다이아몬드 문제란?
Post
Cancel

다중 상속에서 다이아몬드 문제란?

다중 상속이란?

다중 상속은 객체 지향 프로그래밍에서 한 클래스가 둘 이상의 클래스로부터 상속을 받을 수 있는 기능으로 이러한 다중 상속은 딱봐도 유리해보이지만 동시에 다이아몬드 문제라는 주요한 문제점을 발생시킬 수 있다

다이아몬드 문제란?

여기서 다이아몬드 문제란 아래 설명을 보면 이해하기 쉬운데

1
2
3
4
5
    A
   / \
  B   C
   \ /
    D

두 개의 클래스 B와 C가 A 클래스를 상속받고 D 클래스가 B와 C를 동시에 상속받는 구조에서 A 클래스에 정의된 메서드나 변수에 접근하려고 할 때 B와 C 중 어느 경로를 통해 접근해야 하는지 모호하다는 문제이다

예를 들어 A 클래스에 walk() 메서드가 정의되어 있고 B와 C 클래스는 이를 오버라이드하지 않았다고 가정했을 때 D 클래스의 객체에서 walk()를 호출하면 B를 통해 호출해야 할지 C를 통해 호출해야 할지 결정할 수 없게 된다

해결 방법

이 문제를 해결하기 위해 언어들은 자체적인 방법을 각각 가지고 있는데

  • 명시적 경로 지정: 프로그래머가 D 클래스에서 A 클래스의 메서드나 변수에 접근할 때 사용할 경로를 명시적으로 지정하는 방법

  • 상속 순서: 클래스를 상속받는 순서에 따라 접근 경로를 결정하는 방법

  • 다중 상속 금지: 다중 상속을 아예 허용하지 않고 인터페이스를 사용하여 비슷한 기능을 제공하는 방법

  • 가상 상속: 하위 클래스에서 단 한 번만 기반 클래스의 인스턴스를 포함하게 하여 기반 클래스의 인스턴스가 중복으로 포함되는 것을 방지하는 방법

위와 같은 방법으로 언어들에서는 다이아몬드 문제를 방지하고 있다

This post is licensed under CC BY 4.0 by the author.

10월 4일 Today I Learned

10월 5일 Today I Learned