Dart의 인터페이스
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 45번째.
전용 interface 키워드가 있는 많은 언어와 달리, Dart는 다른 접근 방식을 취합니다. Dart에서는 모든 클래스가 자동으로 인터페이스를 정의합니다. 이 인터페이스는 클래스가 선언하는 모든 공개 멤버(메서드 및 속성)로 구성됩니다.
클래스가 구현을 상속받지 않고 특정 기능을 제공하겠다고 약속하게 하려면, implements 키워드를 사용합니다:
class Printer {
void printDocument(String content) {
print('Printing: $content');
}
}
class Scanner {
void scan() {
print('Scanning document');
}
}
// MultiFunctionDevice는 두 클래스의 모든 메서드를 구현해야 합니다
class MultiFunctionDevice implements Printer, Scanner {
@override
void printDocument(String content) {
print('MFD printing: $content');
}
@override
void scan() {
print('MFD scanning');
}
}extends와의 주요 차이점은 implements가 어떠한 코드도 상속하지 않는다는 것입니다. 인터페이스에 정의된 모든 메서드와 속성에 대해 직접 구현을 제공해야 합니다. 이것은 계약입니다. 클래스가 이러한 기능을 갖출 것임을 약속하는 것이지만, 구체적으로 어떻게 작동할지는 여러분이 결정합니다.
이 접근 방식은 Dart에 유연성을 제공합니다. 구현이 없는 인터페이스를 정의하고 싶을 때는 추상 클래스(abstract classes)를 사용하거나, 적절한 경우 일반 클래스를 인터페이스로 사용할 수 있습니다. 다음 레슨에서는 이 "암시적 인터페이스(implicit interface)" 개념이 어떻게 작동하는지 더 자세히 살펴봅니다.
챌린지
쉬움Dart에서 implements 키워드가 어떻게 작동하는지 보여주는 미디어 플레이어 시스템을 만들어 보겠습니다. 인터페이스 역할을 하는 클래스들을 생성하고, 여러 기능을 결합한 단일 장치에서 이를 구현해 볼 것입니다.
코드는 다음 두 개의 파일로 구성됩니다:
media.dart: 인터페이스 클래스들과 이를 구현하는 클래스를 여기에 정의합니다:Playing audio: [track]을 출력하는playAudio(String track)메서드를 가진AudioPlayer클래스Playing video: [title]을 출력하는playVideo(String title)메서드를 가진VideoPlayer클래스AudioPlayer와VideoPlayer를 모두 구현(implements)하는SmartTV클래스.implements는 어떠한 코드도 상속받지 않으므로, 두 메서드에 대해 직접 구현을 제공해야 합니다.SmartTV는 오디오의 경우SmartTV audio: [track]를, 비디오의 경우SmartTV video: [title]를 출력해야 합니다.
main.dart: 미디어 파일을 임포트하고 단일 클래스가 어떻게 여러 인터페이스를 구현할 수 있는지 보여줍니다:SmartTV인스턴스를 생성합니다.playAudio('Jazz Collection')를 호출합니다.playVideo('Nature Documentary')를 호출합니다.
SmartTV가 두 인터페이스의 모든 메서드에 대해 직접 구현을 제공해야 한다는 점에 주목하세요. AudioPlayer나 VideoPlayer로부터 원래의 구현을 상속받지 않습니다. 이것이 implements와 extends의 핵심적인 차이점입니다.
예상 출력 결과:
SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary치트 시트
Dart에서 모든 클래스는 모든 공개 멤버로 구성된 인터페이스를 자동으로 정의합니다. 코드를 상속받지 않고 인터페이스를 구현하려면 implements 키워드를 사용하세요:
class Printer {
void printDocument(String content) {
print('Printing: $content');
}
}
class Scanner {
void scan() {
print('Scanning document');
}
}
// 두 클래스의 모든 메서드를 반드시 구현해야 합니다
class MultiFunctionDevice implements Printer, Scanner {
@override
void printDocument(String content) {
print('MFD printing: $content');
}
@override
void scan() {
print('MFD scanning');
}
}extends와의 주요 차이점:
implements는 어떠한 코드 구현도 상속받지 않습니다- 모든 메서드와 속성에 대해 직접 구현을 제공해야 합니다
- 클래스는 여러 인터페이스를 구현할 수 있습니다
- 이는 클래스가 이러한 기능을 갖출 것임을 약속하는 계약입니다
직접 해보기
import 'media.dart';
void main() {
// TODO: SmartTV 인스턴스 생성
// TODO: playAudio('Jazz Collection') 호출
// TODO: playVideo('Nature Documentary') 호출
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.