생성자(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 키워드는 인스턴스 변수와 일반 변수의 이름이 겹치는 경우에만 사용
생성자의 특징
➡️ 생성자가 없는 경우 기본생성자(Default Constructor)가 자동으로 제공된다.
반대로 생성자가 존재하는 경우 기본생성자는 제공되지 않는다.
class Test {
String name;
// 생성자를 정의하지 않을 경우 기본적으로 Test(); 생성자를 제공
// Test();
// 별도의 생성자가 존재하므로 기본생성자를 제공하지 않는다.
Test(this.name);
// 하지만, 선택적 매개변수를 사용할 경우 기본생성자도 제공이 된다.
Test({this.name});
}
- 기본생성자(Default Constructor)란?
생성자의 이름이 클래스 이름과 동일하고, 매개변수가 없는 생성자이다.
위 예제의 class Test의 기본생성자는 Test(); 이다.
➡️ 하위 클래스는 상위 클래스의 생성자를 상속받지 않는다.
class Super {
Super();
}
class Sub extends Super {
// 기본생성자만 갖고있음
// Sub();
}
➡️ 명명된 생성자(Named constructors)를 사용하면 하나의 클래스에 여러 종류의 생성자를 생성할 수 있다.
하위 클래스는 생성자를 상속받지 않기 때문에 명명된 생성자 또한 별도로 생성하여야 한다.
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;
}
➡️ 초기화 목록(Initializer List)을 사용하여 생성자 실행 전에 인스턴스의 변수를 초기화를 할 수 있다.
* 클래스의 생성자 실행 순서(필수실행, 선택적 실행):
초기화 목록(Initializer List) → 상위 클래스(extends가 있는 경우)의 기본생성자 → 하위 클래스의 기본생성자
Initializer List는 생성자 옆에 콜론( : )으로 시작하여 콤마( , )로 구분한다.
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);
}
'Flutter' 카테고리의 다른 글
Flutter: Dart의 final과 const 선언자 비교 (0) | 2020.11.25 |
---|