1. 클래스
클래스 정의
class Person {
String name;
int money;
Person(this.name, this.money);
}
void main() {
Person p1 = Person("홍길동", 0);
Person p2 = Person("임꺽정", 10000);
print("${p1.name}의 재산은 ${p1.money}");
print("${p2.name}의 재산은 ${p2.money}");
}
인스턴스 생성 시 쓰는 new를 생략 가능합니다.
선택적 매개변수 사용
class Person {
String? name;
int money;
// 값이 들어오지 않을 때 기본 값을 정의할 수 있다.
Person({this.name, this.money = 0});
}
void main() {
Person p1 = Person(name: "홍길동");
Person p2 = Person(money: 10000, name: "임꺽정");
print("${p1.name}의 재산은 ${p1.money}");
print("${p2.name}의 재산은 ${p2.money}");
}
- Dart는 오버로딩이 없는 대신 선택적 매개변수 방식을 사용합니다.
- 중괄호 {} 을 사용하여 정의합니다.
- 첫 번째 인수가 name이고 두 번째 인수가 money였나? 라는 의문을 품을 필요가 없습니다.
- 필요하지 않은 인수를 전달하지 않아도 되는 장점이 있습니다.
- null이 들어올 수 있는 String(기본값 없음)은 String?로 적어야 합니다.
- { }는 앞에 적을 수 없습니다.
- Person(this.id, {this.name, this.money, this.nickname}); → 가능
- Person({this.id, this.name, this.money}, this.nickname); → 불가
2. Cascade 연산자
class Person {
int id;
String name;
late int money; // 나중에 들어옴 or 디폴트 0
String? nickname; // 있을수도 있고 없을 수도 있는 것
Person(this.id, this.name, this.money, this.nickname);
Person.fromMap(Map<String, dynamic> m) : // 이름 있는 생성자
this.id = m["id"] == 0 ? 100 : 10, // 삼항 연산자 가능
this.name = m["name"],
this.money = m["money"],
this.nickname = m["nickname"] ?? "이름없음"; // null 대체 연산자
void init() {
if (money == 0) {
for(int i = 0; i < 10; i++) {
money = money + 10;
}
}
}
}
void main() {
Person p = Person(1, "홍길동", 0, "이름없어"); // 일반 생성자 사용
// Map 선언
var m = {
"id": 2,
"name": "임꺽정",
"money": 0,
};
Person p2 = Person.fromMap(m); // 이름있는 생성자인지 static method인지 구분 필요
print(p2.id);
print(p2.name);
print(p2.money);
print(p2.nickname);
Person p3 = Person.fromMap(m)..init(); // 생성하면서 init 메서드를 실행, cascade
print(p3.id);
print(p3.name);
print(p3.money); // 100이 됨
print(p3.nickname);
}
- Person.fromMap(Map<String, dynamic> m)
- Map 타입을 받을 수 있는 이름이 있는 생성자입니다.
- cascade 연산자
..
는 객체에 여러 연산을 연속적으로 적용할 때 유용하게 사용되는 문법입니다.
// 콘솔 결과
p2.id: 10
p2.name: 임꺽정
p2.money: 0
p2.nickname: 이름없음
p3.id: 10
p3.name: 임꺽정
p3.money: 100
p3.nickname: 이름없음
3. Mixin class
mixin class Engine {
int power = 1000;
}
mixin class Battery {
int volt = 220;
}
class Car with Engine, Battery {
}
void main() {
Car c = Car();
print("c.power ${c.power}");
print("c.volt ${c.volt}");
// 1000과 220을 출력
}
- Mixin은 여러 클래스 계층에서 클래스의 코드를 재사용하는 방법입니다.
- composition 없이 with로 다중 상속이 가능합니다.
Share article