Menu
Coddy logo textTech

믹스인의 on 키워드

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

때때로 믹스인은 자신이 믹스인되는 클래스의 메서드나 속성을 사용해야 할 때가 있습니다. on 키워드를 사용하면 특정 타입을 상속하는 클래스에서만 믹스인을 사용할 수 있도록 제한할 수 있습니다.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Animal의 'name'에 접근할 수 있습니다
    breathe();  // Animal의 메서드를 호출할 수 있습니다
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

on Animal 선언은 이 믹스인이 Animal을 확장하는 클래스에만 적용될 수 있음을 의미합니다. 이는 믹스인이 Animal의 멤버에 접근할 수 있음을 보장합니다. on이 없으면, 믹스인은 name이나 breathe()가 존재하는지 알 수 없습니다.

제한된 믹스인을 호환되지 않는 클래스에 사용하려고 하면, Dart는 컴파일 타임 오류를 발생시킵니다:

class Robot with Swimming {}  // 오류! Robot이 Animal을 상속하지 않습니다

이 제약 조건은 믹스인(mixin)의 기능이 기본 클래스의 특정 기능에 의존할 때 유용합니다. 이는 더 안전한 계약을 생성합니다. 즉, 믹스인은 특정 동작을 보장하지만, 올바르게 작동하는 데 필요한 기반이 갖춰진 경우에만 해당됩니다.

challenge icon

챌린지

쉬움

on 키워드가 믹스인(mixin)을 특정 베이스 클래스에서만 작동하도록 제한하는 방법을 보여주는 차량 시스템을 구축해 보겠습니다. 터보 부스트 기능을 추가하는 믹스인을 만들되, 이 믹스인은 Vehicle 베이스 클래스를 상속받는 클래스에서만 사용할 수 있도록 제한할 것입니다.

코드를 두 개의 파일로 구성합니다:

  • vehicles.dart: 베이스 클래스, 제한된 믹스인, 그리고 차량 타입을 여기에 정의합니다:
    • String model 속성과 int speed 속성을 가진 Vehicle 클래스. 두 값을 모두 받는 생성자를 포함하세요. [model] accelerating to [speed] km/h를 출력하는 accelerate() 메서드를 추가하세요.
    • on 키워드를 사용하여 Vehicle로 제한된 TurboBoost 믹스인. 이 믹스인은 [model] TURBO ACTIVATED!를 출력한 다음 accelerate()를 호출하는 activateTurbo() 메서드를 가져야 합니다 (두 요소 모두 on Vehicle 제약 조건 덕분에 접근 가능합니다).
    • Vehicle을 상속받고 TurboBoost 믹스인을 사용하는 SportsCar 클래스. String color 속성을 추가하세요. 생성자는 model, speed, color를 인자로 받아야 합니다. [color] [model] ready to race!를 출력하는 showOff() 메서드를 포함하세요.
  • main.dart: vehicles 파일을 임포트하고 제한된 믹스인이 어떻게 작동하는지 보여줍니다:
    • model은 'Ferrari', speed는 320, color는 'Red'SportsCar를 생성합니다.
    • showOff()를 호출합니다.
    • activateTurbo()를 호출합니다.

TurboBoost 믹스인은 on Vehicle 선언을 통해 Vehicle을 상속받는 클래스에만 믹스인될 것임을 보장받기 때문에 model에 접근하고 accelerate()를 호출할 수 있습니다. 이는 믹스인이 어떤 기능을 사용할 수 있는지 정확히 알고 있는 안전한 계약을 생성합니다.

예상 출력:

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

치트 시트

on 키워드는 믹스인(mixin)을 특정 타입을 상속하는 클래스에서만 사용할 수 있도록 제한합니다. 이를 통해 믹스인은 기본 클래스의 메서드와 속성에 안전하게 접근할 수 있습니다.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Animal의 'name'에 접근 가능
    breathe();  // Animal의 메서드 호출 가능
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

on Animal 선언은 믹스인이 Animal의 멤버에 접근할 수 있음을 보장합니다. 이것이 없으면 믹스인은 name이나 breathe()가 존재하는지 알 수 없습니다.

호환되지 않는 클래스에서 제한된 믹스인을 사용하려고 하면 컴파일 타임 에러가 발생합니다:

class Robot with Swimming {}  // 에러! Robot은 Animal을 상속하지 않습니다

이 제약 조건은 믹스인의 기능이 기본 클래스의 특정 기능에 의존할 때 유용하며, 믹스인과 이를 사용하는 클래스 사이에 더 안전한 계약을 생성합니다.

직접 해보기

import 'vehicles.dart';

void main() {
  // TODO: model 'Ferrari', speed 320, color 'Red'인 SportsCar를 생성하세요
  
  // TODO: showOff()를 호출하세요
  
  // TODO: activateTurbo()를 호출하세요
}
quiz icon실력 점검

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

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