본문 바로가기
Dart

[Dart] 기본문법 Classes

by 루에 2023. 1. 11.
반응형

Class 선언 기본

class Player {
  String name = 'nico';
  final int xp = 1500;
  
  sayHello() {
    // this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
    print('Hello, my name is $name');
  }
}

void main() {
  var player = Player();
  print(player.name);
  player.name = 'change';
  print(player.name);
  player.sayHello();
}

 

Constructor

생성자 파라미터를 어느 변수에 넣을 것인지 명시하여 Class의 late prefix를 없애고 생성자 코드수도 줄여 가독성을 높인다.

// 일반적인 생성자
class Player {
  // 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
  late String name;
  late final int xp;
  
  Player(String name, int xp) {
    this.name = name;
    this.xp = xp;
  }
  
  sayHello() {
    // this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
    print('Hello, my name is $name');
  }
}

// 생성자 코드를 줄이고 late도 없앤다.
class Player2 {
  // 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
  String name;
  final int xp;
  
  Player2(this.name, this.xp);
  
  sayHello() {
    // this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
    print('Hello, my name is $name');
  }
}

void main() {
  var player = Player("새로운이름", 1500);
  var player2 = Player("우아우앙", 345);
  print(player.sayHello());
  print(player2.sayHello());
}

 

Named Constructor Parameters

함수의 named parameters와 비슷한 기능. 이슈가 될만한 사항도 같고 해결법도 같다.

class Player {
  // 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
  final String name;
  final int xp;
  String team;
  String country;
  
  // named constructor parameters
  Player({required this.name, required this.xp, required this.team, required this.country});
  
  sayHello() {
    // this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
    print('Hello, my name is $name');
  }
}

void main() {
  var player = Player(name: "nico", xp: 1500, team: 'red', country: 'seoul');
}

 

Named Constructor

용도를 구분하여 생성자를 만들 수 있다.

생성자의 이름을 지정하고 : 뒤에 할당문을 작성하거나 여러 다른 방법으로 생성자를 만들 수 있다.

class Player {
  // 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
  String name;
  int xp, age;
  String team;
  
  // named constructor parameters
  Player({
    required this.name,
    required this.xp,
    required this.team,
    required this.age
    });
  
  // named constructor
  Player.createBluePlayer({
    required this.name,
    this.xp = 123,
    this.team = 'Blue',
    required this.age
    });
  
  Player.createRedPlayer({
    required this.name,
    this.xp = 352345,
    this.team = 'Red',
    required this.age
    });
  
  // 다른 방법(: 뒤에 할당문 기재)
  Player.createYellowPlayer({
    required String name,
    required int age,
  }) :
  this.name = name,
  this.age = age,
  this.team = "Yellow",
  this.xp = 0;
  
  Player.createBlackPlayer(String name, int age) :
    this.name = name,
    this.age = age,
    this.team = "Yellow",
    this.xp = 0;
  
  sayHello() {
    // this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
    print('Hello, my name is $name');
  }
}

void main() {
  var player = Player(name: "nico", xp: 1500, team: 'red', age: 12);
  var player2 = Player.createBluePlayer(name: "nico", age: 12);
  var player3 = Player.createRedPlayer(name: "nico", age: 12);
  
  print(player3.team);
}

 

Cascade Notation

객체를 호출하는 새로운 문법

Dot 2개를 사용하여(..) 해당 객체를 연속 호출할 수 있다.

class Player {
  String name;
  int age;
  
  Player({
    required this.name,
    required this.age
    });
  
  void sayHello() {
    print("Hello, $name");
  }
}

void main() {
  var nico = Player(name: "nico", age: 28);
  nico.name = 'lalas';
  nico.age = 39;
  
  // dot(.) 하면서 콜하는 것을 줄일 수 있다.
  // Cascade Notation
  var nico2 = Player(name: "nico2", age: 28)
  ..name = 'lalas'
  ..age = 39;
  
  // 한줄로 써보기
  nico..name = 'changeName'..age = 33;
}

 

Enums

다른 언어와 같음

enum Age {
  young, old
}

class Player {
  String name;
  Age age;
  
  Player({
    required this.name,
    required this.age
    });
  
  void sayHello() {
    print("Hello, $name");
  }
}

void main() {
  var nico = Player(name: "nico", age: Age.old);
}

 

Abstract Classes

다른 언어와 같음

abstract class Human {
  void walk();
}

enum Age {
  young, old
}

class Player extends Human {
  String name;
  Age age;
  
  Player({
    required this.name,
    required this.age
    });
  
  void sayHello() {
    print("Hello, $name");
  }
  
  void walk() {
    print("call walk()");
  }
}

class Coach extends Human {
  void walk() {
    //
  }
}

void main() {
  var nico = Player(name: "nico", age: Age.old);
}

 

Inheritance

다른 언어와 같음

class Human {
  final String name;
  Human({required this.name});
  void sayHello() {
    print("Hi, I'm $name");
  }
}

enum Team {
  RED, BLUE
}

class Player extends Human {
  Team team;
  
  // 상속한 부모 클래스의 생성자 호출하는 방법
  Player({
    required this.team,
    required String name
  }) : super(name: name);
  
  @override
  void sayHello() {
    super.sayHello();
    print("Hi, I'm $team team");
  }
}

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

 

Mixins

생성자가 없는 클래스. extends가 아니라 with 키워드를 이용하여 클래스에 붙일 수 있고, 상속의 개념이 아니라 단순히 파라미터나 프로퍼티를 가져오는 개념

// 생성자가 없는 mixins
class Strong {
  final double strengthLevel = 1000.99;
}
// 생성자가 없는 mixins
class QuickRunner {
  void runQuick() {
    print("ruuuuun");
  }
}
// 생성자가 없는 mixins
class Tall {
  final double height = 1.99;
}

class Player with Strong, QuickRunner, Tall {
  final String team;
  
  Player(this.team);
}

// mixin은 여러 군데에서 사용 가능
class Horse with String, QuickRunner {
  
}

void main() {
}

 

 

반응형

댓글