Category/Dart
Dart 언어에서 비동기 프로그래밍을 할 때 사용하는 Future 객체 알아보기
Corinee
2024. 9. 28. 15:50
728x90
Future는 Dart 언어에서 비동기 프로그래밍을 할 때 사용하는 객체입니다. 비동기 프로그래밍은 네트워크 요청, 파일 읽기/쓰기, 데이터베이스 조회 등 시간이 걸리는 작업을 처리하면서 동시에 다른 작업을 수행할 수 있게 해줍니다. Future는 나중에 완료될 작업을 나타내며, 비동기 작업의 결과를 나타내거나, 오류를 처리하는 데 사용됩니다.
1. Future란?
- Future는 아직 완료되지 않은 작업의 결과를 나타내는 약속(Promise)입니다.
- 시간이 걸리는 작업(예: 파일 읽기, 네트워크 요청, 데이터베이스 조회 등)이 완료되면 Future는 완료(complete) 상태가 되어 결과를 반환하거나 오류를 발생시킵니다.
- 작업이 완료된 후의 결과를 콜백 또는 async/await를 사용하여 처리할 수 있습니다.
2. Future의 동작 방식
Future는 세 가지 상태를 가질 수 있습니다:
- 미완료 상태 (Uncompleted): 작업이 아직 완료되지 않았으며, 결과를 기다리고 있는 상태입니다.
- 완료 상태 (Completed): 작업이 성공적으로 완료되어 결과를 반환한 상태입니다.
- 오류 상태 (Error): 작업이 실패하여 오류가 발생한 상태입니다.
3. Future 사용 예제
1) 비동기 함수 정의 및 사용
Dart에서 비동기 함수를 정의할 때 Future를 반환합니다. 예를 들어, 데이터를 네트워크에서 가져오는 작업을 비동기적으로 처리하려면 다음과 같이 코드를 작성할 수 있습니다.
Future<String> fetchData() {
// 2초 동안 기다린 후에 데이터를 반환
return Future.delayed(Duration(seconds: 2), () {
return '데이터를 가져왔습니다!';
});
}
위의 코드에서 fetchData 함수는 Future<String>을 반환합니다. 이 함수는 2초 동안 기다린 후 문자열 데이터를 반환합니다.
2) then을 사용하여 Future 처리
then 메서드를 사용하여 Future가 완료되었을 때의 결과를 처리할 수 있습니다.
void main() {
fetchData().then((result) {
print(result); // "데이터를 가져왔습니다!" 출력
}).catchError((error) {
print('오류 발생: $error');
});
}
위 코드에서 fetchData 함수는 2초 후에 "데이터를 가져왔습니다!"라는 문자열을 반환하고, then 블록이 실행되어 결과를 출력합니다. catchError를 사용하면 오류가 발생했을 때 처리할 수 있습니다.
3) async/await를 사용한 간편한 비동기 처리
Dart에서는 async와 await 키워드를 사용하여 비동기 코드를 더 간결하고 읽기 쉽게 작성할 수 있습니다.
Future<void> main() async {
try {
String result = await fetchData();
print(result); // "데이터를 가져왔습니다!" 출력
} catch (error) {
print('오류 발생: $error');
}
}
- await 키워드는 Future가 완료될 때까지 기다렸다가 그 결과를 반환합니다.
- async 키워드는 함수가 비동기 함수임을 표시하며, 반드시 반환 타입이 Future여야 합니다.
- try/catch 블록을 사용하여 오류를 처리할 수 있습니다.
4. Future의 장점
- 비동기 처리: Future를 사용하면 메인 스레드(UI 스레드)를 차단하지 않고 시간이 걸리는 작업을 비동기적으로 처리할 수 있습니다.
- 성능 향상: 파일 읽기, 데이터베이스 조회, 네트워크 요청 등의 작업이 진행되는 동안 다른 작업을 계속 수행할 수 있어 앱의 성능을 향상시킵니다.
5. 언제 Future를 사용하나?
- 네트워크 요청: API 호출이나 데이터 다운로드와 같이 시간이 걸리는 작업을 수행할 때.
- 파일 I/O: 파일 읽기 및 쓰기 작업을 할 때.
- 데이터베이스: 데이터베이스에서 데이터를 가져오거나 저장할 때.
- 타이머: 일정 시간 동안 기다린 후에 작업을 수행할 때.
728x90