Dart에서 late
키워드는 변수가 선언된 후에 언젠가는 초기화될 것이라는 것을 Dart 컴파일러에게 알려주는 역할을 합니다. 특히, null safety 기능과 함께 사용될 때 이는 매우 유용한데, 변수가 사용되기 전까지는 null이 아닌 값을 가지게 될 것이라는 것을 보장하기 때문입니다.
여기에 간단한 예제를 들어서 설명해보겠습니다.
class MyClass {
late String text;
void loadText() {
// 상상해보세요, 여기서 비동기 함수를 호출해서 데이터를 가져온다고 합니다.
// 데이터를 받아온 후에 text 변수를 초기화합니다.
text = "Hello, World!";
}
}
위 예제에서 text
변수는 late
키워드를 사용하여 선언되었습니다. 이는 MyClass
의 인스턴스가 생성될 때 text
가 바로 초기화되지 않고, loadText
함수가 호출되어 실제 데이터를 받아온 후에 초기화될 것임을 의미합니다.
이제 본문에서 언급된 DetailScreen
위젯의 코드를 다시 살펴보며 설명하겠습니다.
class DetailScreen extends StatefulWidget {
// 위젯의 생성자와 상태 클래스 선언은 동일하므로 생략합니다.
}
class _DetailScreenState extends State<DetailScreen> {
// 여기서 late 키워드를 사용하여 변수를 선언합니다.
late Future<WebtoonDetailModel> webtoon;
late Future<List<WebtoonEpisodeModel>> episodes;
void initState() {
super.initState();
// initState 메서드 내에서 API 호출을 통해 webtoon과 episodes를 초기화합니다.
webtoon = ApiService.getToonById(widget.id);
episodes = ApiService.getLatestEpisodesById(widget.id);
}
// build 메서드와 위젯의 UI는 동일하므로 생략합니다.
}
위 코드에서 webtoon
과 episodes
는 initState
메서드가 호출될 때, 즉 위젯이 초기화될 때까지 초기화를 지연시킵니다. 이는 데이터를 비동기적으로 가져와야 하는 경우 매우 유용한데, 이를 통해 위젯의 생성자에서 비동기 작업을 수행하는 것을 피하면서도, 필요한 데이터가 준비될 때까지 변수의 초기화를 안전하게 지연시킬 수 있습니다.
late
키워드 덕분에, Dart 컴파일러는 webtoon
과 episodes
가 실제로 사용되기 전에 반드시 초기화될 것이라는 것을 알 수 있으며, 이로 인해 null safety를 위반하지 않습니다. 만약 late
를 사용하지 않고 null
을 허용하는 타입(Future<WebtoonDetailModel>?
또는 Future<List<WebtoonEpisodeModel>>?
)으로 변수를 선언했다면, 매번 변수를 사용할 때마다 null 체크를 해야 하는 번거로움이 있을 것입니다.