반응형

생성자(Constructors)
생성자는 클래스 안에 클래스와 같은 이름의 함수를 추가한다.
class Point {
double x = 0;
double y = 0;
// 방법1: 생성자의 매개변수로 값을 받아 생성자 본문에서 변수를 초기화
Point(double x, double y) {
this.x = x;
this.y = y;
}
// 방법2: 생성자의 매개변수를 인스턴스의 변수로 할당
Point(this.x, this.y);
}
// this 키워드는 현재 인스턴스(Point)를 의미
// this 키워드는 인스턴스 변수와 일반 변수의 이름이 겹치는 경우에만 사용
생성자 특징
1. 기본생성자(Default Constructor)
생성자가 없는 경우 기본생성자가 자동으로 제공된다. (단, 생성자가 존재하는 경우 기본생성자는 제공되지 않는다.)
기본생성자(Default Constructor)란?
클래스와 동일한 이름의 매개변수가 없는 생성자이다.
class Test {
String name;
// 생성자를 정의하지 않을 경우 기본적으로 Test(); 생성자를 제공
// Test();
// 별도의 생성자가 존재하므로 기본생성자를 제공하지 않는다.
Test(this.name);
// 하지만, 선택적 매개변수를 사용할 경우 기본생성자도 제공이 된다.
Test({this.name});
}
2. 하위 클래스는 상위 클래스의 생성자를 상속받지 않는다.
class Super {
Super();
}
class Sub extends Super {
// 기본생성자만 갖고있음
// Sub();
}
3. Named constructors
Named 생성자를 사용하면 하나의 클래스에 여러 종류의 생성자를 생성할 수 있다. 하위 클래스는 생성자를 상속받지 않기 때문에 명명된 생성자 또한 별도로 생성하여야 한다.
const double xOrigin = 0;
const double yOrigin = 0;
class Point {
double x = 0;
double y = 0;
Point(this.x, this.y);
// 명명된 생성자
Point.origin()
: x = xOrigin,
y = yOrigin;
}
4. Initializer List
생성자의 body를 실행하기 전 initializer list를 사용하여 인스턴스의 변수를 초기화를 할 수 있다. 생성자 이름 옆에 콜론(:)과 콤마(,)로 구분하여 사용한다. 값에 this 접근자 사용할 수 없다.
생성자의 실행 순서(필수/선택)
Initializer List → 상위 클래스의 기본생성자 → 하위 클래스의 기본생성자
class Point {
double x, y;
Point.fromJson(Map<String, double> json)
: x = json['x']!,
y = json['y']! {
print('In Point.fromJson(): ($x, $y)');
}
}
상위 클래스의 기본생성자가 없는 경우에 하위 클래스 생성자는 에러가 발생한다. 이유는 하위 클래스는 생성자의 본문을 실행하기 전에 상위 클래스의 기본생성자를 호출하기 때문이다. 이때 상위 클래스의 다른 생성자를 호출하여야 하는데, 이를 처리할 수 있는 방법이 Initializer List를 이용하여 해결할 수 있다.
class Super {
String name;
// 상위 클래스의 기본생성자
// Super();
// Super.fromJson(Map data) 생성자
Super.fromJson(Map data) {
print('Super Class');
}
}
class Sub extends Super {
// Error: The superclass, 'Super', has no unnamed constructor that takes no arguments.
Sub.fromJson(Map data) {
print('Sub Class');
}
// Initializer List로 해결
Sub.fromJson(Map data) : super.fromJson(data) {
print('Sub Class');
}
}
void main() {
var sub = Sub.fromJson({});
print(sub);
}
A tour of the Dart language
A tour of all the major Dart language features.
dart.dev
반응형
'Mobile > Flutter' 카테고리의 다른 글
| Dart의 final / const 선언자 비교 (0) | 2020.11.25 |
|---|