#4.0 Your First Dart Class
class Player {
//name을 상수로 만들어서, 변경하지 못하게함
final String name = 'nico';
int xp = 1500;
void sayHello() {
print("my name is ${name}");
}
}
void main() {
var player = Player();
print(player.name);
print(player.xp);
player.sayHello();
// player.name = 'park';
print("${player.name} ${player.xp}");
}
- 인스턴스를 생성할때, new 키워드를 사용할 필요가 없다
- 클래스의 속성을 선언할때, 타입을 명시한다.
#4.1 Constructors
class Player {
//late : 변수들이 값을 나중에 받아온다.
late final String name;
late int xp;
Player(String name, int xp) {
this.name = name;
this.xp = xp;
}
void sayHello() {
print("my name is ${name}");
}
}
void main() {
var player = Player("park", 1500);
var player1 = Player("lee", 1300);
player.sayHello();
player1.sayHello();
}
생성자에서 속성을 초기화할때, late 키워드를 사용해서 초기화하는 방법을 사용할 수 있다.
하지만 this.을 사용하는 것과 타입이 동일하다는 점이 코드가 반복적이다.
class Player {
//late : 변수들이 값을 나중에 받아온다.
final String name;
int xp;
Player(this.name, this.xp);
void sayHello() {
print("my name is ${name}");
}
}
void main() {
var player = Player("park", 1500);
var player1 = Player("lee", 1300);
player.sayHello();
player1.sayHello();
}
그래서 위와 같은 방식으로 생성자에 바로 this.필드로 넣어서, 초기화되게 할 수 있다.
#4.2 Named Constructor Parameters
// class Player {
// //late : 변수들이 값을 나중에 받아온다.
// final String name;
// int xp;
// String team;
// int age;
// //위치가
// Player(this.name, this.xp, this.team, this.age);
// void sayHello() {
// print("my name is ${name}");
// }
// }
class Player {
//late : 변수들이 값을 나중에 받아온다.
final String name;
int xp;
String team;
int age;
//위치가
Player({
required this.name,
required this.xp,
required this.team,
required this.age
});
void sayHello() {
print("my name is ${name}");
}
void printInfo() {
print("$name $xp $team $age");
}
}
void main() {
var player = Player(name: 'park', xp: 15, team: 'red', age: 24);
var player1 = Player(name: "lee", age: 24, team: 'blue', xp: 13);
player.printInfo();
player1.printInfo();
}
클래스의 필드, 프로퍼티가 많아지면, 인자 자리에 어떤 값을 넣을지 알 수 없는 경우가 있다.
Named Parameter를 사용하면, 인자 이름에 어떤 값을 넣을지 명시할 수 있어서, 개발자가 코드를 작성하는데 있어, 코드가 가독성이 좋고 깔끔해진다.
#4.3 Named Constructors
Named Constructor는 기본 생성자와는 다르다.
기본생성자랑 일반적인 생성자 형태처럼 클래스 명을 주고, 필드를 초기화하는 것을 말한다.
// class Player {
// //late : 변수들이 값을 나중에 받아온다.
// final String name;
// int xp;
// String team;
// int age;
// //위치가
// Player(this.name, this.xp, this.team, this.age);
// void sayHello() {
// print("my name is ${name}");
// }
// }
class Player {
final String name, team;
int xp, age;
//위치가
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 = 1400;
Player.createRedPlayer(String name, int age)
: this.age = age,
this.name = name,
this.team = 'Red',
this.xp = 1200;
void sayHello() {
print("my name is ${name}");
}
void printInfo() {
print("$name $xp $team $age");
}
}
void main() {
var player1 = Player.createBluePlayer(name: "park", age: 24);
var player2 = Player.createRedPlayer("park", 24);
}
Named Constructor에 : 를 넣어서 인자로 받은 값을 통해 객체를 초기화하겠다는 명시를 함
Named Constructors의 인자는 기본적으로 required를 사용한다.
#4.4 Recap
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" : "nico",
"team" : "red",
"xp": 0
},
{
"name" : "park",
"team" : "blue",
"xp": 1300
}
];
apiData.forEach((element) { Player.fromJson(element).sayHello();});
}
Flutter에서 서버에 요청해서 class로 데이터를 변환하는 과정에서 fromJson과 같은 Named Constructor를 사용해서, 변환할 수 있다.
#4.5 Cascade Notation
인스턴스를 생성하고나서, 프로퍼티의 값을 변경하기 위해서는 .으로 속성에 접근해서 값을 변경시킨다.
class Player {
String name;
int xp;
String team;
Player({ required String name, required int xp, required String team}) :
this.name = name,
this.xp = xp,
this.team = team;
void sayHello() {
print("Hi my name is $name $xp $team");
}
}
void main() {
var park = Player(name: "park", xp: 1500, team: "blue");
var park1 = park
..name = 'lee'
..xp = 1300
..team = "red"
..sayHello();
park.sayHello();
park1.sayHello();
}
하지만, ..으로 속성에 접근해서 프로퍼티를 변경시킬 수 있다.
#4.6 Enums
Flutter에서 인자로 어떤 값을 넣을때, 범위를 좁힐 수 있는 역할을 한다.
enum Team { red, blue }
enum XpLevel {beginner, medium, pro}
class Player {
String name;
XpLevel xp;
Team team;
Player({ required String name, required XpLevel xp, required Team team}) :
this.name = name,
this.xp = xp,
this.team = team;
void sayHello() {
print("Hi my name is $name $xp $team");
}
}
void main() {
var park = Player(name: "park", xp: XpLevel.medium, team: Team.blue);
var park1 = park
..name = 'lee'
..xp = XpLevel.beginner
..team = Team.red
..sayHello();
park.sayHello();
park1.sayHello();
}
enum을 이용해, 사용자가 입력하는 값들을 제한할 수 있고, 가독성을 넓혀준다.
#4.7 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 String name, required XpLevel xp, required Team team}) :
this.name = name,
this.xp = xp,
this.team = team;
void sayHello() {
print("Hi my name is $name $xp $team");
}
@override
void walk() {
print("Player walk");
}
}
class Coach extends Human {
@override
void walk() {
print("Coach is walking");
}
}
void main() {
var park = Player(name: "park", xp: XpLevel.medium, team: Team.blue);
var park1 = park
..name = 'lee'
..xp = XpLevel.beginner
..team = Team.red
..sayHello();
park.sayHello();
park1.sayHello();
park.walk();
park1.walk();
var coach = Coach();
coach.walk();
}
#4.8 Inheritance
class Human {
final String name;
Human({required 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: name);
@override
void sayHello() {
super.sayHello();
print("Player sayHello");
}
}
void main() {
var player = Player(team: Team.red, name: "park");
print("${player.name} ${player.team}");
player.sayHello();
}
super 라는 키워드를 통해서 부모클래스의 생성자를 이용해서 초기화할 수 있게 해주고, 부모 클래스의 메소드를 사용할 수 있다.
함수를 override해서, 부모 클래스에 있는 함수를 사용할 수 있고, 원하는대로 구현할 수 있다.
#4.9 Mixins
Mixin이란 생성자가 없는 클래스를 의미하고, 프로퍼티들을 추가할때 사용한다.
enum Team { blue, red }
class Strong {
final double strengthLevel = 1500.99;
}
class QuickRunner {
void runQuick() {
print("ruuuuuun");
}
}
class Player{
final Team team;
Player({
required this.team,
});
}
void main() {
}
이와 같이 Player에 Strong과 QuickRunner를 같이 추가하고 싶을때, mixin을 사용한다.
다른 클래스의 프로퍼티와 메소드들을 긁어오는 역할을 한다.
mixin의 조건은 생성자가 없는 클래스여야한다.
enum Team { blue, red }
mixin Strong {
final double strengthLevel = 1500.99;
}
mixin QuickRunner {
void runQuick() {
print("ruuuuuun");
}
}
mixin Tall {
final double height = 1.99;
}
class Horse with Strong, QuickRunner {
}
class Player with Strong, QuickRunner, Tall{
final Team team;
Player({
required this.team,
});
}
void main() {
}
참고자료
Dart 시작하기 – 노마드 코더 Nomad Coders
Flutter 앱 개발을 위한 Dart 배우기
nomadcoders.co
'Development > Dart' 카테고리의 다른 글
| [Dart] #3 Functions (0) | 2025.03.10 |
|---|---|
| [Dart] #2 Data Types (0) | 2025.03.10 |
| [Dart] #1 Variables (0) | 2025.03.09 |