guricode

late 본문

앱/Flutter&Dart

late

agentrakugaki 2025. 7. 24. 21:03

late란?

Dart에서 late는 "변수를 나중에 초기화하겠다고 컴파일러에게 알려주는 키워드"입니다.
null을 허용하지 않으면서도, 선언 시 바로 초기화할 수 없는 상황에서 유용합니다.

  • 생성자 이후에 값을 초기화할 때
  • 의존성 주입처럼 순환 참조 또는 나중 할당이 필요한 경우
  • final과 함께 쓰면 한 번만 나중에 초기화하는 변수로 만들 수 있음

 

late String name;

void main() {
  name = "Alice";
  print(name); // 출력: Alice
}

 

아래 코드는 Dart null safety 기준에서 오류입니다:

String name;

이렇게 선언하면 "non-nullable 변수인데 초기화가 안 되어 있다"는 오류가 발생합니다.
이때 late를 쓰면:

late String name;

이제 컴파일러가 "얘는 나중에 초기화될 거야"라고 이해하게 됩니다.


초기화 전에 접근하면?

late String message;
void main() {
  print(message); // ❌ 에러: LateInitializationError
}

값을 대입하기 전에 접근하면 런타임 에러가 납니다.

✅ late는 컴파일 시 null 허용 검사를 우회하지만,
값 없이 사용하면 런타임에서 터진다!


 late final이란?

late final int userId;
  • final: 값을 딱 한 번만 할당 가능
  • late: 그 한 번을 나중에 하겠다

즉, **"딱 한 번만 나중에 초기화 가능한 변수"**입니다.

late final int x;

void main() {
  x = 42;
  print(x);   // 42
  // x = 99;  // ❌ Error: 'x' is final and already assigned.
}

클래스 필드에 유용

class User {
  late String nickname;

  void setNickname(String value) {
    nickname = value;
  }
}

생성자 외의 타이밍에 초기화할 때 late를 써서 null safety와 초기화 시점을 분리합니다.


 late vs nullable ? 차이

구분 late ?

null 허용
초기화 시점 나중에 꼭 해야 함 생략 가능
사용 전 검증 필요? ❗필요 (안 하면 에러) ✅null 체크하면 됨

예시:

late String a;
String? b;

print(a); // ❌ 런타임 에러 (초기화 안됨)
print(b); // null 출력됨

late 남용 주의

  • 필수 초기화를 까먹으면 런타임 에러
  • 테스트 코드에서 꼬이기 쉬움
  • 무분별한 사용은 코드 흐름 파악을 어렵게 함

❗ 가능하면 final, ?, 기본값을 먼저 고려하고
불가피할 때만 late를 사용하세요.


정리

  • late: 나중에 반드시 초기화할 비-null 변수
  • late final: 나중에 딱 한 번 초기화
  • 사용 전 꼭 값을 넣어야 함 (안 그러면 런타임 에러)
  • null이 필요한 상황이라면 ? nullable 타입이 더 나음

 추천 연습

class Config {
  late final String apiUrl;

  Config({required bool isProd}) {
    apiUrl = isProd ? 'https://prod.api.com' : 'https://dev.api.com';
  }
}

다음 주제로는 const vs final vs late 비교도 괜찮고,
테스트 코드에서 late를 어떻게 다루는지도 다뤄볼 수 있어요.
더 심화되거나 카드뉴스/마크다운 버전도 원하시면 말씀해주세요!