클래스를 생성할 때는 반드시 타입을 지정해주어야 합니다. 클래스로 생성한 인스턴스를 만들 때는 new 키워드를 사용할 필요는 없습니다. 즉 생략이 가능합니다. 인스턴스의 속성은 수정이 가능하지만 final 키워드를 통해 초기화한 속성은 변경이 불가능합니다. 또한 클래스 내부에서 this를 굳이 사용하지 않아도 class method 내에서 접근이 가능합니다.
class Player {
final String name = 'sj';
int age = 28;
void sayHello() {
print("Hello my name is $name")
}
}
void main() {
var player = Player();
print(player.name);
player.sayHello();
}
인자를 받아서 클래스를 생성하고 싶다면 다음과 같이 순서에 맞게 같은 이름으로 작성하면 됩니다.
class Player {
final String name;
int age;
Player({required this.name, required this.age});
}
void main() {
var player = Player("sj", 28);
var player2 = Player("sj2", 26);
}
클래스를 생성하는데 인자가 많은 경우 함수에서 적용했던 것과 똑같이 할 수 있습니다.
void main() {
var player = Player(
name: "sj",
age: 28,
);
}
인스턴스를 생성할 때 필요에 따라 다른 인자를 받게 할 수도 있습니다. 메서드 뒤에 : 기호를 사용함으로써 인자로 받은 값들로 객체를 초기화 할 수 있습니다. 여기서 또한 positional parameter(인자의 위치로 값을 파악, 기본적으로 모든 parameter가 required)하는 것과 named parameter(이름을 지정해주는 것)을 사용할 수 있습니다. 저는 개인적으로 인자가 두개 이상이라면 named parameter로 작성하여 확실하게 인자를 전해줄 것 같습니다.
json 객체를 받아와서 클래스를 생성하고 싶다면 같은 방식으로 작성할 수 있습니다. 자주 사용되는 패턴으로 Player.fromJson(Map<String, dynamic> playerJson) : ~~ 가 있습니다.
class Player {
...
Player.createSjPlayer({
required String name, required int age
}) : this.age = age, this.name = name;
Player.createSj2Player({
required String name, required int age
}) : this.age = age, this.name = name;
}
void main() {
var sjPlayer = Player.createSjPlayer(
name: "sj",
age: 28,
);
var sj2Player = Player.createSj2Player(
name: "sj2",
age: 26,
);
}
클래스로 인스턴스를 생성하고 속성을 변경하고싶다면 Cascade Notation을 이용하면 됩니다. 세미콜론을 지우고 변경하고싶은 속성 앞에 ..을 붙이면 됩니다.
void main() {
var player = Player(name: 'sj', age: 28)
..name = 'sj2'
..age = 26;
}
enum을 통해 옵션을 정해 조금 더 안전하게 타입을 사용할 수 있습니다.
enum Team = { red, blue }
추상화 클래스는 다른 클래스 들이 사용할 것을 정의해주기 때문에 유용합니다. 미리 정의를 하고 그것을 상속 받는 클래스에서 메소드를 구현해야 합니다.
abstract class Human {
void walk();
}
class Player extends Human{
...
void walk() {
print("walking");
}
}
상속 기능을 사용할 때 super 키워드를 통해 확장을 한 부모 클래스와 상호작용을 할 수 있습니다. 부모 클래스에서 정의된 메소드를 오버라이딩 하기 위해서는 @override 키워드를 사용하면 됩니다.
enum Team = { red, blue }
class Human {
final String name;
Human(required this.name);
void sayHello() {
print("Hi $name");
}
}
class Player extends Human {
final Team team;
Player({
required this.team,
required String name,
}) : super(name: name);
void sayHello(){
super.sayHello();
print("and nice to meet you");
}
}
void main() {
var player = Player(team: Team.red, name: 'sj);
player.sayHello();
}
Mixins는 생성자가 없는 클래스입니다. Mixins는 단순히 내부의 프로퍼티와 메소드들을 가져와서 사용할 수 있게 하는 것이므로 상속과는 다릅니다.
class Strong {
final double level = 100;
}
class Runner {
void run() {
print("run");
}
}
class Player with Strong, Runner {
}