Menu
Coddy logo textTech

메서드 오버라이딩

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');
  }
}

이 패턴을 통해 기존 기능을 확장할 수 있습니다. 핵심 규칙은 간단합니다. 자식 클래스에서 부모와 동일한 메서드 이름 및 매개변수를 정의하면, 자식 인스턴스에서 호출 시 부모의 구현을 대체하게 됩니다.

challenge icon

챌린지

쉬움

자식 클래스가 부모 메서드를 오버라이드하여 동작을 커스터마이징하는 방법을 보여주는 알림 시스템을 구축해 보겠습니다. 각기 고유한 방식으로 메시지를 전달하는 다양한 알림 유형을 만들 것입니다.

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

  • notification.dart: 여기에 알림 계층 구조를 정의합니다:
    • String titleString 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() 메서드를 호출합니다.

EmailNotification은 부모의 동작을 완전히 대체하는 반면, PushNotificationsuper.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() 메서드를 호출하세요
}
quiz icon실력 점검

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

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