클래스
class Player {
final String name = 'name';
final int age = 17;
String sayHello() {
return 'My name is $name';
}
}
void main() {
var player1 = Player();
print(player1.sayHello());
}
- 인스턴스를 생성할 때
new 키워드를 작성하지 않아도 된다.
- 클래스 내부에서 변수를 호출할 때
this 키워드를 작성하지 않아도 된다.
=> 같은 변수 이름일 경우 구분하기 위해 this를 작성하는 경우도 있다.
=> 클래스 내 메소드에서는 this를 쓰지 않는 것을 권고한다고 한다.
생성자
class Player {
final String name;
final int age;
Player(this.name, this.age);
String sayHello() {
return 'My name is $name';
}
}
void main() {
var player1 = Player('name', 17);
print(player1.sayHello());
var player2 = Player('name2', 18);
print(player2.sayHello());
}
네임 생성자
class Player {
final String name;
final int age;
final String team;
final int height;
Player({
required this.name,
required this.age,
required this.team,
required this.height
});
String sayHello() {
return 'My name is $name';
}
}
void main() {
var player1 = Player(
name: 'name',
age: 17,
team: 'red',
height: 180,
);
print(player1.sayHello());
var player2 = Player(
name: 'name2',
age: 18,
team: 'puprle',
height: 181,
);
print(player2.sayHello());
}
- 함수처럼 인자에 네임을 넣어서 생성할 수 있다.
- 기본 값을 줄 수도 있고, required를 쓸 수도 있다.
일부만 받아와서 초기화
class Player {
final String name, team;
final int age, height;
String sayHello() {
return 'My name is $name';
}
Player.createRedPlayer({
required String name,
required int age,
}) : this.age = age,this.name = name, this.team = 'red', this.height = 180;
Player.createPurplePlayer(
String name, int age
) : this.age = age, this.name = name, this.team = 'purple', this.height = 180;
}
void main() {
var redPlayer = Player.createRedPlayer(name: 'name', age: 17);
var purplePlayer = Player.createPurplePlayer('nmae2', 18);
}
:를 사용하여 클래스의 변수들을 초기화할 수 있다.
반복
class Player {
final String name;
int age;
String team;
Player.fromJson(Map<String, dynamic> data) :
name = data['name'],
age = data['age'],
team = data['team'];
void sayHello() {
print('My name is $name');
}
}
void main() {
var playerDatas = [
{
'name': 'name',
'team': 'red',
'age': 17
},
{
'name': 'name2',
'team': 'red',
'age': 18
}
];
playerDatas.forEach((data) {
var player = Player.fromJson(data);
player.sayHello();
});
}
Cascade
class Player {
String name;
int age;
String team;
int height;
Player({
required this.name,
required this.age,
required this.team,
required this.height
});
void sayHello() {
print('My name is $name');
}
}
void main() {
var player1 = Player(
name: 'name',
age: 17,
team: 'red',
height: 180,
)
..name = 'name2'
.. age = 18
..sayHello();
}
- 체이닝처럼 연속해서 작성할 수 있다.
enum
>> enum Team { red, blue }
class Player {
String name;
int age;
Team team;
int height;
Player({
required this.name,
required this.age,
required this.team,
required this.height
});
void sayHello() {
print('My name is $name');
}
}
void main() {
var player1 = Player(
name: 'name',
age: 17,
>> team: Team.red,
height: 180,
)
..name = 'name2'
.. age = 18
..sayHello();
}
- 열거형으로, 선택의 폭을 좁혀주는 역할을 한다.
추상화
>> abstract class Human {
void walk();
}
enum Team { red, blue }
class Player extends Human {
String name;
int age;
Team team;
int height;
Player({
required this.name,
required this.age,
required this.team,
required this.height
});
void sayHello() {
print('My name is $name');
}
>> void walk() {
print('$name walking');
}
}
void main() {
var player1 = Player(
name: 'name',
age: 17,
team: Team.red,
height: 180,
);
}
- 구현해야 할 메소드들을 작성하여, 실제 쓸 클래스에서 상속받아 쓸 수 있음.
상속
class Human {
final String name;
Human({ required this.name});
void sayHello() {
print('My name is $name');
}
}
enum Team { red, purple }
class Player extends Human {
final Team team;
Player({
required this.team,
required String name
}) : super(name: name);
@override
void sayHello() {
super.sayHello();
String myTeam = team.toString().split('.').last;
print('and $myTeam');
}
}
void main() {
var player1 = Player(team: Team.purple, name: 'name');
player1.sayHello();
}
- 부모 클래스를 호출할 때는
super 키워드를 사용하면 된다.
@override 데코레이터를 작성하고 부모에서 정의된 함수를 재정의할 수 있다.
mixin
class Human {
final String name;
Human({ required this.name});
void sayHello() {
print('My name is $name');
}
}
mixin Strong {
final double score = 17.71;
}
mixin Hit {
void punch() {
print('punch');
}
}
enum Team { red, purple }
class Player with Strong, Hit {
final Team team;
Player({
required this.team,
});
}
void main() {
var player1 = Player(team: Team.purple);
player1.punch();
print(player1.score);
}
- 상속과는 다르게 안에 선언돼 있는 것들을 그대로 가져오는 역할