믹스인 소개
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 50번째.
Dart는 하나의 클래스만 확장(extend)할 수 있다는 것을 배웠습니다. 그리고 여러 인터페이스를 구현(implement)할 수는 있지만, 모든 코드를 직접 작성해야 합니다. 하지만 서로 관련이 없는 여러 클래스 간에 실제 구현 코드를 공유하고 싶다면 어떻게 해야 할까요? 이때 바로 믹스인(mixins)이 등장합니다.
믹스인(mixin)은 여러 클래스 계층 구조에서 코드를 재사용하는 방법입니다. 상속을 사용하지 않고도 클래스에 새로운 기능을 부여할 수 있도록, 어떤 클래스에든 "믹스인"할 수 있는 메서드와 속성의 묶음이라고 생각하면 됩니다.
mixin Swimming {
void swim() {
print('Swimming through the water');
}
}
class Duck with Swimming {
void quack() {
print('Quack!');
}
}
class Fish with Swimming {
void blowBubbles() {
print('Blub blub');
}
}
void main() {
var duck = Duck();
duck.quack();
duck.swim(); // 믹스인으로부터
var fish = Fish();
fish.swim(); // 동일한 구현, 다른 클래스
}with 키워드에 주목하세요. 이것이 클래스에 믹스인(mixin)을 적용하는 방법입니다. implements와 달리, 메서드를 직접 작성할 필요가 없습니다. 믹스인이 실제 코드를 제공하며, 클래스는 해당 기능을 자동으로 얻게 됩니다.
믹스인(Mixins)은 실제 문제를 해결합니다: Duck과 Fish는 상속을 통해 연결되어 있지 않지만, 둘 다 수영하는 동작이 필요합니다. 믹스인을 사용하면 코드를 한 번만 작성하고 필요한 곳 어디에서나 공유할 수 있습니다.
챌린지
쉬움믹스인(mixin)을 사용하여 서로 관련 없는 클래스 간에 동작을 공유하는 방법을 보여주는 악기 시스템을 만들어 보겠습니다. 조율 기능을 제공하는 믹스인을 만든 다음, 상속 관계가 없는 서로 다른 악기에 이를 적용해 볼 것입니다.
코드를 두 개의 파일로 구성합니다:
instruments.dart: 여기에 믹스인과 악기 클래스를 정의합니다:Tuning the instrument...를 출력하는tune()메서드와Tuning is perfect!를 출력하는checkTuning()메서드를 가진Tunable믹스인.Tunable믹스인을 사용하는Guitar클래스. 생성자가 있는String brand속성을 추가합니다.[brand] guitar strumming chords를 출력하는strum()메서드를 포함합니다.- 마찬가지로
Tunable믹스인을 사용하는Piano클래스. 생성자가 있는int keys속성을 추가합니다.Playing [keys]-key piano를 출력하는play()메서드를 포함합니다.
main.dart: 악기 파일을 임포트하고, 상속 관계가 없는 두 악기가 동일한 믹스인으로부터 어떻게 조율 기능을 얻는지 보여줍니다:- 브랜드가
'Fender'인Guitar를 생성합니다. 88개의 건반을 가진Piano를 생성합니다.- 기타의 경우:
tune()을 호출한 다음strum(), 그 다음checkTuning()을 호출합니다. - 빈 줄을 하나 출력합니다.
- 피아노의 경우:
tune()을 호출한 다음play(), 그 다음checkTuning()을 호출합니다.
- 브랜드가
Guitar와 Piano가 상속 관계가 전혀 없는 완전히 다른 악기임에도 불구하고, Tunable 믹스인을 통해 어떻게 동일한 조율 메서드를 얻게 되는지 확인해 보세요. 조율 코드를 한 번만 작성하면, 두 클래스 모두 with 키워드를 사용하여 이를 사용할 수 있습니다.
예상 출력:
Tuning the instrument...
Fender guitar strumming chords
Tuning is perfect!
Tuning the instrument...
Playing 88-key piano
Tuning is perfect!치트 시트
믹스인(mixin)은 상속을 사용하지 않고 서로 관련 없는 여러 클래스 간에 코드를 재사용하는 방법입니다. 이는 어떤 클래스에도 "믹스인"할 수 있는 메서드와 프로퍼티의 묶음입니다.
mixin 키워드를 사용하여 믹스인을 정의합니다:
mixin Swimming {
void swim() {
print('Swimming through the water');
}
}with 키워드를 사용하여 클래스에 믹스인을 적용합니다:
class Duck with Swimming {
void quack() {
print('Quack!');
}
}
class Fish with Swimming {
void blowBubbles() {
print('Blub blub');
}
}implements와 달리 메서드 구현을 직접 작성할 필요가 없습니다. 믹스인이 실제 코드를 제공하며, 클래스는 해당 기능을 자동으로 얻게 됩니다.
Duck과 Fish는 상속 관계가 아님에도 불구하고 이제 둘 다 swim() 메서드를 사용할 수 있습니다:
var duck = Duck();
duck.swim(); // 믹스인으로부터
var fish = Fish();
fish.swim(); // 동일한 구현, 다른 클래스직접 해보기
import 'instruments.dart';
void main() {
// TODO: 브랜드가 'Fender'인 Guitar 생성
// TODO: 건반이 88개인 Piano 생성
// TODO: 기타의 경우: tune(), strum(), checkTuning()을 차례로 호출
// TODO: 빈 줄 출력
// TODO: 피아노의 경우: tune(), play(), checkTuning()을 차례로 호출
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.