메뉴 닫기

Dart의 Future 개념과 async/await 이해

Flutter로 개발하다보면 Futures 라는 Generic 클래스와 async/await이라는 키워드를 접하게 됩니다. 이는 비동기 프로그래밍을 위한 것으로 상세 설명 및 예제 코드를 보여드리도록 하겠습니다.

Asynchronous programming

비동기 프로그래밍(Asynchronous programming)은 메인 스레드를 차단하지 않는 코드를 작성하는 방법이므로 어플리케이션이 응답성을 유지할 수 있습니다. 비동기 코드는 백그라운드에서 실행되며, 작업이 완료되면 결과가 메인 스레드로 반환됩니다. Flutter로 앱을 개발할 때 Future 클래스와 async/await 키워드를 사용하는 것은 응답성을 유지하고 기본 스레드를 차단하지 않는, 비동기 코드를 작성하는 효과적인 방법입니다.

Async/Await

Dart는 ‘async’ 및 ‘await’ 키워드를 사용하여 쉽게 비동기 코드를 작성할 수 있습니다. 이 두 개의 키워드는 함께 동작하여 읽고 유지하기 쉬운 비동기 코드를 작성할 수 있도록 합니다. 읽기 및 유지 관리가 어려울 수 있는 콜백을 사용하는 대신 ‘async’ 및 ‘await’를 사용하면 동기 코드처럼 읽지만 백그라운드에서 비동기적으로 실행되는 코드를 작성할 수 있습니다.

1. Async 개요

‘async’ 키워드는 함수를 비동기로 표시하는 데 사용되며, 실행하는 동안 메인 스레드를 차단하지 않음을 나타냅니다. 이는 함수가 백그라운드에서 실행되는 동안 애플리케이션의 다른 부분이 계속 실행될 수 있음을 의미합니다. 함수가 비동기로 표시되면 비동기 작업의 결과를 나타내는 Future 개체를 반환합니다.

2. Await 개요

‘await’ 키워드는 코드의 나머지 부분을 계속하기 전에 Future가 완료될 때까지 기다리는 데 사용됩니다. 마치 thread의 join처럼 동작하는 것이죠. await 키워드는 async 함수 내에서만 사용할 수 있습니다. Future와 함께 ‘await’를 사용하면 코드는 Future가 완료될 때까지 해당 지점에서 일시 중지한 다음 나머지 코드 실행을 다시 시작합니다.

3. 키워드 사용 방법 예제

서버에서 데이터를 가져오는 경우를 예로 들어보겠습니다.

Future<String> fetchData() async {
  final response = await http.get('https://example.com/data');
  final data = response.body;

  return data;
}

fetchData() 함수는 async 키워드를 사용하여 비동기로 표시되었습니다. 함수 내에서는 HTTP 요청이 완료되고 응답을 반환할 때까지 기다리기 위해 await 키워드를 사용하였습니다. 응답을 사용할 수 있게 되면 함수는 응답에서 데이터를 추출하여 문자열로 반환합니다. async 및 await를 사용하면 위와 같이 기본 스레드를 차단하지 않으면서도 가독성이 좋으며 효율적인 코드를 작성할 수 있습니다.

Future

1. Future 개요

Flutter에서 ‘Future’는 아직은 사용할 수 없지만 나중에 사용할 수 있는 값을 나타내는 객체를 의미합니다. Future는 미래의 어느 시점에 결과를 반환할 비동기 작업을 나타내는 방법입니다.

Flutter의 Future는 제네릭으로 구현되어 다양한 유형을 나타낼 수 있습니다. 제네릭을 사용하면 다양한 유형과 함께 작동하는 클래스와 메서드를 정의하여 유연성과 재사용성을 제공할 수 있는데요, Future의 경우 아직 사용할 수 없지만 미래에 사용할 수 있는 모든 유형의 값을 나타낼 수 있습니다. 예를 들어 Future<int>는 정수 값을 반환하는 네트워크 요청의 결과일 수도 있고, Future<String>은 문자열 값을 반환하는 데이터베이스 쿼리의 결과일 수도 있습니다.

2. Future – then 메서드

Future 클래스는 ‘then’ 메서드가 있습니다. 이 메서드를 통해 Future가 사용 가능해졌을 때 해당 결과를 처리할 수 있습니다. ‘then’ 메서드는 콜백 함수를 인수로 사용하며 성공적으로 완료되면 Future의 결과로 호출됩니다. 콜백 함수는 결과를 인수로 사용하고 아무 것도 반환하지 않습니다.

3. Future 사용 방법 예제

위의 예제에 Future와 함께 ‘then’ 메서드를 사용하는 코드를 추가하였습니다.

Future<String> fetchData() async {
  final response = await http.get('https://example.com/data');
  final data = response.body;

  return data;
}

void main() {
  fetchData().then((data) {
    print(data);
  });
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다