앱 만들기 프로젝트/Dart

Dart - 4.8 Inheritance(상속)

지나가는물리학부생 2024. 10. 16. 22:16
반응형

이번에는 Inheritance. 상속.
python같은 다른 언어와 비슷하다고 하는데...
사실 나는 코드를 직접 배워본 적이 없고 야매로 하는 사람이라 잘 몰랐다...

Human이라는 이름을 갖는 class가 있다고 하자.

class Human {
  final String name;
  Human(this.name);
  void sayHello() {
    print("Hi my name is $name");
  }
}

이제 Player이라는 이름을 갖는 class를 만들 것이다.
그런데, Player도 사람일테니 Human class를 그대로 가져오고 싶다.(상속)

class Player extends Human {
  final Team team;

  Player({
    required this.team,
    required String name,
    // super가 부모 class와 상호작용할 수 있게 해줌.
  }) : super(name);
}

이렇게 'extends'를 이용해서 class를 상속받는다.
그리고, Player class를 사용할 때에 name을 받아와서 Human class로 보내줘야 하기 때문에, name을 받아오도록 한 후에, 콜론이후에 있는 super(name)을 이용해서 부모 class에 보내준다.
이 방법은 Human에서 여러 변수가 필요할 경우에는 '순서'가 중요하다.

만약 순서 상관 없이 named parameter를 이용하고 싶다면?
앞에서 배웠던 것을 응용하면된다.

class Human1 {
  final String name;
  // 중괄호 써서 named parameter를 사용할 수 있게 한다.
  Human1({required this.name});
  void sayHello() {
    print("Hi my name is $name");
  }
}
 
class Player1 extends Human1 {
  final Team team;

  Player1({
    required this.team,
    required String name,
  }) : super(name: name);

중괄호를 써서 named parameter로 바꿔주고 쓰던대로 쓰면 된다.
이러면 super에 들어가는 변수들의 순서가 중요하지 않다. 개꿀.

그러면, 부모 class와 동일한 이름을 갖지만 Player1만의 함수를 사용하고 싶다면?

  @override
  void sayHello() {
    // 부모에 있는 sayHello 함수 불러오기
    super.sayHello();
    print('and I play for ${team}');
  }

@override를 사용하면 된다. 이렇게 쓰면 sayHello함수는 Human1에도 있지만 그것을 무시하고 Player1에 있는 sayHello를 사용하면 해당하는 함수를 사용한다는 뜻이다.
즉, 덮어씌운다고 생각하자.

아, 참고로 Team은 enum을 이용해서 만들어 둔 것이다.

그렇다면 상속을 여러번 하고 싶다면? 다음 강의에서 계속된다.

반응형

'앱 만들기 프로젝트 > Dart' 카테고리의 다른 글

Dart - 4.9 Mixins  (0) 2024.10.16
Dart - 4.7 Abstract Classes  (0) 2024.10.16
Dart - 4.6 Enums  (1) 2024.10.16
Dart - 4.5 Cascade Notation  (0) 2024.10.16
Dart - 4.3 Named Constructors  (0) 2024.10.16