[Dart]mixin

한상욱·2023년 1월 16일
0

Dart문법

목록 보기
13/15
post-thumbnail

mixin

오늘 포스팅할 내용은 mixin입니다. 지난 포스팅에서는 class의 상속에 대해서 알아보았습니다. class가 다른 class를 상속받으면 상속받은 class는 서브class이고, 상속을 해준 class는 슈퍼클래스라고 했습니다. 그렇다면, 여러개의 class를 상속받으면 어떻게 될까요?? 바로 이를 위해서 mixin을 사용합니다.

일반적인 mixin

지난 포스팅에서 이어서 게임 속 몬스터를 예시로 설명하겠습니다. 몬스터는 하나의 큰 범주일 뿐입니다. 실제로 게임속에서는 다양한 타입의 몬스터가 존재하는 것을 알 수 있습니다. 몬스터는 일단 날라다니는 몬스터와 날지 못하는 몬스터, 공격스킬을 사용할 수 있는 몬스터와 할 수 없는 몬스터 등등, 여러가지 갈래가 존재하겠군요. 이를 예시로 들겠습니다.

void main() {
  Monster a1 = A();
}

abstract class Monster {

}
class A extends Monster {
  
}

여기에 A라는 이름의 게임 속 등장인물이 있습니다. A는 바로 몬스터입니다. 몬스터라고 무조건 공격을 할 수 없다고 했으니, 저번 포스팅에서 적어놓은 attack 메소드는 더 이상 없습니다. 여기서 mixin을 사용해서 공격 가능, 비행 가능에 대해서 정의해서 A에게 전달해보겠습니다.

void main() {
  A a1 = A();
  Monster a2 = A();
  FlyMonster a3 = A();
  AttackMonster a4 = A();
  
  a1.attack();
  a1.skill();
  a1.fly();
  
  a2.attack();
  
  a3.fly();
  
  a4.skill();
}

mixin AttackMonster {
  void skill() {
    print('스킬 공격');
  }
}

mixin FlyMonster {
  void fly() {
    print('비행 중');
  }
}

class Monster {
  void attack() {
    print('공격');
  }
}
class A extends Monster with AttackMonster, FlyMonster {
  
}

이렇게 mixin을 이용해서 몬스터가 할 수 있는 기능을 정의해서 다중으로 상속시킬 수 있습니다. 여기서 중요한 것은 클래스 생성인데요. class를 생성하면 서브클래스, 슈퍼클래스, mixin 클래스로 모두 A를 정의할 수 있지만, 사용할 수 있는 기능에서 차이가 발생합니다. 당연히 서브클래스로 정의하면 모든 기능을 사용할 수 있고요. 그 외에 클래스로 정의하게 되면, 그 클래스의 기능만 사용할 수 있습니다.

profile
자기주도적, 지속 성장하는 모바일앱 개발자가 되기 위해

0개의 댓글