믹스인 생성하기
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 51번째.
이제 믹스인(mixin)이 무엇인지 이해하셨으니, 이를 올바르게 생성하는 방법을 살펴보겠습니다. 믹스인은 class 대신 mixin 키워드를 사용하여 선언됩니다.
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}믹스인은 클래스와 마찬가지로 메서드, 속성, 그리고 게터(getters)와 세터(setters)까지 포함할 수 있습니다. 하지만 한 가지 중요한 규칙이 있습니다: 믹스인은 생성자(constructors)를 가질 수 없습니다. 믹스인은 직접 인스턴스화되기보다는 "믹스인"되도록 설계되었기 때문에 초기화 로직이 필요하지 않습니다.
mixin Timestamped {
DateTime createdAt = DateTime.now();
String get formattedTime => createdAt.toString();
void printTimestamp() {
print('Created at: $formattedTime');
}
}
class Document with Timestamped {
String title;
Document(this.title);
}
void main() {
var doc = Document('Report');
doc.printTimestamp(); // 믹스인의 메서드를 사용합니다
print(doc.createdAt); // 믹스인의 속성을 사용합니다
}with를 사용하여 믹스인을 적용하면, 해당 믹스인의 모든 멤버가 클래스의 일부가 됩니다. 클래스는 이들을 직접 사용할 수 있으며, 해당 클래스의 인스턴스를 가진 모든 코드도 마찬가지입니다. 이를 통해 상속 계층 구조의 복잡성 없이 재사용 가능한 기능을 추가하는 깔끔한 방법으로 믹스인을 활용할 수 있습니다.
챌린지
쉬움메서드, 속성 및 게터를 포함하는 믹스인(mixin)을 생성하는 방법을 보여주는 메시징 시스템을 구축해 보겠습니다. 서로 다른 유형의 메시지에 포맷팅 기능을 추가하는 믹스인을 설계하게 됩니다.
코드를 두 개의 파일로 구성합니다:
messaging.dart: 여기에 믹스인과 메시지 클래스를 정의합니다:- 다음 내용을 포함하는
Formattable믹스인:'>>>'로 초기화된String prefix속성' | '를 반환하는 게터separator[prefix][separator][text]문자열을 반환하는format(String text)메서드**[text]**를 반환하는formatBold(String text)메서드
Formattable믹스인을 사용하는TextMessage클래스. 생성자가 있는String sender속성을 추가합니다.[sender]: [content]를 인자로format()을 호출한 결과를 출력하는send(String content)메서드를 포함합니다.- 마찬가지로
Formattable믹스인을 사용하는AlertMessage클래스. 생성자가 있는String level속성을 추가합니다.[[level]] [formatBold(content)]를 인자로format()을 호출한 결과를 출력하는alert(String content)메서드를 포함합니다.
- 다음 내용을 포함하는
main.dart: 메시징 파일을 임포트하고 두 메시지 유형이 믹스인으로부터 포맷팅 기능을 어떻게 얻는지 보여줍니다:- sender가
'Alice'인TextMessage를 생성합니다. - level이
'WARNING'인AlertMessage를 생성합니다. - 텍스트 메시지에서
send('Hello there!')를 호출합니다. - 알림 메시지에서
alert('System overload')를 호출합니다.
- sender가
여러분의 믹스인은 믹스인이 기본값을 가진 속성, 값을 계산하는 게터, 그리고 서로를 호출할 수도 있는 여러 메서드를 포함할 수 있음을 보여줍니다. 두 메시지 클래스 모두 with 키워드를 사용하는 것만으로 이 모든 기능을 얻게 됩니다.
예상 출력:
>>> | Alice: Hello there!
>>> | [WARNING] **System overload**치트 시트
믹스인(Mixins)은 class 대신 mixin 키워드를 사용하여 선언합니다:
mixin Logging {
void log(String message) {
print('[LOG] $message');
}
void logError(String error) {
print('[ERROR] $error');
}
}믹스인은 메서드, 속성, 게터(getters), 세터(setters)를 포함할 수 있지만, 생성자(constructors)를 가질 수 없습니다:
mixin Timestamped {
DateTime createdAt = DateTime.now();
String get formattedTime => createdAt.toString();
void printTimestamp() {
print('Created at: $formattedTime');
}
}with 키워드를 사용하여 클래스에 믹스인을 적용합니다. 모든 믹스인 멤버는 클래스의 일부가 됩니다:
class Document with Timestamped {
String title;
Document(this.title);
}
void main() {
var doc = Document('Report');
doc.printTimestamp(); // 믹스인의 메서드를 사용합니다.
print(doc.createdAt); // 믹스인의 속성을 사용합니다.
}직접 해보기
import 'messaging.dart';
void main() {
// TODO: sender가 'Alice'인 TextMessage를 생성하세요
// TODO: level이 'WARNING'인 AlertMessage를 생성하세요
// TODO: text message에서 send('Hello there!')를 호출하세요
// TODO: alert message에서 alert('System overload')를 호출하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.