Menu
Coddy logo textTech

@override 어노테이션

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

@override 어노테이션은 상위 클래스의 메서드를 의도적으로 재정의하고 있음을 Dart(및 다른 개발자)에게 알려 주는 모범 사례 표시입니다. 메서드 재정의는 이 표시 없이도 작동하지만, @override를 사용하면 중요한 안전망을 추가할 수 있습니다.

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  @override
  void speak() {
    print('$name barks: Woof!');
  }
}

annotation은 두 가지 핵심 이점을 제공합니다. First, 의도를 명확하게 문서화합니다. 코드를 읽는 사람은 누구나 이 method가 parent class에 존재한다는 것을 즉시 알 수 있습니다. Second, Dart의 analyzer는 parent method가 실제로 존재하지 않는 경우 경고를 표시하여 오타와 리팩터링 실수를 조기에 발견할 수 있도록 합니다.

@override 없이 메서드 이름의 철자를 잘못 입력하면 어떤 일이 발생하는지 생각해 보세요.

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // 오타! @override 없이는 경고가 없음
    print('$name meows');
  }
}

annotation이 없으면 Dart는 새로운 method인 speek()을 만들고 있다고 가정합니다. @override를 사용하면 analyzer가 parent class에 해당 method가 존재하지 않는다는 사실을 즉시 표시합니다. 이 간단한 annotation은 나중에 추적하기 어려울 수 있는 미묘한 버그를 방지합니다.

challenge icon

챌린지

쉬움

상속된 동작을 사용자 지정할 때 @override annotation의 중요성을 보여 주는 미디어 플레이어 시스템을 만들어 보겠습니다. 각각의 미디어 유형이 저마다의 방식으로 콘텐츠를 재생하도록 만들어 보세요.

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

  • media.dart: 여기에서 미디어 계층 구조를 정의합니다.
    • String title property가 있는 Media class를 만들고, title을 받는 생성자와 Playing: [title]을 출력하는 play() method를 정의합니다.
    • Media를 extends하고 String artist property를 추가하는 Song class를 만듭니다. @override annotation을 사용하고 play()를 override하여 Playing song: [title] by [artist]를 출력합니다.
    • Media를 extends하고 int duration property(초 단위)를 추가하는 Video class를 만듭니다. @override를 사용하고 play()를 override하여 먼저 super.play()로 parent의 버전을 call한 다음 Duration: [duration] seconds를 출력합니다.
  • main.dart: media 파일을 import하고 override된 method를 시연합니다.
    • title이 'Generic Content'Media object를 Create하고 play()를 call합니다.
    • empty line을 Print합니다.
    • title이 'Imagine'이고 artist가 'John Lennon'Song을 Create한 다음 play()를 call합니다.
    • empty line을 Print합니다.
    • title이 'Dart Tutorial'이고 duration이 360Video를 Create한 다음 play()를 call합니다.

@override annotation은 의도를 문서화하고 오류를 찾는 데 도움을 줍니다. 실수로 play()plya()로 잘못 입력하면, annotation이 parent class에 해당 method가 없음을 알려 줍니다.

예상 출력:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

직접 해보기

import 'media.dart';

void main() {
  // TODO: Create a Media object with title 'Generic Content' and call play()
  
  
  // TODO: 빈 줄을 출력하세요
  
  
  // TODO: 제목 'Imagine'과 아티스트 'John Lennon'으로 Song을 생성한 다음 play()를 호출하세요
  
  
  // TODO: 빈 줄을 출력하세요
  
  
  // TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call play()
  
}
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 Dart 컴파일러