Notice
Recent Posts
Recent Comments
Link
Mokyung
Dart의 Constructor 본문
Dart 언어에서 class는 아래와 같은 형태를 가진다.
class Person {
String name;
int age;
}
var person = Person();
person.name = 'Ho';
person.age = 30;
Dart의 특징 중 하나가 nullable 체크를 강하게 한다는 것인데, 웹에서 Dart를 사용해볼 수 있는 DartPad.dev 같은 곳에서도 쉽게 Null Safety 옵션을 사용할 수 있다.
해당 옵션을 사용할 경우 class instance의 field 중 Non-nullable인 field는 반드시 초기값이 있어야 한다.
Constructor에서 parameter를 받는 방식
1. Constructor with positonal arguments
class를 갖는 다른 언어들처럼 constructor도 가질 수 있다.
class Person {
String name;
int age;
Person(this.name, this.age);
// 위와 같은 뜻.
// Person(String name, int age) {
// this.name = name;
// this.age = age;
// }
}
var person = Person('Ho', 30);
여기서 Person('Ho', 30);에 사용된 arguments들은 순서에 따라 값이 들어가는 positional arguments이다.
2. Constructor with named parameters
Dart에서 class instance 생성시에 parameter 이름을 사용해서 값을 넣어줄 수도 있는데, 이 때에는 constructor의 파라미터에 중괄호를 추가해야한다.
class Person {
String name;
int age;
Person({this.name, this.age}); // 중괄호 추가
}
var person = Person(name: 'Ho', age: 30);
// var person = Person('Ho', 30); Error
이렇게 중괄호로 묶어서 named parameter로 만들어주면 꼭 이름을 명시해서 파라미터를 넣어줘야한다.
named parameter는 기본적으로 optional하다고 인식되기 때문에, Null Safety 옵션이 켜져있을 경우에는 추가적인 작업이 필요하다.
non-nullable한 파라미터의 경우 required 키워드나 기본 값을 넣어줘야 한다.
Person({required this.name, this.age = 0});
3. Mixed
positional arguments와 named parameter를 혼용해서 사용도 가능하다.
하지만 헷갈리기 쉬울 수 있으니 꼭 필요한 상황에만 사용하는 것이 좋다.
class Person {
String name;
int age;
Person(String name, {int age}) {
this.name = name;
this.age = age;
}
}
var person = Person('Ho', age: 30);
Flutter의 Text 위젯의 경우 메인으로 받는 String data는 positional arguments, 나머지 style 등은 named parameter로 받는다.
꼭 받아야하는 메인 파라미터에 positional 방식을, 그 외의 optional한 파라미터를 받는데에 named 방식을 사용하는 경우가 흔한 것 같다.
Named Constructor
Dart에서 한 class는 여러 constructor를 가질 수 있는데, 특이한 점은 각 constructor에 이름을 붙인다는 것이다.
class Person {
String name;
int age;
Person(this.name, this.age);
Person.old(this.name) {
this.age = 100;
}
}
var person = Person.old('Ho');
Java 등의 언어에서는 보통 파라미터의 차이를 이용해서 constructor를 구분하곤 했는데, Dart는 특이하게 이름을 통해 구분한다.
이름을 통해 constructor를 구분하니 객체 생성시에 헷갈림 없이 정확히 원하는 constructor 사용이 가능하다.
느낀점
- 중괄호를 통해 파라미터 받는 방식이 변경되는 점이 상당히 신기하다.
두가지 입력방식을 다 지원하더라도, 보통 함수 선언측은 코드는 똑같았던 것 같은데.
클래스를 작성할 때 받는 값이 적으면 positional arguments 방식, 받는 값이 많으면 named parameters만 혹은 섞어서 사용하도록 하는 편이 좋을 것 같다. - constructor에 이름을 붙이는게 참 신기하다. 팩토리 패턴의 느낌이 드는 것도 같고..
'컴퓨터 > Flutter' 카테고리의 다른 글
Flutter의 Flexible Widget & Expanded Widget (0) | 2021.09.07 |
---|---|
Dart의 final vs const (0) | 2021.09.06 |
Dart의 private 선언 (0) | 2021.09.05 |
Comments