Home Dart에서 mixin 다이아몬드 문제 처리
Post
Cancel

Dart에서 mixin 다이아몬드 문제 처리

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

여러 언어에서 다중 상속은 직접적으로 제공하지 않거나 특별한 규칙 또는 알고리즘으로 적용한다 이는 다중 상속으로 나타날 수 있는 다이아몬드 문제 때문인데

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

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

위 구조와 같이 두 개의 클래스 B와 C가 A 클래스를 상속받고 D 클래스가 B와 C를 동시에 상속받는 구조에서

A 클래스에 정의된 메서드나 변수에 접근하려고 할 때 B와 C 중 어느 경로를 통해 접근해야 하는지 모호하다는 문제이다 만약 자세히 다이아몬드 문제에 대해 알고 싶다면

해당 글 참고

Dart에서 다이아몬드 문제를 방지하는 법

Dart에서는 직접적으로 다중상속을 지원하지 않고 mixin를 통해 다중 상속과 비슷한 방식으로 코드 재사용을 가능하게 하지만, 명확한 규칙과 제한사항으로 다중 상속이 갖는 문제점을 회피하고 있다

그렇다면 Dart에서 다이아몬드 문제가 발생할 수 있는 코드를 사용하면 어떻게 될까?

코드로 함께 확인해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mixin Walk1 {
  void walk() {
    print("걷기1");
  }
}

mixin Walk2 {
  void walk() {
    print("걷기2");
  }
}

mixin Walk3 {
  void walk() {
    print("걷기3");
  }
}

class Human with Walk1, Walk2, Walk3 {}

void main() {
  Human human = Human();
  human.walk();
}

위 코드를 보면 다이아몬드 문제가 일어난다고 생각할 수 있으나 Dart에서는 위에서 말했던 것과 같이 명확한 규칙과 제한사항으로 다중 상속이 갖는 문제점을 회피하는데

Dart에선 마지막으로 포함된 mixin의 구현을 우선시 하는 방식으로 다이아몬드 문제를 방지하기에 위 코드에선 Walk3에 walk가 사용되어 걷기3가 출력된다

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