Menu
Coddy logo textTech

super 키워드

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

super 키워드는 자식 클래스가 부모 클래스에 직접 접근할 수 있게 해줍니다. 여러분은 이미 생성자에서 super(name)와 함께 사용하는 것을 보았지만, 다른 상황에서도 유용합니다.

부모 생성자를 호출해야 할 때, super는 상속 체인을 통해 인수를 전달합니다:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

super 키워드를 사용하면 자식 클래스 내에서 부모의 메서드와 속성에 접근할 수도 있습니다. 이는 부모의 동작을 자신의 동작과 함께 사용하고 싶을 때 특히 유용합니다:

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

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // 부모의 메서드를 먼저 호출합니다
    print('$name says meow!');
  }
}

super.makeSound()를 호출할 때, 부모 클래스 버전의 메서드를 명시적으로 호출하게 됩니다. super가 없으면, makeSound()를 호출하는 것은 현재 클래스의 메서드를 참조하게 되어, 잠재적으로 무한 재귀를 일으킬 수 있습니다.

super를 생성자, 메서드 또는 속성에 관계없이 "부모의 버전을 사용해라"라고 말하는 것으로 생각하세요.

challenge icon

챌린지

쉬움

super 키워드가 어떻게 자식 클래스에서 부모 클래스의 동작에 접근하고 이를 확장할 수 있게 해주는지 보여주는 메시징 시스템을 만들어 보겠습니다. 여러분은 기본 메시지 클래스를 기반으로 다양한 메시지 유형이 구축되는 계층 구조를 만들 것입니다.

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

  • message.dart: 여기에 메시지 클래스들을 정의합니다:
    • String senderString content를 가진 Message 클래스(부모). 두 값을 모두 받는 생성자와 From [sender]: [content]를 출력하는 display() 메서드를 포함합니다.
    • Message를 상속받는 UrgentMessage 클래스. 추가적인 String priority 속성을 가져야 합니다. 생성자는 sender, content, priority를 인자로 받으며, 앞의 두 인자는 super를 사용하여 부모 클래스에 전달합니다. display() 메서드를 오버라이드하여 먼저 super.display()를 사용해 부모의 버전을 호출한 다음, 다음 줄에 Priority: [priority]를 출력합니다.
  • main.dart: 메시지 파일을 임포트하고 생성자와 메서드 모두에서 super가 어떻게 작동하는지 보여줍니다:
    • 'Alice'가 보낸 내용이 'Hello there!'인 일반 Message를 생성합니다.
    • 해당 객체의 display() 메서드를 호출합니다.
    • 구분을 위해 빈 줄을 출력합니다.
    • 'Bob'이 보낸 내용이 'Server is down!'이고 우선순위가 'HIGH'UrgentMessage를 생성합니다.
    • 해당 객체의 display() 메서드를 호출합니다.

UrgentMessagesuper를 두 가지 방식으로 사용하는 방식에 주목하세요: 생성자에서 부모에게 데이터를 전달할 때와, 오버라이드된 메서드에서 자신의 출력을 추가하기 전에 부모의 출력을 포함시킬 때 사용합니다.

예상 출력:

From Alice: Hello there!

From Bob: Server is down!
Priority: HIGH

치트 시트

super 키워드는 자식 클래스 내에서 부모 클래스에 접근할 수 있게 해줍니다.

자식 클래스 생성자에서 super()를 사용하여 부모 생성자에 인수를 전달합니다:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

재정의된(overridden) 메서드 내에서 부모 메서드를 호출하려면 super를 사용하세요:

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

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // 부모의 메서드를 먼저 호출합니다
    print('$name says meow!');
  }
}

super가 없으면 메서드 이름을 직접 호출할 때 현재 클래스의 버전을 참조하게 되며, 이는 재정의된 메서드에서 무한 재귀를 일으킬 수 있습니다.

직접 해보기

import 'message.dart';

void main() {
  // TODO: 'Alice'로부터 내용이 'Hello there!'인 일반 Message를 생성하세요
  
  // TODO: message에 대해 display() 메서드를 호출하세요
  
  // TODO: 구분을 위해 빈 줄을 출력하세요
  
  // TODO: 'Bob'으로부터 내용이 'Server is down!'이고 우선순위가 'HIGH'인 UrgentMessage를 생성하세요
  
  // TODO: urgent message에 대해 display() 메서드를 호출하세요
}
quiz icon실력 점검

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

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