본문 바로가기
Flutter/개념

Dart 기본기 - Future, await, async

by 윤숩 2025. 2. 5.
728x90
728x90

 

Future

Dart의 Future는 비동기(Asynchronous) 프로그래밍을 처리하는 객체로, 시간이 걸리는 작업(예: 네트워크 요청, 파일 읽기 등)이 완료되었을 때 결과 값을 제공하는 방식입니다.

 


1. Future의 기본 개념

  • Future<T>는 미래에 결과를 반환할 것을 약속(Promise)하는 객체입니다.
  • 현재는 작업이 진행 중(Pending)이지만, 일정 시간이 지나면 완료(Completed)되거나 실패(Error)할 수 있습니다.
  • Future는 한 번만 완료(Resolved)되며, 이후 변경되지 않습니다.

2. Future의 상태

Future는 실행 과정에서 다음과 같은 상태를 가집니다:

  1. Uncompleted (미완료)
    • 작업이 시작되었지만 아직 결과가 없는 상태.
  2. Completed with a value (성공)
    • 작업이 정상적으로 완료되고 값을 반환한 상태.
  3. 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

댓글