나만의 개발노트

[Dart] Class3 - abstract class / Inheritance / Mixins 본문

카테고리 없음

[Dart] Class3 - abstract class / Inheritance / Mixins

노트포미 2024. 7. 17. 00:43

1. Abstract Class(추상화 클래스)

: 다른 클래스들이 직접 구현해야 하는 메소드들을 모아 놓은 blueprint(청사진 = 도면?)

  • 추상화 클래스로는 객체를 생성할 수 없다
  • extends 키워드로 다른 클래스에 상속하여 사용 
    • A클래스가 추상화클래스B를 상속 받았는데 B에 정의된 method를 A에 정의하지 않으면, 에러
    • 추상화클래스B를 상속받은 A클래스 내에서 method를 변형할 수 있다.(반환형,이름만 동일하게)
//추상화 클래스 정의
abstract class Human {
  void talk();
}

//extends 키워드로 Human 상속
class Player extends Human {
  String name;
  int xp;

  Player({
    required this.name,
    required this.xp,
  });

  //Human에 정의된 talk()를 구현하지 않으면 컴파일 에러
  void talk() {
    print('talk method called in Player $name');
  }
}

2. Inheritance(상속)

: 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것

  • 자식 클래스 선언에 extends 키워드 사용
  • 자식 클래스에서 부모클래스를 지칭하는 키워드 : super
  • 자식 클래스에서는 부모클래스의 생성자(constructor)를 호출해야 한다
  • 자식 클래스에서 부모클래스의 property, method를 사용할 수 있다
class Human {
  final String name;

  Human(this.name);

  void sayHello() {
    print("Hello my name is $name");
  }
}

//Human클래스를 상속받는 Player클래스
//Human의 method, property사용 가능
//Human의 생성자 호출 필요
class Player extends Human {
  final String team;

  //부모 클래스는 super로 호출
  //부모 클래스인 Human생성자에 name을 전달하는 과정
  Player({
    required this.team,
    required String name,
  }) : super(name);
}

void main() {
  var player = Player(
    team: 'red',
    name: 'abc',
  );
  //상속받은 sayHello() 사용가능
  player.sayHello();
}

2-1. override(대체)

: 부모클래스에게 상속받은 method의 body를 수정할 수 있다.

  • @override 키워드 사용
class Human {
  final String name;

  Human(this.name);
//기본 sayHello
  void sayHello() {
    print("Hello my name is $name");
  }
}

class Player extends Human {
  final String team;

  //부모 클래스는 super로 호출
  //부모 클래스인 Human생성자에 name을 전달하는 과정
  Player({
    required this.team,
    required String name,
  }) : super(name);

//상속받은 Human의 sayHello()를 Player클래스에 맞게 수정
  @override
  void sayHello() {
    super.sayHello();
    print("I'm in $team team");
  }
}

void main() {
  var player = Player(
    team: 'red',
    name: 'abc',
  );
  player.sayHello();
  //output : Hello my name is abc
  //         I'm in red team
}

3. Mixins

: 상속과 비슷하게 다른 클래스의 property, method를 사용할 수 있게 하는 것

  • mixin 키워드 사용 (이전에는 class로도 가능했음)
  • 생성자는 없음
  Inheritance(상속) mixin
공통점 - property, method를 사용할 수 있다.
- 다른 클래스에 재사용 가능하다.
키워드 extends with
여러개 다중상속X 여러개 가능
생성자 있음 -> 자식 클래스에서 호출 필요 없음
//Mixin은 생성자가 없다
mixin Strong {
  double power = 100.99;
}

mixin QuickRunner {
  void runQuick() {
    print("ruuuuuuun!");
  }
}

class Parent {
  String parent;
  Parent(this.parent);
}

class Daddy {
  String dad;
  Daddy(this.dad);
}

//상속 키워드인 extends대신, with 키워드 사용
class Player with Strong, QuickRunner {
  //Strong의 power사용 가능
}

//다른 클래스에도 재사용 가능
class Kid with QuickRunner {}

void main() {
  //with로 연결된 QuickRunner의 메소드 runQuick() 사용 가능
  var player = Player();
  player.runQuick();

  var kid = Kid();
  kid.runQuick();
}