Flutter
Flutter Day 3-2: Dart 상속과 super 키워드
@leem
2025. 1. 6. 17:35
1. 상속
상속은 부모 클래스의 기능(속성과 메서드)을 자식 클래스가 물려받아 사용할 수 있게 하는 기능입니다.
자식 클래스는 부모 클래스의 속성을 재사용하면서 자신만의 추가적인 기능을 정의할 수 있습니다.
class Burger {
String? name;
Burger() {
print('버거 생성자 호출()');
}
}
class CheeseBurger extends Burger {
CheeseBurger() {
print('치즈버거 생성자 호출()');
}
}
void main() {
CheeseBurger ch = CheeseBurger();
}
출력 결과
버거 생성자 호출()
치즈버거 생성자 호출()
- 부모 생성자 먼저 호출: 부모가 생성되어야 자식이 생성될 수 있습니다.
2. super 키워드
super는 자식 클래스가 부모 클래스의 속성이나 메서드에 접근할 수 있도록 하는 키워드입니다.
super로 부모의 속성 참조하기
class Burger {
String? name;
Burger() {
print('버거 생성자 호출()');
}
}
class CheeseBurger extends Burger {
CheeseBurger(String name) {
print('치즈버거 생성자 호출()');
super.name = name; // 부모의 name 속성에 값 할당
}
}
void main() {
CheeseBurger ch = CheeseBurger('불고기치즈버거');
print('name 호출: ${ch.name}');
}
출력 결과
버거 생성자 호출()
치즈버거 생성자 호출()
name 호출: 불고기치즈버거
- super.name = name: 부모 클래스의 name 속성에 값을 전달합니다.
- super를 통해 부모 속성을 직접 참조할 수 있습니다.
3. 부모 생성자에 매개변수가 있다면?
부모 클래스에 매개변수가 있는 생성자가 있다면, 자식 클래스에서 이니셜라이저 리스트와 super 키워드를 통해 값을 전달해야 합니다.
이니셜라이저 리스트와 super
class Burger {
String? name;
Burger(String? name) {
print('버거 생성자 호출()');
this.name = name;
}
}
class CheeseBurger extends Burger {
CheeseBurger(String name) : super(name) {
print('치즈버거 생성자 호출()');
}
}
void main() {
CheeseBurger burger = CheeseBurger('불고기치즈버거');
print(burger.name);
}
출력 결과
버거 생성자 호출()
치즈버거 생성자 호출()
불고기치즈버거
- 부모 생성자 호출: super(name)를 통해 부모 클래스의 생성자에 값을 전달합니다.
- 이니셜라이저 리스트: : super(name) 형식으로 부모 생성자를 호출합니다.
4. 상속과 다형성
다형성은 하나의 객체가 여러 형태로 동작할 수 있는 성질을 말합니다.
Dart에서는 부모 클래스 타입으로 자식 객체를 참조할 수 있습니다.
class Burger {
String? name;
Burger(this.name);
}
class CheeseBurger extends Burger {
CheeseBurger(String name) : super(name);
}
void main() {
Burger burger = CheeseBurger('불고기치즈버거');
print(burger.name); // 부모 타입으로 참조 가능
}
출력 결과
불고기치즈버거
5. 확인 문제
(1) Animal 클래스
class Animal {
final String name; // final 필드 선언
Animal(this.name); // 생성자에서 name 초기화
}
(2) Dog 클래스
- Animal 클래스를 상속.
- 부모 생성자에 값을 전달하기 위해 이니셜라이저 리스트를 사용.
- bark() 메서드를 추가해 "멍멍!" 출력.
class Dog extends Animal {
Dog(String name) : super(name);
void bark() {
print('멍멍!');
}
}
(3) 실행 코드
void main() {
Dog dog1 = Dog('바둑이');
print(dog1.name);
dog1.bark();
Dog dog2 = Dog('흰둥이');
print(dog2.name);
dog2.bark();
}
출력 결과
바둑이
멍멍!
흰둥이
멍멍!
6. 정리
상속
- 자식 클래스는 부모 클래스의 속성과 메서드를 물려받습니다.
super 키워드
- 부모 클래스의 속성과 메서드에 접근할 때 사용합니다.
- 부모 생성자 호출에도 사용됩니다.
이니셜라이저 리스트
- 부모 생성자에 매개변수를 전달할 때 사용됩니다.
class Parent {
Parent(String value) {
print('Parent 생성자 호출: $value');
}
}
class Child extends Parent {
Child(String value) : super(value) {
print('Child 생성자 호출');
}
}
void main() {
Child child = Child('Hello');
}
Parent 생성자 호출: Hello
Child 생성자 호출
- 상속: "부모-자식 관계"를 떠올리면 쉽습니다.
- super: 부모에게 도움을 요청할 때 쓰는 키워드입니다.
- 다형성: 부모 클래스를 자식 클래스로도 활용할 수 있습니다.