https://dart.dev/null-safety/understanding-null-safety#smarter-null-aware-methods
해당 블로그 내용은 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 |
댓글