Flutter 개발 상자

[Flutter] late 키워드를 쓰면서 초기화를 동시에 한다면? 본문

Flutter/간단팁

[Flutter] late 키워드를 쓰면서 초기화를 동시에 한다면?

망고상자 2024. 1. 9. 15:42
728x90

다음 코드의 결과는?

 

void main() {
  late int a;
  late final b = a + 1;

  print('b = $b');
  a = 1;
}

 

위 코드의 실행 결과는 어떻게 될까?

 

 

 

 

당연하게도 에러가 발생한다.

Uncaught Error: LateInitializationError: Local 'a' has not been initialized.

에러의 내용은 a 변수가 초기화 되지 않았다는 것으로

b를 초기화할때 a라는 late 변수를 넣었는데 a는 초기화가 되지 않은 상태였기 때문에 오류가 발생한다.

이와같이 late 키워드는 빌드타임에서는 정상이지만 런타임에서 갑작스런 초기화 에러가 발생할 수 있기에 사용하기가 좀 꺼려지는 면이 어느정도 있다.

 

void main() {
  late int a;
  late final b = a + 1;

  a = 1;
  print('b = $b');
}

 

그렇다면 이 코드의 실행 결과는 어떤가?

 

 

 

 

설마? 했다면 그 설마가 맞다.

에러가 발생하지 않고 'b = 2' 라는 텍스트가 콘솔에 출력된다.

 

코드는 위에서 아래로 동기적으로 실행된다.

그렇기 때문에 보통이라면 a = 1; 라인보다 b변수의 초기화 코드가 먼저 실행되서 에러가 발생해야한다.

실제로 b 변수에 붙은 late 키워드를 제거하면 에러가 발생한다.

 

하지만 late 키워드가 붙는순간 변수에 붙는 초기화 코드는

 

'late 변수가 사용되기 직전 초기화가 일어난다.'

 

즉 print('b = $b'); 이 코드가 실행되기 직전에 초기화가 일어나기에 a 변수가 이미 초기화가 되어있는 상태이다.

 

 

공식문서를 살펴보자

 

https://dart.dev/language/variables#late-variables

 

 

 

Dart 공식문서를 late의 사용은 2가지 사용 방법이 있으며,

late를 붙여서 not Null 타입의 변수를 나중에 초기화할 수 있게 해주는 기능과

변수를 느리게 초기화 하는 기능이 있다고 한다.

 

첫번째 사용법은 대부분이 알고있고 실제로도 유용하게 쓰고 있겠지만

두번째 사용법은 잘 쓰이지 않는다.

 

공식문서에서는 변수가 필요하지 않을 수 있지만 초기화하는데 비용이 많이 들 경우 late 사용을 하라고 권장하고 있다.

 

 

 

코틀린의 lazy by를 아십니까?

 

코틀린을 경험해본 프로그래머라면 lazy by 키워드를 알고 있을 것이다.

이것과 late 변수에 초기화하는것은 동일하게 사용 직전에 초기화를 진행해준다는것이기에

 

코틀린을 한번 써봤다면 이해하기가 더 쉬울 수 있다.

 

지금은 잘 안쓰지만 UI 변수에 findById 같은 작업을 일괄적으로 해줄때 lazy by를 이용하면 onActivity 단에 코드가 확 줄어서 코드가 깔끔해진다.

 

플러터에서는 어디서 쓸까 생각해보면 당장 막 떠오르는 사용처는 없는데 머리속에 넣고 인지하고 있다면 반드시 유용하게 사용할만한 타이밍이 한번은 오지 않을까 싶다.

728x90