모든 변수의 type들은 default로 non-nullable 입니다. 만약 nullable로 변경하고 싶다면 type에 '?' 를 추가하면 됩니다.
void main() {
int? a;
a = null;
print('a is $a.');
}
void main() {
List<String> aListOfStrings = ['one', 'two', 'three'];
List<String>? aNullableListOfStrings;
List<String?> aListOfNullableStrings = ['one', null, 'three'];
print('aListOfStrings is $aListOfStrings.');
print('aNullableListOfStrings is $aNullableListOfStrings.');
print('aListOfNullableStrings is $aListOfNullableStrings.');
}
nullable type인 표현식이 null 아니라는 것을 확신할 수 있다면 '!' 를 사용하여 non-nullable로 처리하도록 할 수 있습니다.
표현식 뒤에 '!' 를 추가하여 해당 값이 null이 되지 않을 것이라고 알려줍니다.
int? couldReturnNullButDoesnt() => -3;
void main() {
int? couldBeNullButIsnt = 1;
List<int?> listThatCouldHoldNulls = [2, null, 4];
int a = couldBeNullButIsnt;
int b = listThatCouldHoldNulls.first!; // first item in the list
int c = couldReturnNullButDoesnt()!.abs(); // absolute value
print('a is $a.');
print('b is $b.');
print('c is $c.');
}
Type promotion 은 null을 포함할 가능성이 없는 nullable 변수를 non-nullable 변수처럼 처리합니다.
int getLength(String? str) {
// Add null check here
if (str == null) return 0;
return str.length;
}
void main() {
print(getLength('This is a string!'));
}
변수가 non-nullable 이고 값을 즉시 할당할 수 없을 때, late keyword를 사용하고 Dart에게 다음과 같이 말하는 것과 같습니다.
- 값을 아직 할당하지 않도해라.
- 값을 나중에 할당할 것이다.
- 변수가 사용되기 전에 확실히 값을 가지도록 할 것이다
만약 late keyword를 적용한 변수가 값이 할당되기전에 사용되면 error가 발생합니다.
class Meal {
late String _description;
set description(String desc) {
_description = 'Meal description: $desc';
}
String get description => _description;
}
void main() {
final myMeal = Meal();
myMeal.description = 'Feijoada!';
print(myMeal.description);
}
class Team {
late final Coach coach;
}
class Coach {
late final Team team;
}
void main() {
final myTeam = Team();
final myCoach = Coach();
myTeam.coach = myCoach;
myCoach.team = myTeam;
print('All done!');
}
compute resourece를 많이 사용하는 부분이 있을 때, 사용할지 않할지도 모르기 때문에 미리 계산하지 않고 사용할 때 계산하도록 lazy initialization 을 이용할 수 있습니다.
int _computeValue() { // compute resourece를 많이 사용하는 부분
print('In _computeValue...');
return 3;
}
class CachedValueProvider {
late final _cache = _computeValue(); // 사용되기 전까지 동작안함.
int get value => _cache;
}
void main() {
print('Calling constructor...');
var provider = CachedValueProvider();
print('Getting value...');
print('The value is ${provider.value}!');
}
// 출력 결과
Calling constructor...
Getting value...
In _computeValue... -> 사용되기 전까지 기다렸다가 동작함
The value is 3!