본문 바로가기
Dart/심화

[Dart] Type Promotion이란

by 붕어사랑 티스토리 2022. 6. 8.
반응형

1. Type Promotion이란?

Dart의 flow Analysis는 nullability까지 분석한다. 여기서 만약 Dart의 코드분석이 nullable변수인데 절대 null값을 가질 수 없는 변수를 발견한다면, Dart는 이 nullable변수를 non-nullable로 취급한다.

 

 

 

2. 예제

 

Definite Assignment

다트의 코드분석은 변수가 언제 선언되고,어디서 읽히는지 까지 추적한다. 그리고 non-nullalble변수가 사용되기전에 값을 할당 받았는지 까지 추적이 가능하다.

 

이러한 추적 과정을 Definite Assignment라고 한다.

 

아래의 케이스에서는 text가 사용되기전에 값을 할당받지 못했다. 고로 Dart에서는 이를 추적하여 error를 일으켜 개발자에게 알려준다.

void main() {
  String text;

//  if (DateTime.now().hour < 12) {
//    text = "It's morning! Let's make aloo paratha!";
//  } else {
//    text = "It's afternoon! Let's make biryani!";
//  }

  print(text);
  print(text.length);
}

 

 

 

 

Null Checking

아래코드는 에러가 나지 않는다.

 

str이 nullable변수인데 어떻게 ? 없이 str.length를 하였는지는, 앞서 배운 Type Promotion 개념을 적용하면 이해 가능하다.

 

str.length를 호출하기전에 이미 함수에서 null check를 하였다. 즉 str.length를 호출하는 시점에서 str은 null이 될 수 없기 때문에 str은 타입 프로모션 개념에 의해 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!'));
}

 

 

Null Checking with Exception

위 코드에서 return 0 대신 익셉션을 throw 하였다. 이 예제 또한 타입 프로모션이 적용된다.

 

int getLength(String? str) {
  // Try throwing an exception here if `str` is null.
  if(str == null) throw Exception;
  return str.length;
}

void main() {
  print(getLength(null));
}

 

 

 

 

 

 

 

또다른 타입 프로모션 예제

 

아래의 코드는 object는 타입프로모션이 된다.

bool isEmptyList(Object object) {
  if (object is! List) return false;
  return object.isEmpty;
}

즉 if문을 지난 시점에서 object는 List자료형인게 확실시 되기에 list형태로 간주된다.

 

반응형

댓글