class
- clas를 생성할 때는 타입을 꼭 명시해야 한다.
String name = 'nico'; // O
var name = 'nico'; // X
class Player{
String name = 'nico';
int xp = 1500;
}
void main() {
var player = Player();
print(player.name); // nico
player.name = 'lalala';
print(player.name); // lalala
}
class Player{
final String name = 'nico';
int xp = 1500;
}
final로 선언해서 name을 클래스 밖에서 수정하지 못하게 만듦.
- method 정의하기
class Player {
final String name = 'nico';
int xp = 1500;
void sayHello() {
print("Hi my name is $name.");
}
}
void main() {
var player = Player();
player.sayHello();
}
constructors
생성자 만들기
class Player {
late final String name;
late int xp;
Player(String name, int xp) {
this.name = name;
this.xp = xp;
}
void sayHello() {
print("Hi my name is $name.");
}
}
void main() {
var player = Player("abc", 1500);
player.sayHello();
var player2 = Player("def", 2500);
player2.sayHello();
}
late는 클래스에서 유용하게 사용
생성자 부분 짧게 바꾸기
class Player {
final String name;
int xp;
Player(this.name, this.xp); // 이렇게 쓸 수 있다!
void sayHello() {
print("Hi my name is $name.");
}
}
named constructor parameters
class Player {
final String name;
int xp, age;
String team;
Player(this.name, this.xp, this.team, this.age);
void sayHello() {
print("Hi my name is $name.");
}
}
void main() {
var player = Player("abc", 1500, 'red', 12);
player.sayHello();
var player2 = Player("def", 2500, 'blue', 12);
player2.sayHello();
}
클래스의 프로퍼티가 많아질 때는 argument의 위치를 기억하기 힘들다. 또 각각의 argument가 뭘 의미하는지 파악하기 어렵다.
→ named argument로 만들기 전에 함수에서 했던 것과 같음.
class Player {
final String name;
int xp, age;
String team;
int age;
Player(
{required this.name,
required this.xp,
required this.team,
required this.age});
void sayHello() {
print("Hi my name is $name.");
}
}
void main() {
var player = Player(
name: "abc",
xp: 1500,
team: 'red',
age: 12,
);
var player2 = Player(
name: "def",
xp: 2500,
team: 'blue',
age: 12,
);
}
named constructor parameter를 사용하면,
argument들의 위치를 기억하지 않아도 된다. key-value 쌍으로 기억하면 된다.
named constructors
class Player {
final String name;
int xp, age;
String team;
Player(
{required this.name,
required this.xp,
required this.team,
required this.age});
Player.createBluePlayer({
required String name,
required int age,
}) : this.age = age,
this.name = name,
this.team = 'blue',
this.xp = 0;
Player.createRedPlayer(String name, int age)
: this.age = age,
this.name = name,
this.team = 'red',
this.xp = 0;
void sayHello() {
print("Hi my name is $name.");
}
}
void main() {
var player = Player.createBluePlayer(
name: "abc",
age: 12,
);
var redplayer = Player.createRedPlayer("def", 12);
}
*
class Player {
final String name;
int xp;
String team;
Player.fromJson(Map<String, dynamic> playerJson)
: name = playerJson['name'],
xp = playerJson['xp'],
team = playerJson['team'];
void sayHello() {
print("Hi my name is $name.");
}
}
void main() {
var apiData = [
{
"name": "A",
"team": "red",
"xp": 0,
},
{
"name": "B",
"team": "red",
"xp": 0,
},
{
"name": "C",
"team": "red",
"xp": 0,
}
];
apiData.forEach((playerJson){
var player = Player.fromJson(playerJson);
player.sayHello();
});
}
cascade notation
void main() {
var nico = Player(name: 'nico', xp: 1200, team: 'red');
[nico.name](<http://nico.name/>) = 'las';
nico.xp = 1200000;
nico.team = 'blue';
}
프로퍼티를 하나하나 바꾸는 대신에
void main() {
var nico = Player(name: 'nico', xp: 1200, team: 'red')
..name = 'las'
..xp = 1200000
..team = 'blue'
..sayHello();
}
이렇게 간단하게 쓸 수 있다.
enums
enum Team { red, blue }
enum XPLevel { beginner, medium, pro }
class Player {
String name;
XPLevel xp;
Team team;
Player({
required this.name,
required this.xp,
required this.team,
});
void sayHello() {
print("Hi my name is $name.");
}
}
void main() {
var nico = Player(
name: 'nico',
xp: XPLevel.medium,
team: Team.red,
)
..name = 'las'
..xp = XPLevel.pro
..team = Team.blue;
}
enum을 사용하면 실수를 줄일 수 있다.
abstract classes
추상화 메소드
- 객체를 생성할 수 없다.
- 상속받는 모든 클래스가 가지고 있어야 하는 메소드를 정의한다.
- 상속받는 클래스가 특정 메소드를 구현하도록 강제한다.
- 상속받은 클래스에서는 클래스의 내용이 달라도 된다.
abstract class Human {
void walk();
}
enum Team { red, blue }
enum XPLevel { beginner, medium, pro }
class Player extends Human {
String name;
XPLevel xp;
Team team;
Player({
required this.name,
required this.xp,
required this.team,
});
void walk() {
print("I'm walking.");
}
void sayHello() {
print("Hi my name is $name.");
}
}
class Coach extends Human {
void walk() {
print('the coach is walking.');
}
}
inheritance
class Human {
final String name;
Human(this.name);
void sayHello() {
print("Hi, my name is $name");
}
}
enum Team { blue, red }
class Player extends Human {
final Team team;
Player({
required this.team,
required String name,
}) : super(name);
@override
void sayHello() {
super.sayHello();
print('and I play for ${team}.');
}
}
void main() {
var player = Player(
team: Team.red,
name: 'nico',
);
player.sayHello();
}
extends로 상속
mixins
mixin: 생성자가 없는 클래스
mixin class Strong {
final double strengthLevel = 1500.99;
}
mixin class QuickRunner {
void runQuick() {
print("runnnnnnn!");
}
}
mixin class Tall {
final double height = 1.99;
}
enum Team { blue, red }
class Player with Strong, QuickRunner, Tall {
final Team team;
Player({
required this.team,
});
}
class Horse with Strong, QuickRunner {}
class Kid with QuickRunner {}
void main() {
var player = Player(
team: Team.red,
);
player.runQuick();
}
with로 클래스의 프로퍼티와 메소드를 가져와서 사용할 수 있음 다른 클래스에 여러 번 재사용할 수 있다.