Menu
Coddy logo textTech

Late 변수

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

late 키워드는 Dart에게 non-nullable 변수가 즉시 할당되지는 않더라도 사용되기 전에 초기화될 것임을 알려줍니다. 이는 선언부나 생성자에서 필드를 초기화할 수 없지만, 해당 변수에 접근하기 전에 반드시 값이 할당될 것임을 확신할 때 유용합니다.

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
  
  void greet() {
    print('Hello, $username!');
  }
}

User user = User();
user.initialize('Alice');
user.greet();  // Hello, Alice!

late가 없으면, Dart는 username이 초기화되지 않았다고 경고할 것입니다. late 수식어는 값을 읽기 전에 값을 할당할 것임을 약속합니다.

late의 또 다른 장점은 지연 초기화(lazy initialization)입니다. 초기화 구문이 있는 late 변수는 처음 액세스될 때까지 그 값을 계산하지 않습니다:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();
print('Config created');
print(config.settings);  // 여기서 "Loading..."이 출력된 후 "default"가 출력됨

loadSettings() 메서드는 객체가 생성될 때가 아니라 settings에 처음 접근할 때만 실행됩니다. 하지만 주의하세요 - 초기화되기 전에 late 변수에 접근하면 런타임 오류가 발생합니다.

challenge icon

챌린지

쉬움

late 변수를 사용하여 지연 초기화(deferred initialization)와 게으른 초기화(lazy initialization)를 모두 보여주는 데이터베이스 연결 관리자를 만들어 보겠습니다.

코드를 구성하기 위해 두 개의 파일을 생성합니다:

  • database.dart: 데이터베이스 연결을 시뮬레이션하는 Database 클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:
    • 객체 생성 후에 설정될 late String connectionString
    • Checking connection...을 출력하고 'Connected'를 반환하는 게으른 초기화(lazy initializer)를 가진 late String status
    • connectionString을 설정하고 Connection configured: [connectionString]을 출력하는 connect(String connStr) 메서드
    • Executing on [connectionString]: [sql]을 출력하는 query(String sql) 메서드
    • Status: [status]를 출력하는 checkStatus() 메서드 (이 메서드는 첫 호출 시 게으른 초기화를 트리거합니다)
  • main.dart: 데이터베이스 클래스를 임포트하고 late의 두 가지 사용 사례를 보여줍니다:
    • Database 인스턴스 생성
    • Database object created 출력
    • 연결 문자열 'localhost:5432/mydb'와 함께 connect() 호출
    • 'SELECT * FROM users'와 함께 query() 호출
    • 게으른 초기화를 트리거하기 위해 checkStatus() 호출

connectionString은 객체 생성 후 수동으로 설정되는 반면, status는 처음 액세스될 때만 값을 계산하는 방식의 차이를 확인해 보세요.

예상 출력:

Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: Connected

치트 시트

late 키워드를 사용하면 사용하기 전에 나중에 초기화될 null 허용 안 함(non-nullable) 변수를 선언할 수 있습니다:

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
}

User user = User();
user.initialize('Alice');

지연 초기화(Lazy Initialization): 초기화 구문이 있는 late 변수는 처음 액세스할 때만 값을 계산합니다:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();  // loadSettings()가 아직 호출되지 않음
print(config.settings);     // 여기서 loadSettings()가 호출됨

경고: 초기화하기 전에 late 변수에 액세스하면 런타임 오류가 발생합니다.

직접 해보기

import 'database.dart';

void main() {
  // TODO: Database 인스턴스 생성
  
  // TODO: 'Database object created' 출력
  
  // TODO: 'localhost:5432/mydb'를 인자로 connect() 호출
  
  // TODO: 'SELECT * FROM users'를 인자로 query() 호출
  
  // TODO: 지연 초기화(lazy initialization)를 트리거하기 위해 checkStatus() 호출
}
quiz icon실력 점검

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

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