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 변수에 접근하면 런타임 오류가 발생합니다.
챌린지
쉬움late 변수를 사용하여 지연 초기화(deferred initialization)와 게으른 초기화(lazy initialization)를 모두 보여주는 데이터베이스 연결 관리자를 만들어 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
database.dart: 데이터베이스 연결을 시뮬레이션하는Database클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:- 객체 생성 후에 설정될
late String connectionString Checking connection...을 출력하고'Connected'를 반환하는 게으른 초기화(lazy initializer)를 가진late String statusconnectionString을 설정하고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() 호출
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.