Dart의 비동기 프로그래밍 모델은 Future와 Stream을 사용하여 구현됩니다. 이들은 Dart에서 비동기 연산을 처리하는 데 필수적인 구성 요소입니다. Future는 단일 비동기 연산을 나타내며, Stream은 연속적인 비동기 이벤트를 다룹니다.
Future는 미래에 어떤 값이나 오류를 반환할 수 있는 비동기 연산을 나타냅니다. 일반적으로, 파일 읽기/쓰기, 네트워크 요청 등의 작업을 수행할 때 사용됩니다.
Future<String> fetchUserData() {
// 비동기 연산을 흉내내는 Future
return Future.delayed(Duration(seconds: 2), () => 'User data');
}
void main() {
fetchUserData().then((data) {
print(data); // 2초 후 'User data' 출력
}).catchError((error) {
print(error);
});
}
async와 await 키워드를 사용하여 Future를 더 쉽게 다룰 수 있습니다. await는 Future가 완료될 때까지 기다립니다.
Future<void> printUserData() async {
var data = await fetchUserData();
print(data); // 'User data' 출력
}
void main() {
printUserData();
}
Stream은 시간이 지남에 따라 여러 개의 데이터 이벤트를 제공할 수 있는 비동기 연산의 연속입니다. 예를 들어, 사용자 입력, 파일에서의 데이터 스트림 읽기 등이 있습니다.
Stream<int> countStream(int max) {
return Stream.periodic(Duration(seconds: 1), (x) => x + 1).take(max);
}
void main() {
countStream(5).listen(
(data) {
print(data); // 1초 간격으로 1부터 5까지 출력
},
onDone: () {
print('Done!');
},
);
}
Stream을 사용하면 데이터의 흐름을 비동기적으로 처리할 수 있으며, 이벤트 기반 프로그래밍을 구현할 수 있습니다. 또한, 여러 데이터 소스로부터 발생하는 이벤트를 효율적으로 관리할 수 있습니다.
Dart에서 Future와 Stream은 비동기 프로그래밍을 구현하는 핵심적인 요소입니다. Future는 단일 비동기 작업을 처리하는 반면, Stream은 연속적인 비동기 데이터 이벤트를 처리합니다. async와 await 키워드를 사용하여 비동기 코드를 명확하고 직관적으로 작성할 수 있으며, 이를 통해 더 응답성 높고 효율적인 애플리케이션을 만들 수 있습니다.