Your First Dart Class
class Player {
final String name = "yee";
int age = 23;
void sayHi() {
print("Hi my name is $name");
}
}
void main() {
var player = Player();
player.sayHi();
}
- class에서 property는 var 키워드가 아닌 타입 지정으로 선언 (final 가능)
- 인스턴스 생성시 new 키워드 생략 가능, var 키워드 변수에 대입
- class method에서 property 접근 시 this는 기본적으로 생략 가능
Constructors
class Player {
/* late final String name;
late int age;
Player(String name, int age) {
this.name = name;
this.age = age;
} */
final String name;
int age;
Player(this.name, this.age);
void sayHi() {
print("Hi my name is $name");
}
}
void main() {
var player1 = Player("yee", 23);
var player2 = Player("봙봙", 3);
player1.sayHi();
player2.sayHi();
}
- constructor method(생성자 함수)의 이름은 class 이름과 같아야 함
- 원래 필드를 late로 선언해야 하지만 생성자 축약형 사용 시 생략 가능
Named Constructor Parameters
class Player {
final String name;
int age, xp;
String team;
Player({
this.name = "default",
required this.age,
required this.team,
required this.xp,
});
void sayHi() {
print("Hi my name is $name");
}
}
void main() {
var player1 = Player(
name: "yee",
age: 23,
team: "blue",
xp: 1200,
);
var player2 = Player(
name: "봙봙",
age: 3,
team: "red",
xp: 150,
);
player1.sayHi();
player2.sayHi();
}
- 생성자 함수도 positional parameter를 named parameter로 변환 가능
- 마찬가지로 null safety를 위해 초기값을 지정하거나 required 붙이기
Named Constructors
class Player {
final String name;
int age, xp;
String team;
Player({
this.name = "default",
required this.age,
required this.team,
required this.xp,
});
Player.createBluePlayer({required String name, required int age})
: this.name = name,
this.age = age,
this.team = "blue",
this.xp = 0;
Player.createRedPlayer(String name, int age)
: this.name = name,
this.age = age,
this.team = "red",
this.xp = 0;
void sayHi() {
print("Hi my name is $name");
}
}
void main() {
var player1 = Player.createBluePlayer(
name: "yee",
age: 23,
);
var player2 = Player.createRedPlayer("봙봙", 3);
player1.sayHi();
player2.sayHi();
}
- Flutter에서 constructor를 여러 개 만들 때 많이 사용하는 패턴
- 콜론(:) 이후 원하는 매개변수만 할당 및 기본 값 초기화
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 sayHi() {
print("Hi my name is $name from $team team");
}
}
void main() {
var apiData = [
{
"name": "A",
"team": "blue",
"xp": 0,
},
{
"name": "B",
"team": "red",
"xp": 0,
},
{
"name": "C",
"team": "blue",
"xp": 0,
},
];
apiData.forEach((playerJson) {
var player = Player.fromJson(playerJson);
player.sayHi();
});
}
- API fetching에서 주로 사용되는 fromJson named constructor 패턴
Cascade Notation
class Player {
String name, team;
int age, xp;
Player({
required this.name,
required this.age,
required this.team,
required this.xp,
});
void sayHi() {
print("Hi my name is $name from $team team (age: $age, xp: $xp)");
}
}
void main() {
/* var yee = Player(
name: "yee",
age: 23,
team: "blue",
xp: 1200,
);
yee.name = "봙봙";
yee.age = 3;
yee.team = "red";
yee.xp = 150; */
var yee = Player(
name: "yee",
age: 23,
team: "blue",
xp: 1200,
)
..age = 3
..team = "red"
..xp = 150;
yee..name = "봙봙";
yee.sayHi();
}
- 프로퍼티 변경을 ..(cascade notation)으로 축약해 표현 가능
- 인스턴스 자체를 변경하기 때문에 할당과 관계없이 원본 수정
Enums
enum Team {blue, red}
class Player {
String name;
int age, xp;
Team team;
Player({
required this.name,
required this.age,
required this.team,
required this.xp,
});
void sayHi() {
String team = this.team.name;
print("Hi my name is $name from $team team (age: $age, xp: $xp)");
}
}
void main() {
var yee = Player(
name: "yee",
age: 23,
team: Team.blue,
xp: 1200,
);
yee.sayHi();
}
- Dart의 Enums는 개발자가 그냥 넘어가기 쉬운 오타 방지에 유용
- {}(중괄호) 안에 문자열이 아닌 형태 그대로 넣어 새로운 타입을 생성
- enum 타입을 변수 선언에 활용해 선택의 폭을 제한 및 자동 완성
- 문자열로 활용하려면 enum의 name property를 String 변수에 대입
- Flutter의 Color 시스템 등도 enum으로 구성
Abstract Classes
enum Team {blue, red}
abstract class Human {
void walk();
}
class Player extends Human {
String name;
int age, xp;
Team team;
Player({
required this.name,
required this.age,
required this.team,
required this.xp,
});
void walk() {
print("I'm walking");
}
void sayHi() {
String team = this.team.name;
print("Hi my name is $name from $team team (age: $age, xp: $xp)");
}
}
void main() {
var yee = Player(
name: "yee",
age: 23,
team: Team.blue,
xp: 1200,
);
yee.sayHi();
yee.walk();
}
- 추상 클래스에 메소드 이름과 타입만 정의해 상속받은 클래스에게 구현 강제
- 각각의 클래스에 새로 정의된 추상 메소드는 서로 내용이 다를 수 있는 다형성을 가짐
- Flutter에서 자주 사용되는 개념은 아님
Inheritance
enum Team { blue, red }
class Human {
final String name;
Human({required this.name});
void sayHi() {
print("Hi! my name is $name");
}
}
class Player extends Human {
Team team;
Player({
required this.team,
required String name,
}) : super(name: name);
@override
void sayHi() {
String team = this.team.name;
super.sayHi();
print("I'm from $team team");
}
}
void main() {
var yee = Player(
name: "yee",
team: Team.blue,
);
yee.sayHi();
}
- super 키워드와 (:)로 상위 클래스 생성자 접근 가능
- (parameter 수가 적어도 positional or named 선택은 자유)
- super 키워드로 상위 클래스 함수 접근 가능 (+ method override 가능)
- Flutter에서 자주 사용되는 개념은 아님
Mixins
class Strong {
final double strengthLevel = 1500.99;
}
class QuickRunner {
void runQuick() {
print("ruuuuun!!");
}
}
enum Team { blue, red }
class Player with Strong, QuickRunner {
Team team;
Player({
required this.team,
});
void sayHi() {
String team = this.team.name;
print("I'm from $team team (strength: $strengthLevel)");
}
}
class Horse with QuickRunner {}
void main() {
var yee = Player(
team: Team.blue,
);
var horse = Horse();
yee.sayHi();
yee.runQuick();
horse.runQuick();
}
- Flutter에서 자주 사용되는 개념이며, 생성자가 없는 클래스를 의미
- 클래스 상속과 달리 extends 키워드가 아닌 with 키워드로 구현
- 프로퍼티나 메소드 모음을 여러 클래스에 전달해 재사용하려는 목적
본 내용은 노마드코더의 'Dart 시작하기'를 바탕으로 작성되었습니다
'Languages > Dart' 카테고리의 다른 글
[글또] JavaScript 개발자와 Dart 찍먹하기 (0) | 2023.02.11 |
---|---|
[노마드코더] #4 Functions (0) | 2023.01.09 |
[노마드코더] #3 Data Types (0) | 2023.01.09 |
[노마드코더] #2 Variables (0) | 2023.01.08 |
[노마드코더] #1 Introduction (0) | 2023.01.04 |