본문 바로가기

Dart class - advanced 본문

Dart

Dart class - advanced

개발자로 거듭나기 2023. 4. 28. 17:34
반응형

07. dart class - advanced

1. enum & casacde notation

  • 클래스의 멤버변수를 선언하고 초기화 하고 인스턴스 변수를 만들때 값을 한정지어서 개발할 때의 실수를 방지할 수 있습니다.
  • 다음과 같이 선언합니다.
enum Team { red, blue }

class Player {
  String name;
  int xp;
  Team team; // 자료형 선언 후

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

  void sayHello() {
    // 값을 찍을 때는 Team.name으로 값 확인
    print("Hi my name is $name and my team is ${team.name}");
  }
}

void main() {
  // cascade notation
  // tom을 생성하고 player 정보를 변경할 때, tom.name = "alice" 이렇게 바꾸지 않고 ..name = "alice"이런식으로 바꿀 수 있다.
  // 바로 앞에 class가 있다면 그것을 가리키게 된다.
  var tom = Player(name: "tom", xp: 100, team: Team.red) // 사용시에는 Team.*로 사용
    ..name = "alice"
    ..xp = 200
    ..team = Team.blue
    ..sayHello();
}
  • Team이라는 enum을 만들었으면 마치 자료형 (String, int)과 같이 변수를 선언해줍니다.
  • 이제 사용할 때는 Team.* 로사용하고 enum 선언시 정의했던 값말고는 사용할 수 없습니다.
  • cascade notation은 마치 메서드 체이닝처럼 앞에 클래스가 있으면 ..[변수] = [값] 형태로 계속 연결하면서 초기화해줄 수 있습니다.
tom.name = "mike";
tom.xp = 1212;
tom.team = "brwon";
  • 이렇게 선언하는 것 보다는 코드가 깔끔해질 것 같네요.

2. 추상 클래스 (abstract class)

  • 추상클래스를 상속하는 클래스는 추상클래스에서 정의한 메서드들을 구현해야하는 의무가 있습니다.
  • @overried 키워드는 생략 가능합니다.
abstract class Human {
  void walk();
}

class Player extends Human {
  String name;
  int xp;
  String team; // 자료형 선언 후

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

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

    // walk 메서드를 반드시 구현해야한다.
  @override
  void walk() {
    print("$name is walking");
  }
}

3. 클래스의 상속 (extends)

  • Dart에서 클래스 상속은 다른 객체 지향 언어들과 비슷합니다. 부모 클래스로부터 상속받은 속성과 메소드를 자식 클래스에서 재사용할 수 있습니다.
  • 클래스 상속을 위해서는 extends키워드를 사용합니다.
class Human {
  final String name;

  Human(this.name);

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

enum Team { red, blue }

class Player extends Human {
  final Team team;

  // Human을 상속하고 있기 때문에 name을 받아야 한다.
  // : 문법을 이용해서 초기화 진행
  // super 키워드를 이용해서 부모클래스와 소통 가능
  Player({
    required this.team,
    required String name,
  }) : super(name);

  // Human 클래스의 sayHello 메서드 재정의
  @override
  void sayHello() {
    super.sayHello(); // 기존 부모 클래스의 코드를 그대로 가져오고,
    print("I'm in ${team.name} team"); // enum 값을 print할 때는 enum.name으로 출력합니다.
  }
}

void main() {
  var player = Player(team: Team.blue, name: "mike");
  player.sayHello();
}

4. mixin 문법 (with)

  • 생성자가 없는 클래스로써 다른클래스에 포함되어 유용하게 쓰여진다.
  • with 키워드로 사용가능하고, 재사용이 장점입니다.
class Strong {
  final double strengthLevel = 1500.99;
}

class Tall {
  final double height = 1.99;
}

class QuickRunner {
  void runQuick() {
    print("Run!!!!!!!");
  }
}

enum Team { red, blue }

// mixin 사용
class Player with Strong, Tall, QuickRunner {
  final Team team;
  Player({
    required this.team,
  });
}

// 재사용성
class Tiger with Strong, QuickRunner {}

class basketBallPlayer with Tall {}

void main() {
  var player = Player(team: Team.blue);

  // with와 함께 사용된 클래스는 mixin 클래스들의 속성이나 메서드들에 접근 가능하다.
  print(player.height);
  print(player.strengthLevel);
  player.runQuick();
}
  • player을 위해 mixin ⇒ Strong, Tall, QuickRunner를 만들었습니다.
  • 하지만 Tiger나, basketBallPlayer 클래스도 사용할 수 있어서 재사용성이 좋습니다.
  • 또한 with로 포함시킨 mixin의 멤버변수나 메서드를 사용할 수 있습니다.
반응형

'Dart' 카테고리의 다른 글

Dart class - named constructor  (0) 2023.04.28
Dart class - basic  (0) 2023.04.28
Dart 함수 (function) 알아보기  (0) 2023.04.28
Dart 자료형 (Data Type)  (0) 2023.04.28
Dart 변수 알아보기 ( variables )  (0) 2023.04.28
Comments