'late'는 'final'이나 'var', 변수 타입 선언 앞에 붙여줄 수 있는 수식어임!
예시를 들어보자면...
late final name1;
late final String name2;
late var name3;
'late'는 초기 데이터 없이 변수를 선언할 수 있게 해줌!
-> 변수를 '선언'부터 하고 나중에 데이터를 넣어줌!
물론 'late final'로 되어 있는 'name1'이나 'name2'는 한번 변수를 할당해주면 다시 못바꿈!\
그리고... 만약 late로 변수를 만들고 값을 할당하지 않았는데 사용하려고 한다면...?
print(name1); // <- The late local variable 'name1' is definitely unassigned at this point.
위 코드블럭에서 보다시피, 값을 할당하지 않았다고 에러를 볼 수 있게 해준다!(빨간줄...!)
조금 생각해보니... 사실, 'main' 함수 안에서는 late가 필요 없다! 그냥 선언해줄 수 있다.
그러면... late는 왜 쓸까?
class가 도입된다면 얘기가 달라진다. 예시를 들어보자.
* https://dart.dev/null-safety/understanding-null-safety#smarter-null-aware-methods (dart 공식 문서)에서 참고했다.
// Using null safety, incorrectly:
class Coffee {
String _temperature; // <- Error : Non-nullable instance field '_temperature' must be initialized.
void heat() { _temperature = 'hot'; }
void chill() { _temperature = 'iced'; }
String serve() => _temperature + ' coffee';
}
main() {
var coffee = Coffee();
coffee.heat();
coffee.serve();
}
위 코드는 coffee.heat();또는 coffee.chill();를 이용하여 _temperature에 hot 또는 iced를 넣고, coffee.serve();를 이용하여 hot coffee인지, iced coffee인지 확인하는 코드이다.
언듯 보면 그냥 이상 없어 보이지만, 위 코드를 dartpad나 vscode등에 넣어보면 '_temperature'에서 오류가 나타난다는 것을 알 수 있다.
그러니까, class 안에서는 무조건 'initialize'. 즉, 초기화를 해주어야 한다.(String이 Non-nullable 하니까!)
ex) String _temperature = 'hot'; 이런식으로 변수를 할당해서 초기화 해야 한다.
위 코드를 해결하기 위해서는 두 가지 해결책이 있다.
1) String _temperature; -> String? _temperature;
2) String _temperature; -> late String _temperature;
첫번째 방법은 변수 '_temperature'를 Nullable 하도록 바꾸는 것.
두번째 방법은 변수 '_temperature'를 'late'를 이용해 '할당을 잠시 미루는 것'
하지만, 위 코드는 뜨거운 커피인지 차가운 커피인지 구분하기 위한 코드이다. 따라서, 'Null 값이 들어와서는 안된다!'
따라서 'late'를 이용하여 할당을 잠시 미루고(잠깐동안 null 상태로 두고) 변수에 어떤 값을 넣도록 하는 것이다.
즉, 타인이 이 코드를 볼 때 '방법1'로 되어있을 경우 '아, 변수 _temperature는 null값이 들어올 수도 있구나'라는 착각을 할 수도 있게 된다.
타인이 '방법2' 코드를 볼 경우에는 '아, 변수 _temperature는 이후에 값을 할당받겠구나'라는 정확한 인식을 하게 된다!
dart 공식 문서에서는 아래와 같이 말한다
The late modifier lets you defer initialization, but still prohibits you from treating it like a nullable variable.
'late'는 초기화(initialization)을 나중에 할 수 있도록 해주지만, 개발자가 그 변수를 nullable처럼 사용하는 것을 막아준다.
'앱 만들기 프로젝트 > Dart' 카테고리의 다른 글
Dart - 2.0 Basic Data Types (0) | 2023.02.28 |
---|---|
Dart - 1.6 Constant Variables (0) | 2023.02.28 |
Dart - 1.4 Final Variables (0) | 2023.02.28 |
Dart - 1.3 Nullable Variables (0) | 2023.02.27 |
Dart - 1.2 Dynamic Type (0) | 2023.02.26 |