728x90
728x90
Future
Dart의 Future는 비동기(Asynchronous) 프로그래밍을 처리하는 객체로, 시간이 걸리는 작업(예: 네트워크 요청, 파일 읽기 등)이 완료되었을 때 결과 값을 제공하는 방식입니다.
1. Future의 기본 개념
- Future<T>는 미래에 결과를 반환할 것을 약속(Promise)하는 객체입니다.
- 현재는 작업이 진행 중(Pending)이지만, 일정 시간이 지나면 완료(Completed)되거나 실패(Error)할 수 있습니다.
- Future는 한 번만 완료(Resolved)되며, 이후 변경되지 않습니다.
2. Future의 상태
Future는 실행 과정에서 다음과 같은 상태를 가집니다:
- Uncompleted (미완료)
- 작업이 시작되었지만 아직 결과가 없는 상태.
- Completed with a value (성공)
- 작업이 정상적으로 완료되고 값을 반환한 상태.
- Completed with an error (실패)
- 작업 중 에러가 발생한 상태.
3. Future 사용법
(1) Future 생성 및 사용
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () => "Hello, Dart!");
}
void main() {
fetchData().then((value) {
print(value); // 2초 후 "Hello, Dart!" 출력
});
}
- Future.delayed()를 사용해 2초 후에 "Hello, Dart!" 문자열을 반환.
- .then()을 사용해 결과 값이 도착하면 실행될 로직을 정의.
2) async & await을 사용한 Future 처리
Dart에서는 async와 await 키워드를 사용해 Future의 결과를 더 쉽게 다룰 수 있습니다.
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return "Hello, Dart!";
}
void main() async {
print("Fetching data...");
String result = await fetchData(); // fetchData()가 완료될 때까지 대기
print(result); // 2초 후 "Hello, Dart!" 출력
}
- async를 함수에 붙이면 해당 함수가 Future를 반환하는 비동기 함수가 됨.
- await 키워드를 사용하면 Future가 완료될 때까지 기다렸다가 결과 값을 변수에 할당.
(3) Future 에러 핸들링
Future에서 발생할 수 있는 예외를 처리하려면 .catchError() 또는 try-catch를 사용할 수 있습니다.
1) .catchError() 사용
Future<String> fetchData() {
return Future.delayed(Duration(seconds: 2), () {
throw "데이터를 가져오는데 실패했습니다.";
});
}
void main() {
fetchData().then((value) {
print(value);
}).catchError((error) {
print("Error: $error"); // "Error: 데이터를 가져오는데 실패했습니다." 출력
});
}
2) try-catch & await 사용
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
throw "네트워크 오류 발생";
}
void main() async {
try {
String result = await fetchData();
print(result);
} catch (e) {
print("Error: $e"); // "Error: 네트워크 오류 발생" 출력
}
}
- try-catch를 사용해 await으로 호출한 Future에서 발생한 에러를 안전하게 처리 가능.
4. 여러 개의 Future 동시 실행
(1) Future.wait()
여러 개의 Future를 병렬로 실행하고, 모든 작업이 완료될 때까지 기다릴 수 있습니다.
Future<String> fetchData1() async {
await Future.delayed(Duration(seconds: 2));
return "데이터 1";
}
Future<String> fetchData2() async {
await Future.delayed(Duration(seconds: 3));
return "데이터 2";
}
void main() async {
print("Fetching all data...");
List<String> results = await Future.wait([fetchData1(), fetchData2()]);
print(results); // 2초 후 ["데이터 1", "데이터 2"] 출력
}
- Future.wait([future1, future2])를 사용하면 여러 Future를 동시에 실행하고, 모든 Future가 완료될 때까지 기다림.
- 실행 속도가 더 빠른 Future가 먼저 완료되더라도, 모든 Future가 끝날 때까지 결과를 반환하지 않음.
(2) Future.any()
여러 개의 Future 중 가장 먼저 완료된 결과를 반환합니다.
Future<String> fetchDataFast() async {
await Future.delayed(Duration(seconds: 2));
return "빠른 데이터";
}
Future<String> fetchDataSlow() async {
await Future.delayed(Duration(seconds: 5));
return "느린 데이터";
}
void main() async {
String firstResult = await Future.any([fetchDataFast(), fetchDataSlow()]);
print(firstResult); // 2초 후 "빠른 데이터" 출력
}
728x90
728x90
'Flutter > 개념' 카테고리의 다른 글
| Dart 기본기 - Dart 3.0 클래스 (1) | 2025.02.05 |
|---|---|
| Dart 기본기 - Stream, await, async, yield (2) | 2025.02.05 |
| Dart 기본기 - final vs const 차이 (2) | 2025.02.03 |
| Dart 기본기 - null 사용법 (2) | 2025.02.03 |
| Dart 기본기 - dynamic vs var 차이 (2) | 2025.02.03 |
댓글