본문 바로가기
Dart/심화

[Dart] late변수 사용 시기, nullable변수와의 차이

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

https://dart.dev/null-safety/understanding-null-safety#smarter-null-aware-methods

 

Understanding null safety

A deep dive into Dart language and library changes related to null safety.

dart.dev

 

해당 블로그 내용은 null safety에 대한 이해에서 발췌 해 왔음

1. 개요

다트에서는 late변수를 제공한다. late변수를 사용하면 non-nullable변수의 초기화를 나중에 할 수 있다. 헌데 한가지 의문점이 있다. 변수의 자료형을 nullable로 선언해도 나중에 초기화를 할 수 있으니 그냥 nullable을 쓰면 되지 왜 굳이 구글은 late라는 키워드를 만들었을까?

 

결론부터 말하면

 

late대신 nullable로 선언할 경우, 개발자가 다른 사람에게 코드의 관리를 넘겼을 때, 넘겨받은 관리자가 null이라는 값도 변수에 의미있는 값으로 오해할 수 있기 때문이다.

 

 

아래 예제를 보자. 커피를 끓이거나 아이스로 만들어서 제공하는 코드이다.

// Using null safety, incorrectly:
class Coffee {
  String _temperature;

  void heat() { _temperature = 'hot'; }
  void chill() { _temperature = 'iced'; }

  String serve() => _temperature + ' coffee';
}

main() {
  var coffee = Coffee();
  coffee.heat();
  coffee.serve();
}

이 코드는 에러가 난다. non nullable인 _temperature가 선언에도 초기화 되지 않고, 생성자에서도 초기화 되지 않았기 때문이다.

 

 

Dart에 대해 제대로 이해하지 못하는 개발자는 이를 해결하기 위해 아래 처럼 코드를 작성 하여 해결 할 수 있다.

// Using null safety:
class Coffee {
  String? _temperature;

  void heat() { _temperature = 'hot'; }
  void chill() { _temperature = 'iced'; }

  String serve() => _temperature! + ' coffee';
}

 

여기서 한가지 문제점이 있다. 개발자는 _temperature를 절대 null로 만들 생각이 없는데 단순히 눈앞의 에러를 해결하기 변수의 자료형을 nullable로 만들었고 이는 변수에 null값을 넣는것도 의미있다 라고 얘기하는 것과 같다. 그리고 회사를 퇴사하면서 다른 사람에게 이 코드를 넘겼다.

 

 

 

새로운 담당자는 _temperature가 null이되면 안되는 사실을 모른채, 변수의 자료형이 nullable인 것을 보고 _temperature에 null이 들어가도 상관없겠지 라는 생각을 할 수 있다. 그리고 null값이 들어가도 신경쓰지 않는다.

 

 

이러한 일이 벌어지면 분명 큰 일이 일어날 것이다. 이를 방지하기 위해서 late라는 키워드를 사용하는 것이다.

// Using null safety:
class Coffee {
  late String _temperature;

  void heat() { _temperature = 'hot'; }
  void chill() { _temperature = 'iced'; }

  String serve() => _temperature + ' coffee';
}

이렇게 코드를 수정하면 _temperature를 read 할 때 값이 null이면 익셉션을 일으킬 수 있다.

 

 

구글에서는 late키워드에 이렇게 말한다

 

The late modifier lets you defer initialization, but still prohibits you from treating it like a nullable variable.

 

late키워드는 값의 초기화를 뒤로 미루지만, 개발자가 null을 실수로 사용하는것을 막아준다.

 

 

 

late를 사용하는 이유에 대해서 위와같이 꼭 외우고 다니자!

반응형

'Dart > 심화' 카테고리의 다른 글

[Dart] non nullable 변수의 초기화 시기  (0) 2022.06.10
[Dart] Type Promotion이란  (0) 2022.06.08

댓글