기억을 지배하는 기록

Dart 믹스인 (Mixin) 본문

Flutter for Beginners

Dart 믹스인 (Mixin)

Andrew's Akashic Records 2025. 2. 25. 16:52
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
Comments