Flutter

Flutter Future, async, await

딧츠이즈 2021. 4. 16. 08:43

Future, async, await

동기, 비동기

  • 동기
    • 순서대로 해야 할 일 한 가지만 하는 것을 Synchronous(동기)
    • 장점으로는 간단하지만 결과가 나올 때까지 아무것도 못한다.
  • 비동기
    • 동시에 다른 일을 하는 것을 Asynchronous(비동기)
    • 복잡하지만 결과가 나오기 전까지 다른 작업을 할 수 있다.

Example

가게에서 알바가 서빙과 주문을 받는 역할을 해야 하는 경우

동기일 경우 알바는 서빙을 끝낸 후 주문을 받는다.

비동기일 경우 알바는 서빙을 하면서 주문을 받는다.

Future

비동기 작업을 할 때 사용된다.

일정 소요시간 후에 실제 데이터나 에러를 반환한다.

Example

import 'dart:io';

// 다음과 같이 사용할 수 있다.
// Future<반환할 타입> 함수명 () {}

// 일정시간(duration)이 끝난 후 동작(함수)을 실행
// Future.delayed(duration, () {})

// 은행 데이터베이스에 접속해서 사용자의 통장 잔액을 가져온다는 예제

void main() {
    showData();
}

void showData() {
    startTask();
    // accessData에서 String값을 리턴해주기 때문에 사용 가능
    String account = accessData();
    fetchData(account);
}

void startTask() {
    String info1 = '요청수행 시작!';
    print(info1);
}

void accessData() {
    // 시간 간격
    Duration time = Duration(seconds: 3);

    // 일정 시간 후 동작을 실행함
    // accessData함수가 실행되기 전에 fetchData함수가 실행됨
    // Future.delayed가 끝날 때까지 기다리라는 의미
    Future.delayed(time, () {
        String info2 = '데이터 처리 완료';
        print(info2);
    });

}

void fetchData() {
    String info3 = '잔액은 8,500만원입니다.';
    print(info3);
}

async, await

Future와 똑같이 비동기 작업을 할 때 사용된다.

  • async 클래스는 await 메소드를 가지고 있다.
    • await로 선언된 메소드는 응답이 처리될 때까지 대기한다.

Example

// 은행 데이터베이스에 접속해서 사용자의 통장 잔액을 가져온다는 예제
import 'dart:io';

void main() {
  showData();
}

// 값이 할당될 때까지 기다려야 함으로
void showData() async {
  startTask();
  // accessData에서 String값을 리턴해주기 때문에 사용 가능
  // accessData가 끝날 때까지 기다리라는 의미
  String account = await accessData();
  fetchData(account);
}

void startTask() {
  String info1 = '요청수행 시작!';
  print(info1);
}

Future<String> accessData() async {
  // async는 항상 중괄호 앞에 붙고 await을 사용 가능하게 함
  String account = '';

  // 시간 간격
  Duration time = Duration(seconds: 3);

    // 일정 시간 후 동작을 실행함
    // accessData함수가 실행되기 전에 fetchData함수가 실행됨
    // Future.delayed가 끝날 때까지 기다리라는 의미
    await Future.delayed(time, () {
      account = '8500만원';
      print(account);
    });

  return account;
}

// accessData에 실행이 지연된다는 전제 하에 async방식으로 변경
void fetchData(String account) {
  String info3 = '잔액은 ${account}입니다.';
  print(info3);
}

깃허브 : https://github.com/dits1019/Flutter-Memo

참고 : https://www.youtube.com/watch?v=oFXV4qSXNVs

https://velog.io/@jintak0401/FlutterDart-%EC%97%90%EC%84%9C%EC%9D%98-Future-asyncawait