728x90
상속과 다형성이란?
상속은 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 기능
다형성은 자식 클래스 객체를 부모 클래스 타입으로 참조할 수 있는 능력을 의미
※ 추가설명
만약 BMW 클래스와 제네시스 클래스가 엔진클래스를 상속한다면 과연 그것은 정상적인 설계가 맞을까요??
다형성이 성립하지 않기 때문에 잘못된 상속이라고 할 수 있습니다!
즉, 다형성이란 BMW에게 너 엔진이야? 라고 물었을 때
어 나 엔진이야 라고 답을 할 수 있어야 합니다. (즉, 잘못된 상속이다!)
부모클래스가 먼저 호출되고 자식클래스가 호출된다.
예시 코드
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; // 이거도 보임!
// 주요 핵심 개념
// 치즈 버거는 다형성을 가집니다. 버거이기도 하고 치즈버거 이기도 합니다.
// -----------------------------
print('-----------------------------------');
Burger b2 = CheeseBurger();
b2.b_name; // 이거도 보임!
// b2.ch_name; 이건 안보임!
// b2.ch_name; 보이게 하고 싶다면 어떻게 코드를 작성해야하나요?
Burger b3 = CheeseBurger();
CheeseBurger b4 = b3 as CheeseBurger; // as 강제 형 변환
print('버거 데이터 타입에서 ch_name을 호출하자 ${(b3 as CheeseBurger).ch_name}');
}
Dart에서 Super 란?
부모 클래스의 속성이나 메서드에 접근하거나 호출할 때 사용하는 키워드입니다.
class Burger {
String? name;
Burger() {
print('버거 생성자 호출()');
}
}
class CheeseBurger extends Burger {
CheeseBurger(String name) {
print('치즈버거 생성자 호출()');
// this.name = name;
super.name = name;
}
}
void main() {
CheeseBurger ch = CheeseBurger('불고기치즈버거');
print(' name 호출 : ${ch.name}');
// 문제 - 사용시점, 치즈버거 생성자 호출시에 인수로 전달 받은 문자열을
// 부모 클래스인 Name이라는 변수에 저장하고 싶다면 어떻게 코드를 작성하지?
}
initialize 문법과 super 키워드
class Burger {
String? name;
// 기본 생성자 - 매개변수가 있다면 ...
Burger(String? name) {
print('버거 생성자 호출()');
this.name = name;
}
}
class CheeseBurger extends Burger {
// 자식이 태어나기 전에 부모가 먼저 태어나야 자식이 존재할 수 있다.
// Dart 에서 부모 생성자에 매개변수가 있다면
// 이니셜라이즈 키워드와 super 키워드를 통해 값을 전달 한다.
// 이니셜라이즈 키워드를 살펴 보자.
CheeseBurger(String? name) : super(name) {
print('치즈버거 생성자 호출()');
}
}
void main() {
CheeseBurger burger = CheeseBurger('불고기치즈버거');
print(burger.name);
}
상속은 코드 재사용성과 계층적인 설계를 가능하게 하는 강력한 도구입니다.
하지만, 올바르게 사용하지 않으면 불필요한 의존성과 설계상의 문제가 생길 수 있습니다.
항상 다형성이 성립하는지를 확인하고, 적합하지 않을 경우 컴포지션과 같은 다른 설계 패턴을 고려하는 것이 중요합니다.
'Flutter > Dart 언어' 카테고리의 다른 글
[Dart] dart의 추상 클래스 (0) | 2025.01.08 |
---|---|
[Dart]OOP 연관관계와 Mixin (0) | 2025.01.08 |
[Dart] Sound Null Safety (0) | 2025.01.08 |
[Dart] 클래스와 인스턴스 (0) | 2025.01.04 |
[Dart] dart 기본 문법 익히기 (3) - 익명함수, 람다표현식 (0) | 2025.01.03 |