본문 바로가기
Flutter for Beginners

Dart 믹스인 (Mixin)

by Andrew's Akashic Records 2025. 2. 25.
728x90

Dart

Dart 믹스인 (Mixin)

MixinDart에서 다중 상속 없이 코드 재사용성을 높이는 방법입니다.
클래스에 추가적인 기능을 제공하면서도 클래스 계층 구조를 단순하게 유지할 수 있습니다.

1. Mixin 개념

  • 다중 상속이 불가능한 Dart에서 코드 재사용을 위해 사용됨
  • with 키워드를 사용하여 기존 클래스에 믹스인 기능 추가 가능
  • 상속(Inheritance)과 다름 (Mixin은 부모-자식 관계가 아님)
  • 인터페이스(implements)와도 다름 (Mixin은 강제 구현 필요 없음)

2. Mixin 기본 문법

mixin Swimmable {
  void swim() {
    print("수영할 수 있습니다. 🏊");
  }
}

class Fish with Swimmable {}

void main() {
  Fish fish = Fish();
  fish.swim(); // 수영할 수 있습니다. 🏊
}
수영할 수 있습니다. 🏊
  • Fish 클래스는 Swimmable 믹스인을 가져와 swim() 메서드를 사용할 수 있음

3. Mixin을 여러 개 추가하기

여러 개의 믹스인을 사용할 수도 있습니다.

mixin Swimmable {
  void swim() {
    print("수영할 수 있습니다. 🏊");
  }
}

mixin Flyable {
  void fly() {
    print("날 수 있습니다. 🕊️");
  }
}

class Duck with Swimmable, Flyable {}

void main() {
  Duck duck = Duck();
  duck.swim(); // 수영할 수 있습니다. 🏊
  duck.fly();  // 날 수 있습니다. 🕊️
}
수영할 수 있습니다. 🏊
날 수 있습니다. 🕊️
  • Duck 클래스는 Swimmable과 Flyable 믹스인을 가져와 두 기능을 모두 사용할 수 있음

4. Mixin과 상속(extends)의 차이

4.1. 상속 (extends)

  • 부모 클래스로부터 모든 속성과 메서드를 상속받음
  • 단일 상속만 가능 (extends는 한 개의 부모 클래스만 가질 수 있음)
class Animal {
  void eat() {
    print("먹을 수 있습니다. 🍽️");
  }
}

class Dog extends Animal {}

void main() {
  Dog dog = Dog();
  dog.eat(); // 먹을 수 있습니다. 🍽️
}

4.2. Mixin (with)

  • 믹스인은 클래스와 관계없이 기능을 추가할 수 있음
  • 다중 믹스인 가능 (여러 개 사용 가능)
mixin Barkable {
  void bark() {
    print("짖을 수 있습니다. 🐶");
  }
}

class Dog with Barkable {}

void main() {
  Dog dog = Dog();
  dog.bark(); // 짖을 수 있습니다. 🐶
}
  • 믹스인은 기존 클래스를 변경하지 않고도 기능을 확장할 수 있음

5. Mixin 내부에서 super 사용

믹스인은 super 키워드를 통해 상속받은 클래스의 메서드를 오버라이드할 수도 있습니다.

class Animal {
  void move() {
    print("이동 중...");
  }
}

mixin Flyable on Animal {
  @override
  void move() {
    super.move();
    print("날아갑니다! 🕊️");
  }
}

class Bird extends Animal with Flyable {}

void main() {
  Bird bird = Bird();
  bird.move();
}
이동 중...
날아갑니다! 🕊️
  • Mixin에서 super를 사용하면 부모 클래스의 메서드를 호출할 수 있음

6. Mixin을 특정 클래스에서만 사용 (on 키워드)

Dart에서는 on 키워드를 사용하여 믹스인이 특정 부모 클래스를 상속한 경우에만 사용되도록 제한할 수 있습니다.

class Animal {
  void move() {
    print("이동 중...");
  }
}

// Bird 또는 Animal을 상속한 클래스에서만 사용 가능
mixin Flyable on Animal {
  void fly() {
    print("날아갑니다. 🕊️");
  }
}

class Bird extends Animal with Flyable {} // 가능
class Fish extends Animal {} // 가능
// class Plane with Flyable {} // 오류 발생 (Animal을 상속하지 않음)

void main() {
  Bird bird = Bird();
  bird.fly(); // 날아갑니다. 🕊️
}
  • on Animal을 사용하면 Flyable 믹스인은 Animal을 상속한 클래스에서만 사용 가능
  • Plane 클래스는 Animal을 상속하지 않으므로 Flyable을 사용할 수 없음

7. Mixin을 활용한 실전 예제

Mixin을 사용하여 여러 개의 역할을 조합할 수 있습니다.

mixin Walkable {
  void walk() {
    print("걸을 수 있습니다. 🚶");
  }
}

mixin Runnable {
  void run() {
    print("뛸 수 있습니다. 🏃");
  }
}

class Person with Walkable, Runnable {}

void main() {
  Person person = Person();
  person.walk(); // 걸을 수 있습니다. 🚶
  person.run();  // 뛸 수 있습니다. 🏃
}
  • Mixin을 사용하면 중복 없이 여러 기능을 조합하여 사용할 수 있음

8. Mixin vs 인터페이스 (Interface)

특징 Mixin Interface
목적 기능 추가 강제 구현
사용법 with 사용 implements 사용
메서드 구현 선택 사항 반드시 구현해야 함
다중 사용 여러 개 가능 여러 개 가능

 

인터페이스(Interface) 예제

abstract class Animal {
  void makeSound(); // 구현 강제
}

class Dog implements Animal {
  @override
  void makeSound() {
    print("멍멍! 🐶");
  }
}

void main() {
  Dog dog = Dog();
  dog.makeSound(); // 멍멍! 🐶
}
  • implements는 반드시 모든 메서드를 구현해야 함
  • Mixin은 with를 사용하여 기능을 추가할 뿐 강제하지 않음

9. Dart 믹스인(Mixin) 정리

개념 설명
Mixin 정의 mixin MixinName {}
Mixin 사용 class MyClass with MixinName {}
여러 개 사용 class MyClass with Mixin1, Mixin2 {}
on 키워드 특정 부모 클래스를 상속한 경우만 믹스인 가능
super 사용 부모 클래스의 메서드를 오버라이드할 때 사용 가능
인터페이스와 차이점 Mixin은 메서드 구현이 선택 사항, Interface는 강제 구현

 

728x90