생성자 선언
생성자는 클래스에 선언되어 객체를 생성할 때 호출되는 함수입니다. 모든 클래스는 생성자를 가지며 만약 개발자가 만들지 않으면 컴파일러가 자동으로 클래스와 같은 이름으로 기본 생성자를 만들어 줍니다.
// 클래스 선언
class User {
}
코드에서 User 클래스에는 생성자를 작성하지 않았습니다. 하지만 다트에서 생성자가 없는 클래스는 존재할 수 없습니다. 따라서 컴파일러는 기본 생성자를 자동으로 추가하므로 오른쪽처럼 선언한 것과 같습니다.
// 기본 생성자를 추가한 예
class User {
User() { }
}
여기까지는 다른 객체지향 언어와 같습니다. 하지만 다트에서는 명명된 생성자, 팩토리 생성자, 상수 생성자 등 다양한 형태로 정의할 수 있습니다. 또한 생성자의 매개변수로 멤버를 초기화하는 초기화 목록도 제공합니다. 하나씩 자세히 살펴보겠습니다.
멤버 초기화하기
생성자는 보통 멤버를 초기화하는 용도로 사용합니다. 즉, 객체를 생성할 때 매개변수로 전달받은 데이터를 클래스에 선언된 멤버에 대입합니다. 예를 들면 다음처럼 작성합니다.
// 멤버 초기화 생성자
class User {
late String name;
late int age;
User(String name, int age) {
this.name = name;
this.age = age;
}
sayHello() {
print('name: $name, age: $age');
}
}
이처럼 매개변수로 멤버를 초기화하는 생성자는 this 예약어를 이용하면 간단하게 작성할수 있습니다. 다음 코드에서 User() 생성자의 매개변수를 this.name, this.age라고 선언했습니다. this.name은 첫 번째 매개변수에 전달된 값을 name 멤버에 대입하라는 의미입니다.
// 멤버 초기화 생성자 단순화
class User {
late String name;
late int age;
User(this.name, this.age);
sayHello() {
print('name : $name, age : $age');
}
}
초기화 목록
생성자를 선언할 때 초기화 목록을 사용할 수도 있습니다. 초기화 목록은 생성자 선언부를 콜론(:)으로 구분하여 오른쪽에 작성합니다. 앞에서 예로 든 생성자의 매개변수로 멤버를 초기화하는 User(this.name, this.age) 코드는 다음처럼 초기화 목록을 이용해서 작성할 수도 있습니다.
User(String name, int age) : this.name = name, this.age = age { }
그러나 초기화 목록은 단순히 생성자의 매개변수를 멤버에 대입하는 코드보다는 리스트에서 특정 항목을 선택하거나 함수 호출로 멤버를 초기화할 때 더 자주 사용합니다. 또한 다른 생성자를 this(), super() 등으로 호출하는 구문을 작성할 수도 있습니다.
다음 코드에서는 생성자의 매개변수로 List 객체를 전달받고 이 리스트의 특정 위치에 있는 데이터를 가져와 클래스의 멤버에 대입합니다.
// 리스트의 데이터로 초기화
class MyClass {
late int data1;
late int data2;
MyClass(List<int> args)
: this.data1 = args[0],
this.data2 = args[1] { }
}
또한 다음처럼 초기화 목록에서 특정 함수를 호출하고 그 반환값으로 클래스의 멤버를 초기화할 수도 있습니다. 다만 생성자의 초기화 목록이 실행되는 시점은 객체 생성 이전이므로 이곳에서 호출할 수 있는 함수는 static이 추가된 클래스 멤버여야 합니다.
// 클래스 멤버 함수의 반환값으로 초기화
class MyClass {
late int data1;
late int data2;
MyClass(int arg1, int arg2)
: this.data1 = calFun(arg1),
this.data2 = calFun(arg2) { }
static int calFun(int arg) {
return arg * 10;
}
printData() {
print('$data1, $data2');
}
}
'Flutter' 카테고리의 다른 글
팩토리 생성자 (0) | 2024.11.14 |
---|---|
명명된 생성자 (0) | 2024.11.14 |
클래스와 객체 (0) | 2024.11.13 |
실행 흐름 제어하기 (0) | 2024.11.13 |
기타 연산자 알아보기 (0) | 2024.11.12 |