class Person {
final String name = 'gwanson';
int age = 26;
void greeting() {
print("Hi my name is $name");
}
}
void main() {
var person = Person();
person.age = 27;
person.greeting();
}
// 출력
// Hi my name is gwanson
Constructor method
constructor method는 class의 이름과 같아야 합니다.
class Person {
final String name;
int age;
Person(this.name, this.age);
void greeting() {
print("Hi my name is $name");
}
}
void main() {
var person = Person('gwanson', 26);
person.greeting();
var person2 = Person('gwanhyeok', 27);
person2.greeting();
}
// 출력
// Hi my name is gwanson
// Hi my name is gwanhyeok
Named Constructor Parameters
class에서의 named constructor parameter는 함수에서 적용했던 방법과 동일합니다.
class Person {
final String name;
int age;
Person({required this.name, required this.age});
void greeting() {
print("Hi my name is $name");
}
}
void main() {
var person = Person(
name: 'gwanson',
age: 26,
);
person.greeting();
}
// 출력
// Hi my name is gwanson
Named Constructor
클래스에서 생성자를 여러 개를 만들고 싶으면 생성자.이름() 으로 생성하면 됩니다. 이렇게 생성한 생성자의 파라미터는 기본적으로 required입니다.
class Person {
final String name;
int age, score;
String team;
Person({
required this.name,
required this.age,
required this.score,
required this.team,
});
Person.createBluePlayer({
required String name,
required int age,
}) : this.name = name,
this.age = age,
this.team = 'blue',
this.score = 0;
Person.createRedPlayer(
String name,
int age,
) : this.name = name,
this.age = age,
this.team = 'red',
this.score = 0;
void greeting() {
print("Hi my name is $name, my team is $team");
}
}
void main() {
var bluePerson = Person.createBluePlayer(name: 'gwanson', age: 26);
var redPerson = Person.createRedPlayer('gwanhyeok', 27);
bluePerson.greeting();
redPerson.greeting();
}
// 출력
// Hi my name is gwanson, my team is blue
// Hi my name is gwanhyeok, my team is red
Cascade Notation
생성된 클래스의 프로퍼티를 수정하는 방법은 다음과 같습니다.
var person = Person(name: 'gwanson', age: 26);
person.name = 'gwanhyeok';
person.age = 27;
하지만 Cascade Notation을 사용하면 코드를 더 간결하게 줄일 수 있습니다.
var person = Person(name: 'gwanson', age: 26):
..name = 'gwanhyeok'
..age = 27;
생성자 뒤에 :
을 붙이고 ..
프로퍼티를 적으면 수정이 가능합니다.
Enums
Enum이란 웹에서의 selectBox와 같은 역할을 합니다.
지정된 값들을 손쉽게 사용할 수 있게 해줍니다.
enum Tead { red, blue }
Abstract Classes
추상화 클래스란 직접적으로 구현된 클래스가 아닌, 클래스의 '틀'만 잡아놓는 것이라고 보면 됩니다.
abstract class Animal {
void bark();
}
class Dog extends Animal {
String name;
Dog({required this.name});
@override
void bark() {
print("bow wow");
}
}
class Cat extends Animal {
String name;
Cat({required this.name});
@override
void bark() {
print("meow");
}
}
void main() {
var dog = Dog(name: 'mungmung');
dog.bark();
var cat = Cat(name: 'goyang');
cat.bark();
}
// 출력
// bow wow
// meow
위의 코드처럼 Dog
와 Cat
은 추상화 클래스 Animal
의 상속을 받고 있어, bark()
메소드가 필수로 존재해야합니다.
Inheritance
생성자가 존재하는 부모 클래스를 상속받은 자식 클래스는 super
를 이용하여 프로퍼티를 넘겨줄 수 있습니다.
class Animal {
String name;
Animal({required this.name});
void sayName() {
print("my name is $name");
}
}
class Dog extends Animal {
String color;
Dog({required this.color, required String name}) : super(name: name);
// Dog({required this.color, required super.name});
@override
void sayName() {
super.sayName();
print("color is $color");
}
}
void main() {
var blackDog = Dog(color: 'black', name: 'kkamdung');
blackDog.sayName();
}
// 출력
// my name is kkamdung
// color is black
Mixins
Mixins는 생성자가 없는 클래스를 의미합니다. 클래스에 프로퍼티를 추가할 때 사용합니다.
with
키워드를 사용하면 상속의 의미보단 다른 클래스의 프로퍼티를 '공유'할 수 있습니다.
mixin class Weight {
final double size = 68.2;
}
mixin Height {
final double height = 171.5;
}
class Human with Weight, Height {
String name;
Human({required this.name});
void sayHello() {
print("Hello, my name is $name. I'm $size and $height");
}
}
void main() {
var person = Human(name: 'gwanson');
person.sayHello();
}
// 출력
// Hello, my name is gwanson. I'm 68.2 and 171.5
Mixin 클래스는 이전 Dart 버전에서는 일반적인 class로 선언 후 with를 사용할 수 있었지만, 최신 버전 Dart에서는 mixin class
를 사용해야 합니다.