구현 vs 확장
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 47번째.
이제 extends와 implements를 모두 이해했으므로, 각각 언제 사용해야 하는지 명확히 알아보겠습니다.
동작을 상속하려면 extends를 사용하세요. 서브클래스는 부모의 모든 코드를 자동으로 물려받으며, 이를 기반으로 확장할 수 있습니다:
class Animal {
void breathe() {
print('Breathing...');
}
}
class Dog extends Animal {
void bark() {
print('Woof!');
}
}
void main() {
var dog = Dog();
dog.breathe(); // 상속됨 - 자동으로 작동함
dog.bark();
}코드를 상속하지 않고 구조를 보장하려면 implements를 사용하세요. 모든 메서드를 직접 작성해야 must 합니다:
class Robot implements Animal {
@override
void breathe() {
print('Ventilating circuits...'); // 완전히 커스텀 구현
}
}핵심적인 차이: extends는 "나는 이것의 한 유형이다"라고 말하는 반면, implements는 "나는 이것이 하는 일을 할 수 있다"라고 말합니다. Dog는 Animal이며 같은 방식으로 호흡합니다. Robot은 동물이 아니지만, 자체 로직으로 동일한 계약을 충족할 수 있습니다.
기억하세요: 하나의 class만 상속할 수 있지만, 여러 인터페이스를 구현할 수 있습니다. 진정한 상속 관계에는 extends를 선택하고, 유연성이 필요하거나 구현 세부 정보를 공유하지 않고 계약을 강제하려면 implements를 선택하세요.
챌린지
쉬움extends와 implements를 언제 사용해야 하는지 보여 주는 worker 시스템을 만들어 보겠습니다. 기본 worker 클래스를 만든 다음 두 가지 접근 방식을 보여 줍니다. 하나는 실제로 worker "is a" 역할을 하며 동작을 상속하는 클래스이고, 다른 하나는 worker가 하는 일을 "can do" 하지만 완전히 custom 로직을 사용하는 클래스입니다.
코드를 두 개의 파일로 구성합니다.
worker.dart: 여기에서 worker 계층 구조를 정의합니다.String name속성과 생성자를 가진Worker클래스를 만듭니다.[name] is working...을 출력하는work()메서드와[name] takes a coffee break를 출력하는takeBreak()메서드를 포함합니다.Worker를 extends하는OfficeWorker클래스를 만듭니다.String department속성을 추가합니다.work()를 재정의하여[name] is typing reports in [department]을 출력하되, 상속된takeBreak()동작은 그대로 유지합니다.Worker를 implements하는RobotWorker클래스를 만듭니다.String model속성을 추가합니다. 로봇은 실제로 worker는 아니지만 worker가 하는 일을 수행할 수 있으므로, 완전히 custom 구현을 제공합니다.work()는Robot [model] is assembling parts를 출력하고takeBreak()는Robot [model] is recharging를 출력해야 합니다.
main.dart: worker 파일을 import하고 두 가지 접근 방식을 보여 줍니다.'Marketing'department의'Alice'라는OfficeWorker를 생성합니다.'RX-7'model을 사용하는RobotWorker를 생성합니다.- office worker에 대해
work()를 호출한 다음takeBreak()를 호출합니다. - empty line을 출력합니다.
- robot worker에 대해
work()를 호출한 다음takeBreak()를 호출합니다.
OfficeWorker는 Worker를 extends하기 때문에 takeBreak()를 automatically 상속한다는 점에 주목하세요. 즉, 실제로 worker "is a" 역할을 합니다. 반면 RobotWorker는 interface만 implements하므로 모든 항목에 대한 자체 implementation을 제공해야 합니다. worker가 하는 일을 "can do" 하지만, 자신만의 로봇 방식으로 수행하는 것입니다.
Expected output:
Alice is typing reports in Marketing
Alice takes a coffee break
Robot RX-7 is assembling parts
Robot RX-7 is recharging직접 해보기
import 'worker.dart';
void main() {
// TODO: 'Marketing' 부서에 'Alice'라는 이름의 OfficeWorker 생성
// TODO: 모델이 'RX-7'인 RobotWorker 생성
// TODO: 사무 직원에 대해 work()를 호출한 다음 takeBreak() 호출
// TODO: 빈 줄 출력
// TODO: 로봇 직원에 대해 work()를 호출한 다음 takeBreak() 호출
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Dart 컴파일러