Menu
Coddy logo textTech

믹스인 생성하기

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를 사용하여 믹스인을 적용하면, 해당 믹스인의 모든 멤버가 클래스의 일부가 됩니다. 클래스는 이들을 직접 사용할 수 있으며, 해당 클래스의 인스턴스를 가진 모든 코드도 마찬가지입니다. 이를 통해 상속 계층 구조의 복잡성 없이 재사용 가능한 기능을 추가하는 깔끔한 방법으로 믹스인을 활용할 수 있습니다.

challenge icon

챌린지

쉬움

메서드, 속성 및 게터를 포함하는 믹스인(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')를 호출합니다.

여러분의 믹스인은 믹스인이 기본값을 가진 속성, 값을 계산하는 게터, 그리고 서로를 호출할 수도 있는 여러 메서드를 포함할 수 있음을 보여줍니다. 두 메시지 클래스 모두 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')를 호출하세요
}
quiz icon실력 점검

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

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