[Flutter / Dart] 객체지향 프로그래밍(상속과 오버라이드)
1. 상속
상속은 어떤 클래스의 기능을 다른 클래스가 사용할 수 있게 하는 기법임! `extends` 키워드를 통해 상속할 수 있음!
기능을 물려주는 클래스를 부모 클래스, 물려받는 클래스를 자식 클래스라고함.
아래에 부모 클래스를 만들고 그 이후 자식 클래스를 만들어서 상속을 받는 예시 코드를 작성해 보겠음.
class Idol {
final String name;
final int membersCount;
Idol(this.name, this.membersCount);
void sayName() {
print("저는 ${this.name}입니다.");
}
void sayMembersCount() {
print("${this.name}멤버는 ${this.membersCount}명입니다.");
}
}
`Idol`클래스는 멤버 변수로 `name`, `membersCount`를 가지고 있고, 메서드는 `sayName()`, `sayMembersCount`를 가지고 있음. 이제, `Idol`클래스를 상속받는 `BoyGroup`클래스를 만들어 보겠음
// 자식 클래스
class BoyGroup extends Idol { // extends 키워드를 사용해서 상속받음. class (자식클래스) extends Idol(부모클래스)
BoyGroup(
String name,
int membersCount,
) : super( // supers는 부모 클래스를 지칭함.
name,
membersCount,
);
void sayMale() { // 상속받지 않는 메서드나 변수를 새로 추가할 수 있음.
print("저는 남자 아이돌입니다.");
}
}
우선 `extends`키워드를 사용해 상속을 받고, `BoyGroup`은 `name`과 `membersCount`를 입력받는 구조임.
`: super(name, membersCount)` 부분은 부모 클래스인 `Idol`이 생성될 때 `name`과 `membersCount`를 넘겨서 초기화 하겠다는 뜻임.
즉, `Idol(this.name, this.membersCount)` 생성자를 호출하는 것임
이제 위 코드를 사용하는 코드를 추가해서 출력값을 보겠음.
// 코드 실행
void main() {
BoyGroup bts = BoyGroup("BTS", 7);
bts.sayName(); // 부모한테 물려받은 메서드
bts.sayMembersCount(); // 부모한테 물려받은 메서드
bts.sayMale(); // 자식이 새로 추가한 메서드
}
그런데 만약? `Idol`클래스 `GirlGroup`이라는 클래스가 상속을 받았다고 가정해보면, 부모가 같은 `BoyGroup`클래스에서 새로 추가한 `sayMale()` 메서드를 호출 할 수 있을까??
// 두 번째 자식 클래스
class GirlGroup extends Idol {
GirlGroup(
String name,
int membersCount,
) : super(
name,
membersCount,
);
void sayFeMale() {
print("저는 여자 아이돌입니다.");
}
}
void main() {
BoyGroup bts = BoyGroup("BTS", 7);
GirlGroup blackPink = GirlGroup("블랙핑크", 4);
bts.sayName(); // 부모한테 물려받은 메서드
bts.sayMembersCount(); // 부모한테 물려받은 메서드
bts.sayMale(); // 자식이 새로 추가한 메서드
blackPink.sayName();
blackPink.sayMembersCount();
blackPink.sayFeMale();
blackPink.sayMale();
}
이런식으로 `GirlGroup`이라는 두 번째 자식 클래스를 생성하고 `void main()`에서 `GirlGroup`에서 새로 만든 메서드와 `BoyGroup`에서 만든 메서드를 `blackPink`클래스가 호출 해보도록 해봤음.
역시 결과는 불가능!
The method 'sayMale' isn't defined for the type 'GirlGroup'.
위와 같은 오류가 뜸. `GirlGroup` 클래스 안에는 `sayMale()`메서드가 정의되어있지 않다는 메세지가 뜸! 당연하다는 거임.
부모 클래스를 공유한다고 해도 자식끼리는 서로 교류가 없다고 보면 됨!
만약 부모 클래스에서 `sayMale()`이라는 메서드가 있었다면, `BoyGroup`, `GirlGroup`두 곳에서 다 호출 할 수 있었을 것임!
2. 오버라이드
오버라이드는 부모 클래스 또는 인터페이스에 정의된 메서드를 재정의할 때 사용됨.
Dart에서는 `override`키워드를 생략할 수 있기 때문에 `override`키워드를 사용하지 않고도 메서드를 재정의 할 수 있음!
// 부모 클래스
class Idol {
final String name;
final int membersCount;
Idol(this.name, this.membersCount);
void sayName() {
print("저는 ${this.name}입니다.");
}
void sayMembersCount() {
print("${this.name}멤버는 ${this.membersCount}명입니다.");
}
}
class GirlGroup extends Idol {
// 상속에서처럼 super키워드를 사용해도 되고, 아래처럼 생성자의 매개변수로 직접 super키워드를 사용해도 됨.
GirlGroup (
super.name,
super.membersCount,
);
// override키워드를 사용해 오버라이드
@override
void sayName() {
print("저는 여자 아이돌 ${this.name}입니다.");
}
}
부모 클래스에서 이미 존재하는 메서드를 자식 클래스에서 재정의할 경우 `override`키워드를 사용해 메서드를 다시 정의함. 메서드 재정의라고도 함.
`Idol`클래스에 메서드가 총 두개였음.(`sayName()`, `sayMembersCount()`) 하나는 오버라이드 했고, 하나는 하지않았음. 사용할 때어떻게 적용되는지 보겠음!
void main() {
GirlGroup blackPink = GirlGroup("블랙핑크", 4);
blackPink.sayName(); // 자식 클래스의 오버라이드된 메서드 사용
// sayMembersCount는 오버라이드 하지 않았기 때문에 Idol클래스의 메서드가 실행됨
blackPink.sayMembersCount();
}
/* 출력값
저는 여자 아이돌 블랙핑크입니다.
블랙핑크멤버는 4명입니다.
*/
- `sayName()`메서드는 오버라이드 됐으므로 `GirlGroup`클래스에 재정의된 `sayName()`메서드가 실행됨.
- `sayMembersCount()` 메서드는 오버라이드 되지않았으므로 `Idol`클래스에 정의된 `sayMembersCount()`메서드가 사용됨.
한 클래스에 이름이 같은 메서드가 존재할 수 없기 때문에 부모 클래스나 인터페이스에 이미 존재하는 메서드명을 입력하면 `override`키워드를 생략해도 메서드가 덮어씌워짐. 하지만 직접 명시하는게 협업 및 유지보수에 유리하므로 생략하지말고 적어주도록 하자!
https://github.com/Leedoseo/Flutter_OOP_basic
GitHub - Leedoseo/Flutter_OOP_basic
Contribute to Leedoseo/Flutter_OOP_basic development by creating an account on GitHub.
github.com
https://www.notion.so/Dart-Flutter-Study-1cf9fd9f157980a5ab7efad394810871?pvs=4
Dart / Flutter Study | Notion
Made with Notion, the all-in-one connected workspace with publishing capabilities.
www.notion.so
출처 : 코드팩토리의 플러터 프로그래밍
'Dart 언어' 카테고리의 다른 글
[Flutter / Dart] 객체지향 프로그래밍(추상과 제네릭) (0) | 2025.04.08 |
---|---|
[Flutter / Dart] 객체지향 프로그래밍(인터페이스와 믹스인) (1) | 2025.04.07 |
[Flutter / Dart] 객체지향 프로그래밍(클래스) (0) | 2025.04.04 |
[Flutter / Dart] Dart 기초문법(함수와 람다) (2) (0) | 2025.04.03 |
[Flutter / Dart] Dart 기초문법(함수와 람다) (1) (0) | 2025.04.02 |