IT News/Flutter & Dart

Dart 에서 Sound null safety 예제(example)

skyLove1982 2022. 3. 3. 18:52
반응형

변수명 옆에 물음표(?)를 붙이면  그 변수는 null 값이 될 수 있다는 것을 의미하는데요.

DateTime? launchDate;

여기에서 launchDate 값이 null 이 될 수 있습니다.

이렇게 선언한 이유는  값이 할당되지 못하는 경우가 있기 때문인데요.

예를 들어서 우주 탐사선인 보이저호가 1977년 9월 5일에 발사가 되었는데요.

보이저3호는 아직 발사일이 정해지지 않았습니다.

따라서 발사일인 launchDate 값은 null 이 될 수 있습니다.

아래의 예제를 확인해 보세요.

class Spacecraft {
  String name;
  DateTime? launchDate;

  // Read-only non-final property
  int? get launchYear => launchDate?.year;

  // Constructor, with syntactic sugar for assignment to members.
  Spacecraft(this.name, this.launchDate) {
    // Initialization code goes here.
  }

  // Named constructor that forwards to the default one.
  Spacecraft.unlaunched(String name) : this(name, null);

  // Method.
  void describe() {
    print('Spacecraft: $name');
    // Type promotion doesn't work on getters.
    var launchDate = this.launchDate;
    if (launchDate != null) {
      int years = DateTime.now().difference(launchDate).inDays ~/ 365;
      print('Launched: $launchYear ($years years ago)');
    } else {
      print('Unlaunched');
    }
  }
}


void main(){
  var voyager = Spacecraft('Voyager I', DateTime(1977, 9, 5));
  voyager.describe();

  var voyager3 = Spacecraft.unlaunched('Voyager III');
  voyager3.describe();
}

Dart 에서는 기본 생성자(Constructor)가 클래스 이름하고 동일한데요.

생성자를 추가하게 될때에는 클래스 이름 옆에 점을 붙이고 생성자의 이름을 입력합니다.

Spacecraft.unlaunched(String name) : this(name, null);

매개변수로 name 을 받고 기본 생성자를 이용해서 초기화를 했습니다.

 

그리고 describe 함수를 통해서 현재 시간을 기준으로 발사일로부터 몇일이 지났는지를 출력을 하게 되는데요.

문제는 발사를 아직 하지 않은 경우에는 어떻게 처리를 하느냐 입니다.

그래서 launchDate 변수에 null 값이 들어가도록 한것 같은데요.

값이 null 이면 Unlaunched 를 출력하고 아니면 발사일로 부터 몇일이 지났는지를 계산하는 것이지요.

 

Sound null safety 라서 null 값을 전혀 쓰면 않되는것이 아니라 이런 경우에도 사용이 가능하다는 점입니다.

저도 처음에는 이해가 않되었지만 이 예제를 보고 이해가 되었습니다.

 

반응형