Menu
Coddy logo textTech

late 키워드와 널 안정성

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 110개 중 26번째.

때로는 null을 허용하지 않는 변수가 필요하지만, 그 값을 즉시 할당할 수 없을 때가 있습니다. late 키워드는 Dart에 "사용하기 전에 이 변수를 초기화하겠다고 약속합니다."라고 알립니다.

late String description;

void setup() {
  description = 'Initialized later';
}

void main() {
  setup();
  print(description);  // 작동함 - 사용 전에 초기화됨
}

late가 없으면 Dart는 description이 초기화되지 않았다고 불평합니다. late를 사용하면 접근하기 전에 해당 값이 있도록 보장할 책임을 집니다. initialization 전에 읽으려고 하면 런타임 오류가 발생합니다.

일반적인 사용 사례는 실제로 필요할 때까지 지연하고 싶은 비용이 많이 드는 계산입니다:

class DataProcessor {
  late List<int> data = _loadData();
  
  List<int> _loadData() {
    print('Loading data...');
    return [1, 2, 3, 4, 5];
  }
}

DataProcessor processor = DataProcessor();
// 'Loading data...'가 아직 출력되지 않았습니다
print(processor.data);  // 이제 로드되고 출력됩니다

_loadData() 메서드는 객체가 생성될 때가 아니라 data에 처음 액세스할 때만 실행됩니다. 이 지연 초기화는 값이 필요하지 않을 수도 있는 경우 성능을 향상할 수 있습니다.

변수가 사용되기 전에 초기화될 것이라고 확신하지만 선언 시점에 초기화할 수 없다면 late를 사용하세요. 이는 컴파일러와의 약속입니다. 그 약속을 어기면 프로그램이 충돌합니다.

challenge icon

챌린지

쉬움

지연된 초기화를 위한 late 변수의 강력한 기능을 보여 주는 ConfigurationManager를 만들어 보겠습니다. 실제로 Configuration이 필요할 때만 비용이 많이 드는 설정 작업이 수행되는 시스템을 만들게 됩니다.

코드를 두 개의 파일로 구성합니다:

  • config_manager.dart: 애플리케이션 설정을 처리하는 ConfigManager class를 Declare합니다. class에는 다음 항목이 있어야 합니다:
    • constructor를 통해 전달되는 String appName
    • setup method를 통해 later initialized되는 late String databaseUrl
    • 처음 accessed될 때 Calculating max connections...를 출력하고 100을 반환하는 lazy initialization이 적용된 late int maxConnections
    • databaseUrl을 initialize하는 setupDatabase(String url) method
    • 현재 Configuration을 출력하는 displayConfig() method
  • main.dart: config manager를 import하고 late 변수가 어떻게 작동하는지 보여 줍니다:
    • app name이 'MyApp'ConfigManager를 Create합니다
    • Config created를 출력합니다
    • URL 'localhost:5432/mydb'와 함께 setupDatabase를 Call합니다
    • Accessing max connections...를 출력합니다
    • maxConnections의 값을 출력합니다
    • Accessing max connections again...을 출력합니다
    • maxConnections의 값을 again 출력합니다 (calculation message가 반복되지 않는다는 점에 유의하세요)
    • displayConfig()를 Call합니다

displayConfig() method는 다음 형식으로 출력해야 합니다:

--- Configuration ---
App: [appName]
Database: [databaseUrl]
Max Connections: [maxConnections]

lazy maxConnections calculation은 한 번만, 즉 처음 accessed할 때만 실행된다는 점에 유의하세요. 이것이 initializer와 함께 사용하는 late의 장점입니다!

예상 output:

Config created
Accessing max connections...
Calculating max connections...
100
Accessing max connections again...
100
--- Configuration ---
App: MyApp
Database: localhost:5432/mydb
Max Connections: 100

직접 해보기

import 'config_manager.dart';

void main() {
  // TODO: 앱 이름 'MyApp'으로 ConfigManager 생성
  
  // TODO: Print 'Config created'
  
  // TODO: Call setupDatabase with URL 'localhost:5432/mydb'
  
  // TODO: Print 'Accessing max connections...'
  
  // TODO: Print the value of maxConnections
  
  // TODO: Print 'Accessing max connections again...'
  
  // TODO: Print the value of maxConnections again
  // (계산 메시지가 반복되지 않는 것에 주목하세요)
  
  // TODO: displayConfig() 호출
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Dart 컴파일러