다중 믹스인 사용하기
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
}B가 A 뒤에 오기 때문에, B의 greet() 메서드가 우선순위를 가집니다. 이러한 레이어링 동작을 통해 복잡한 상속 계층 구조 없이 여러 소스의 기능을 결합하여 필요한 기능을 정확히 갖춘 클래스를 구성할 수 있습니다.
챌린지
쉬움믹스인(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() 호출하기
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.