반응형
Class 선언 기본
class Player {
String name = 'nico';
final int xp = 1500;
sayHello() {
// this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
print('Hello, my name is $name');
}
}
void main() {
var player = Player();
print(player.name);
player.name = 'change';
print(player.name);
player.sayHello();
}
Constructor
생성자 파라미터를 어느 변수에 넣을 것인지 명시하여 Class의 late prefix를 없애고 생성자 코드수도 줄여 가독성을 높인다.
// 일반적인 생성자
class Player {
// 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
late String name;
late final int xp;
Player(String name, int xp) {
this.name = name;
this.xp = xp;
}
sayHello() {
// this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
print('Hello, my name is $name');
}
}
// 생성자 코드를 줄이고 late도 없앤다.
class Player2 {
// 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
String name;
final int xp;
Player2(this.name, this.xp);
sayHello() {
// this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
print('Hello, my name is $name');
}
}
void main() {
var player = Player("새로운이름", 1500);
var player2 = Player("우아우앙", 345);
print(player.sayHello());
print(player2.sayHello());
}
Named Constructor Parameters
함수의 named parameters와 비슷한 기능. 이슈가 될만한 사항도 같고 해결법도 같다.
class Player {
// 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
final String name;
final int xp;
String team;
String country;
// named constructor parameters
Player({required this.name, required this.xp, required this.team, required this.country});
sayHello() {
// this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
print('Hello, my name is $name');
}
}
void main() {
var player = Player(name: "nico", xp: 1500, team: 'red', country: 'seoul');
}
Named Constructor
용도를 구분하여 생성자를 만들 수 있다.
생성자의 이름을 지정하고 : 뒤에 할당문을 작성하거나 여러 다른 방법으로 생성자를 만들 수 있다.
class Player {
// 생성자에서 할당될 값들이어도 전부 late를 붙여야 함.
String name;
int xp, age;
String team;
// named constructor parameters
Player({
required this.name,
required this.xp,
required this.team,
required this.age
});
// named constructor
Player.createBluePlayer({
required this.name,
this.xp = 123,
this.team = 'Blue',
required this.age
});
Player.createRedPlayer({
required this.name,
this.xp = 352345,
this.team = 'Red',
required this.age
});
// 다른 방법(: 뒤에 할당문 기재)
Player.createYellowPlayer({
required String name,
required int age,
}) :
this.name = name,
this.age = age,
this.team = "Yellow",
this.xp = 0;
Player.createBlackPlayer(String name, int age) :
this.name = name,
this.age = age,
this.team = "Yellow",
this.xp = 0;
sayHello() {
// this.name 등 this는 사용가능하지만 클래스 내에서는 사용이 권고되지 않고 있음
print('Hello, my name is $name');
}
}
void main() {
var player = Player(name: "nico", xp: 1500, team: 'red', age: 12);
var player2 = Player.createBluePlayer(name: "nico", age: 12);
var player3 = Player.createRedPlayer(name: "nico", age: 12);
print(player3.team);
}
Cascade Notation
객체를 호출하는 새로운 문법
Dot 2개를 사용하여(..) 해당 객체를 연속 호출할 수 있다.
class Player {
String name;
int age;
Player({
required this.name,
required this.age
});
void sayHello() {
print("Hello, $name");
}
}
void main() {
var nico = Player(name: "nico", age: 28);
nico.name = 'lalas';
nico.age = 39;
// dot(.) 하면서 콜하는 것을 줄일 수 있다.
// Cascade Notation
var nico2 = Player(name: "nico2", age: 28)
..name = 'lalas'
..age = 39;
// 한줄로 써보기
nico..name = 'changeName'..age = 33;
}
Enums
다른 언어와 같음
enum Age {
young, old
}
class Player {
String name;
Age age;
Player({
required this.name,
required this.age
});
void sayHello() {
print("Hello, $name");
}
}
void main() {
var nico = Player(name: "nico", age: Age.old);
}
Abstract Classes
다른 언어와 같음
abstract class Human {
void walk();
}
enum Age {
young, old
}
class Player extends Human {
String name;
Age age;
Player({
required this.name,
required this.age
});
void sayHello() {
print("Hello, $name");
}
void walk() {
print("call walk()");
}
}
class Coach extends Human {
void walk() {
//
}
}
void main() {
var nico = Player(name: "nico", age: Age.old);
}
Inheritance
다른 언어와 같음
class Human {
final String name;
Human({required this.name});
void sayHello() {
print("Hi, I'm $name");
}
}
enum Team {
RED, BLUE
}
class Player extends Human {
Team team;
// 상속한 부모 클래스의 생성자 호출하는 방법
Player({
required this.team,
required String name
}) : super(name: name);
@override
void sayHello() {
super.sayHello();
print("Hi, I'm $team team");
}
}
void main() {
var player = Player(team: Team.BLUE, name: "nico");
player.sayHello();
}
Mixins
생성자가 없는 클래스. extends가 아니라 with 키워드를 이용하여 클래스에 붙일 수 있고, 상속의 개념이 아니라 단순히 파라미터나 프로퍼티를 가져오는 개념
// 생성자가 없는 mixins
class Strong {
final double strengthLevel = 1000.99;
}
// 생성자가 없는 mixins
class QuickRunner {
void runQuick() {
print("ruuuuun");
}
}
// 생성자가 없는 mixins
class Tall {
final double height = 1.99;
}
class Player with Strong, QuickRunner, Tall {
final String team;
Player(this.team);
}
// mixin은 여러 군데에서 사용 가능
class Horse with String, QuickRunner {
}
void main() {
}
반응형
댓글