Menu
Coddy logo textTech

다중 믹스인 사용하기

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 52번째.

여러 인터페이스를 구현할 수 있는 것과 마찬가지로, 하나의 클래스에 여러 믹스인(mixin)을 적용할 수도 있습니다. 쉼표로 구분하여 with 키워드 뒤에 나열하기만 하면 됩니다.

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

mixin Walking {
  void walk() => print('Walking');
}

class Duck with Swimming, Flying, Walking {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // Swimming 믹스인에서
  duck.fly();    // Flying 믹스인에서
  duck.walk();   // Walking 믹스인에서
  duck.quack();  // Duck 클래스에서
}

동일한 이름의 메서드가 있는 경우 믹스인(mixin)의 순서가 중요합니다. 목록의 마지막 믹스인이 우선권을 가집니다:

mixin A {
  void greet() => print('Hello from A');
}

mixin B {
  void greet() => print('Hello from B');
}

class MyClass with A, B {}

void main() {
  MyClass().greet();  // 출력: Hello from B
}

BA 뒤에 오기 때문에, Bgreet() 메서드가 우선순위를 가집니다. 이러한 레이어링 동작을 통해 복잡한 상속 계층 구조 없이 여러 소스의 기능을 결합하여 필요한 기능을 정확히 갖춘 클래스를 구성할 수 있습니다.

challenge icon

챌린지

쉬움

믹스인(mixins)을 통해 여러 기능을 결합하는 스마트 홈 장치 시스템을 구축해 보겠습니다. 다양한 스마트 기능을 나타내는 서로 다른 믹스인을 만든 다음, 이 모든 기능을 함께 사용하는 장치를 만들어 볼 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • smart_features.dart: 서로 다른 스마트 홈 기능을 제공하는 세 가지 믹스인을 정의합니다:
    • voiceCommand(String command) 메서드를 가지고 Voice: [command]를 출력하는 VoiceControl 믹스인
    • connectWiFi(String network) 메서드를 가지고 Connected to [network]를 출력하는 WiFiEnabled 믹스인
    • Entering sleep mode...를 출력하는 enterSleepMode() 메서드와 Waking up!을 출력하는 wakeUp() 메서드를 가진 PowerSaver 믹스인
    그런 다음 이 세 가지 믹스인을 모두 사용하는 SmartSpeaker 클래스를 만듭니다. 생성자가 있는 String name 속성을 추가하고, [name] playing: [song]을 출력하는 playMusic(String song) 메서드를 포함하세요.
  • main.dart: 스마트 기능 파일을 임포트하고 스피커가 모든 기능을 어떻게 결합하는지 보여줍니다:
    • 'Echo'라는 이름의 SmartSpeaker를 생성합니다.
    • connectWiFi('HomeNetwork')를 호출합니다.
    • voiceCommand('Play jazz')를 호출합니다.
    • playMusic('Smooth Jazz Mix')를 호출합니다.
    • enterSleepMode()를 호출합니다.
    • wakeUp()을 호출합니다.

여러분의 SmartSpeaker는 단일 with 절을 통해 세 가지 믹스인 모두로부터 메서드를 얻게 되며, 이는 복잡한 상속 없이도 여러 믹스인을 통해 필요한 기능을 정확하게 구성하는 방법을 보여줍니다.

예상 출력:

Connected to HomeNetwork
Voice: Play jazz
Echo playing: Smooth Jazz Mix
Entering sleep mode...
Waking up!

치트 시트

클래스는 with 키워드 뒤에 쉼표로 구분하여 여러 개의 믹스인(mixin)을 나열함으로써 적용할 수 있습니다:

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

class Duck with Swimming, Flying {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // Swimming 믹스인에서 제공
  duck.fly();    // Flying 믹스인에서 제공
  duck.quack();  // Duck 클래스에서 제공
}

여러 믹스인에 동일한 이름의 메서드가 있는 경우, 리스트의 마지막에 있는 믹스인이 우선순위를 가집니다:

mixin A {
  void greet() => print('Hello from A');
}

mixin B {
  void greet() => print('Hello from B');
}

class MyClass with A, B {}

void main() {
  MyClass().greet();  // 출력: Hello from B
}

직접 해보기

import 'smart_features.dart';

void main() {
  // TODO: 이름이 'Echo'인 SmartSpeaker 생성하기
  
  // TODO: connectWiFi('HomeNetwork') 호출하기
  
  // TODO: voiceCommand('Play jazz') 호출하기
  
  // TODO: playMusic('Smooth Jazz Mix') 호출하기
  
  // TODO: enterSleepMode() 호출하기
  
  // TODO: wakeUp() 호출하기
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨