[Flutter / Dart] 객체지향 프로그래밍(상속과 오버라이드)

2025. 4. 7. 14:38

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

 

 

 

출처 : 코드팩토리의 플러터 프로그래밍

BELATED ARTICLES

more