[Dart] Null safety codelab

jaehee kim·2021년 5월 23일
1

Dart

목록 보기
4/7
post-thumbnail

Null safety codelab

Nullable and non-nullable types

모든 변수의 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.');
}

The null assertion operator (!)

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

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!'));
}

The late keyword

변수가 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!






Reference

[Null safety codelab]

0개의 댓글