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를 생성자, 메서드 또는 속성에 관계없이 "부모의 버전을 사용해라"라고 말하는 것으로 생각하세요.
챌린지
쉬움super 키워드가 어떻게 자식 클래스에서 부모 클래스의 동작에 접근하고 이를 확장할 수 있게 해주는지 보여주는 메시징 시스템을 만들어 보겠습니다. 여러분은 기본 메시지 클래스를 기반으로 다양한 메시지 유형이 구축되는 계층 구조를 만들 것입니다.
코드를 두 개의 파일로 구성합니다:
message.dart: 여기에 메시지 클래스들을 정의합니다:String sender와String 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()메서드를 호출합니다.
UrgentMessage가 super를 두 가지 방식으로 사용하는 방식에 주목하세요: 생성자에서 부모에게 데이터를 전달할 때와, 오버라이드된 메서드에서 자신의 출력을 추가하기 전에 부모의 출력을 포함시킬 때 사용합니다.
예상 출력:
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() 메서드를 호출하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.