class 키워드를 이용해서 선언한다.
문법은 java와 거의 동일하다.
생성자는 클래스명과 동일한 메소드를 통해 선언한다.
class Player {
late final String name;
late int age, xp;
late String team;
Player(String name, int age, int xp, String team) {
this.name = name;
this.age = age;
this.xp = xp;
this.team = team;
}
void sayHello() {
print('Hello $name');
}
}
void main() {
var player = Player('Ronaldo', 36, 100, 'Juventus');
print(player.name);
}
아래와 같이 축약된 생성자 문법을 이용할 수 있다.
기본 예제와 다르게 프로퍼티 선언부에 late 키워드가 필요 없다.
class Player {
final String name;
int age, xp;
String team;
Player(this.name, this.age, this.xp, this.team);
void sayHello() {
print('Hello $name');
}
}
void main() {
var player = Player('Ronaldo', 36, 100, 'Juventus');
print(player.name);
}
class Player {
final String name;
int age, xp;
String team;
Player({
required String name,
required int age,
required int xp,
required String team,
}) : this.name = name,
this.age = age,
this.xp = xp,
this.team = team;
void sayHello() {
print('Hello $name');
}
}
void main() {
var player = Player(
name: 'Ronaldo',
age: 36,
xp: 100,
team: 'Juventus',
);
print(player.name);
}
java나 kotlin의 정적 생성자와 비슷한 개념이다.
클래스명.메소드명 형태로 named constructor 생성이 가능하다.
class Player {
final String name;
int age, xp;
String team;
Player({
required String name,
required int age,
required int xp,
required String team,
}) : this.name = name,
this.age = age,
this.xp = xp,
this.team = team;
Player.createRedTeam({
required String name,
required int age,
required int xp,
}) : this.name = name,
this.age = age,
this.xp = xp,
this.team = 'red';
void sayHello() {
print('Hello $name');
}
}
void main() {
var player = Player.createRedTeam(
name: 'Ronaldo',
age: 36,
xp: 100,
);
print(player.name);
}
실제 업무에서는 json을 파싱하여 class로 변환하는 경우가 많다.
클래스명.fromJson 형태로 named constructor를 생성하여 사용하는 경우가 많이 있다.
class Player {
final String name;
int age, xp;
String team;
Player.fromJson(Map<String, dynamic> playerJson)
: this.name = playerJson['name'],
this.age = playerJson['age'],
this.xp = playerJson['xp'],
this.team = playerJson['team'];
void sayHello() {
print('Hello $name');
}
}
void main() {
var players = [
{
"name": "lee",
"age": 47,
"xp": 0,
"team": "red"
},
{
"name": "ho",
"age": 11,
"xp": 0,
"team": "blue"
},
];
players.forEach((p) {
var player = Player.fromJson(p);
player.sayHello();
});
}
java나 kotlin의 chaning 같은 개념이다.
.. 연산자를 이용해 객체의 메소드를 연속으로 호출할 수 있는 문법이다.
class Player {
String name;
int age, xp;
String team;
Player.fromJson(Map<String, dynamic> playerJson)
: this.name = playerJson['name'],
this.age = playerJson['age'],
this.xp = playerJson['xp'],
this.team = playerJson['team'];
void sayHello() {
print('Hello $name');
}
}
void main() {
var players = [
{
"name": "lee",
"age": 47,
"xp": 0,
"team": "red"
},
{
"name": "ho",
"age": 11,
"xp": 0,
"team": "blue"
},
];
players.forEach((p) {
var player = Player.fromJson(p)
player.sayHello();
});
}
상속과 다르게 mixin은 해당 클래스의 프로퍼티, 메소드를 가져온다.
당연히 상속관계는 성립되지 않는다.
with라는 키워드를 이용하며, 생성자가 없는 클래스에 한정해서 mixin이 가능하다.