메서드 오버라이딩
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 38번째.
메서드 오버라이딩(Method overriding)은 자식 클래스가 부모 클래스에 이미 존재하는 메서드에 대해 자체적인 구현을 제공할 때 발생합니다. 이를 통해 서브클래스는 동일한 메서드 시그니처를 유지하면서 상속받은 동작을 사용자 정의할 수 있습니다.
자식 클래스에서 부모 클래스와 동일한 이름 및 매개변수를 가진 메서드를 정의하면, 자식 클래스의 버전이 우선적으로 적용됩니다:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic이 소리를 냅니다
dog.speak(); // Buddy가 짖습니다: Woof!
}Dog 인스턴스에서 speak()를 호출하면, Dart는 Animal의 버전이 아니라 Dog의 버전을 실행합니다. 자식 클래스가 부모의 메서드를 오버라이드(재정의)했습니다.
오버라이딩을 super와 결합하여 부모의 동작을 대체하는 대신 확장할 수도 있습니다:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // 부모 버전을 먼저 호출합니다
print('$name also purrs');
}
}이 패턴을 통해 기존 기능을 확장할 수 있습니다. 핵심 규칙은 간단합니다. 자식 클래스에서 부모와 동일한 메서드 이름 및 매개변수를 정의하면, 자식 인스턴스에서 호출 시 부모의 구현을 대체하게 됩니다.
챌린지
쉬움자식 클래스가 부모 메서드를 오버라이드하여 동작을 커스터마이징하는 방법을 보여주는 알림 시스템을 구축해 보겠습니다. 각기 고유한 방식으로 메시지를 전달하는 다양한 알림 유형을 만들 것입니다.
코드를 두 개의 파일로 구성합니다:
notification.dart: 여기에 알림 계층 구조를 정의합니다:String title과String message를 가진Notification클래스(부모). 두 값을 모두 받는 생성자와Notification: [title] - [message]를 출력하는send()메서드를 포함합니다.Notification을 상속하고String recipient속성을 추가하는EmailNotification클래스.send()메서드를 오버라이드하여Sending email to [recipient]: [title] - [message]를 출력합니다.Notification을 상속하고String deviceId속성을 추가하는PushNotification클래스.send()메서드를 오버라이드하여 먼저super를 사용하여 부모의send()를 호출한 다음, 다음 줄에Pushed to device: [deviceId]를 출력합니다.
main.dart: 알림 파일을 임포트하고 메서드 오버라이딩이 작동하는 모습을 보여줍니다:- title은
'Alert', message는'System update available'인 기본Notification을 생성합니다. - 해당 객체의
send()메서드를 호출합니다. - 빈 줄을 출력합니다.
- title은
'Welcome', message는'Thanks for signing up!', recipient는'user@example.com'인EmailNotification을 생성합니다. - 해당 객체의
send()메서드를 호출합니다. - 빈 줄을 출력합니다.
- title은
'Reminder', message는'Meeting in 10 minutes', deviceId는'DEVICE-001'인PushNotification을 생성합니다. - 해당 객체의
send()메서드를 호출합니다.
- title은
EmailNotification은 부모의 동작을 완전히 대체하는 반면, PushNotification은 super.send()를 먼저 호출하여 부모의 동작을 확장하는 방식에 주목하세요. 두 접근 방식 모두 필요에 따라 메서드를 오버라이드하는 유효한 방법입니다.
예상 출력:
Notification: Alert - System update available
Sending email to user@example.com: Welcome - Thanks for signing up!
Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001치트 시트
메서드 오버라이딩은 자식 클래스가 부모 클래스에 이미 존재하는 메서드에 대해 자체적인 구현을 제공할 때 발생합니다. 자식 인스턴스에서 호출될 때 자식의 버전이 부모의 버전을 대체합니다.
메서드를 오버라이드하려면 자식 클래스에서 동일한 이름과 매개변수를 사용하여 메서드를 정의합니다:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic makes a sound
dog.speak(); // Buddy barks: Woof!
}super를 사용하여 부모의 버전을 호출하고 기능을 대체하는 대신 확장할 수 있습니다:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // 부모의 버전을 먼저 호출
print('$name also purrs');
}
}직접 해보기
import 'notification.dart';
void main() {
// TODO: title이 'Alert'이고 message가 'System update available'인 기본 Notification을 생성하세요
// 해당 객체의 send() 메서드를 호출하세요
// TODO: 빈 줄을 출력하세요
// TODO: 다음과 같은 EmailNotification을 생성하세요:
// - title: 'Welcome'
// - message: 'Thanks for signing up!'
// - recipient: 'user@example.com'
// 해당 객체의 send() 메서드를 호출하세요
// TODO: 빈 줄을 출력하세요
// TODO: 다음과 같은 PushNotification을 생성하세요:
// - title: 'Reminder'
// - message: 'Meeting in 10 minutes'
// - deviceId: 'DEVICE-001'
// 해당 객체의 send() 메서드를 호출하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.