728x90
반응형
다트(Dart)의 상속과 다형성 정리
Dart는 객체지향 언어로, **상속(Inheritance)**과 **다형성(Polymorphism)**을 활용해 객체 간의 관계를 설계할 수 있습니다. 하지만 잘못된 설계는 유지보수성과 확장성을 저하시킬 수 있으므로, 상속과 다형성의 개념과 올바른 사용 방법을 이해하는 것이 중요합니다. 아래에서 이를 자세히 정리하겠습니다.
1. 상속(Inheritance)
- 상속은 부모 클래스가 가진 상태(변수)와 행위(메서드)를 자식 클래스가 물려받는 관계를 의미합니다.
- Dart에서 상속은 extends 키워드를 사용해 구현합니다.
- 부모 클래스가 먼저 생성되고, 그 뒤에 자식 클래스가 생성됩니다.
class Burger {
String? b_name;
Burger() {
print('나는 버거');
}
}
class CheeseBurger extends Burger {
String? ch_name;
CheeseBurger() {
print('치즈버거');
}
}
void main() {
CheeseBurger cb = CheeseBurger();
cb.b_name = '치즈버거'; // 부모 클래스의 변수 사용
cb.ch_name = '맥도날드 치즈버거'; // 자식 클래스의 변수 사용
}
2. 다형성(Polymorphism)
- 다형성은 **"여러 가지 형태로 객체를 바라볼 수 있다"**는 객체지향 프로그래밍의 핵심 개념입니다.
- 상속 관계에서 부모 클래스의 참조 변수를 통해 자식 클래스 객체를 가리킬 수 있습니다.
- **업캐스팅(Upcasting)**과 **다운캐스팅(Downcasting)**으로 다형성을 활용할 수 있습니다.
업캐스팅(Upcasting)
- 자식 객체를 부모 클래스 타입으로 참조.
- 부모 클래스의 멤버만 접근 가능.
Burger b2 = CheeseBurger();
b2.b_name = '치즈'; // 부모 클래스의 변수 사용 가능
// b2.ch_name; // 오류: 부모 타입으로는 자식 클래스 멤버에 접근 불가
다운캐스팅(Downcasting)
- 부모 클래스 객체를 자식 클래스 타입으로 강제 형변환.
- 자식 클래스의 멤버에 접근 가능.
Burger b3 = CheeseBurger();
CheeseBurger b4 = b3 as CheeseBurger; // 강제 형변환
b4.ch_name = '즈치'; // 자식 클래스의 변수 사용 가능
print('ch_name 호출: ${(b3 as CheeseBurger).ch_name}');
3. 상속과 생성자 호출
- 자식 클래스 객체를 생성할 때 부모 클래스의 생성자가 먼저 호출됩니다.
- 부모 클래스의 생성자가 매개변수를 가진 경우, 자식 클래스 생성자에서 값을 전달해야 합니다.
- Dart에서는 이를 **초기화 목록(Initializer List)**과 super 키워드를 사용해 구현합니다.
초기화 목록(Initializer List)
- 부모 클래스의 생성자에 매개변수가 있다면, 자식 클래스 생성자에서 초기화 목록을 사용해 값을 전달합니다.
class Burger {
String? name;
Burger(String? name) {
print('버거 생성자 호출()');
this.name = name;
}
}
class CheeseBurger extends Burger {
// 초기화 목록과 super 키워드 사용
CheeseBurger(String? name) : super(name) {
print('치즈버거 생성자 호출()');
print('치즈버거 이름: $name');
}
}
void main() {
CheeseBurger ch = CheeseBurger('불고기치즈버거');
print('치즈버거 이름: ${ch.name}');
}
super 키워드
- 부모 클래스의 생성자 호출 또는 부모 클래스의 변수/메서드 참조에 사용됩니다.
class CheeseBurger extends Burger {
CheeseBurger(super.name) {
print('치즈버거 생성자 호출()');
}
}
4. 상속 설계의 주의점
4.1. 다형성이 성립해야 함
- 상속은 "is-a" 관계를 만족해야 합니다.
- 예를 들어, BMW 클래스와 Genesis 클래스가 Engine 클래스를 상속하는 것은 적절하지 않습니다.
- BMW와 Genesis는 Engine이 아니기 때문입니다.
- 이런 경우에는 합성(Composition) 관계를 사용하는 것이 적합합니다.
4.2. 상속은 "부모의 모든 특성을 자식이 가져야 하는 경우"에만 사용
- 부모 클래스의 변경이 자식 클래스에 영향을 미치므로, 상속 남용은 유지보수성을 떨어뜨릴 수 있습니다.
5. 요약
- 상속
- 부모 클래스의 상태와 메서드를 자식 클래스가 물려받음.
- Dart에서는 extends 키워드를 사용.
- 다형성
- 객체를 여러 형태로 바라볼 수 있는 객체지향 프로그래밍의 중요한 개념.
- 업캐스팅과 다운캐스팅으로 구현 가능.
- 생성자 호출
- 부모 클래스의 생성자가 먼저 호출됨.
- 초기화 목록(Initializer List)와 super 키워드로 부모 생성자를 호출.
- 설계 주의사항
- "is-a" 관계가 성립해야 상속이 적절.
- 잘못된 상속은 유지보수성을 저하시킬 수 있음.
이 글이 여러분의 Dart 상속 설계와 다형성 이해에 도움이 되길 바랍니다! 😊
728x90
반응형
'Flutter' 카테고리의 다른 글
[Flutter 15] storeApp 만들기1 (0) | 2025.01.06 |
---|---|
[Flutter 13] Null 억제 연산자(!) 와 late (0) | 2025.01.06 |
[Flutter 12] Dart Null Safety (0) | 2025.01.06 |
댓글