앱 만들기 프로젝트/Dart

Dart - 1.5 Late Variables

지나가는물리학부생 2023. 2. 28. 21:54
반응형

'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