Flutter의 Future를 알고보자(1)

오늘도 알고보자·2022년 2월 13일
0

비동기화 프로그램

내 1차멘붕이 함수형 프로그래밍이라면 2차멘붕은 Future였다.
async를 어디에 붙여할지? then과의 차이점이 무엇인지? Future 에 제네릭은 왜 써야하는지...
요런 기저에 깔려있는 내용을 짚어보면서 차근차근 해보도록하자.

Future를 좀 알고 나면 추후에 나올 Provider나 Stream을 공부할때 상당히 도움이되는 뿌리이다. 코딩에 대한 내용이지만 시나리오를 상정하여 기억해보자.(아직도 문과갬성)

  • 동기 (synchronous)
    요청을 보내고 응답이 오면 그 다음 동작을 처리하는 방식

  • 비동기
    요청을 보낸 후 응답이 없어도 다음 동작을 실행하는 방식

왜써야할까?

이걸 알려면 Dart 언어가 어떻게 작동하는지 알아야한다.

  1. 다트언어는 프로그램하나당 스레드를 하나를 쓴다.
  2. 파이프 안에 작업이 하나들어간다 →다른한쪽으로 나온다.
  3. 이 작업이 들어가서 나올때 작업에 소요되는 시간이 있다.
  4. 그런데 작업 마다 시간이 다르다, 빨리끝나는 작업, 오래걸리는 작업
  • 문제는 오래걸리는 작업이다.
  • 이 오래걸리는 작업 때문에 파이프가 막혀서 다른 작업들 빨리끝나는 작업들도 기다리게 되는 현상이 생긴다.
  • 그런것을 방지하기 위해서 Async Programing이 필요한거다.

Future API의 3가지 상태

  • 완료되지않은 Futrure object 상태
  • 완료된 Futrure object의 데이터 상태
  • 완료된 Futrure object의 에러 상태

Async Programing 사용하는 2가지 방법

  • Future API
  • Async Await Keyword
  • Future API

시나리오 1

  1. HTTP 라이브러리를 사용하여 이미지를 다운받는데 작업이 오래걸리는A라는 이미지를 받는다고 가정해보자
  2. HTTP 라이브러리에 이미지를 다운받게해달라고 요청을 하면 Future Object를 준다.
  3. 하지만 이것은 열리지않는 상태이다, 이것을 Future Object 라고 인식하면 다른한쪽에 두게된다.
  4. 다른 작업을 계속 받게되고 처리를한다, 처리도중에 Future Object 작업이끝났다고(이미지 다운이 끝났다고) 신호가 온다
  5. 그럼 Future Object 가 열리면서 이미지 데이터가 나오게된다→데이터를 가지고 처리를 하게된다.

시나리오2

  1. 그럼 Future Object 가 열리면서 에러가 나오게된다→에러를 가지고 처리를 하게된다.
  • Async Await Keyword
  1. Future object를 받아서 한쪽에서 작업을 하지만
  2. 내가 선택권을 가질수 없을까? Future object를 구석에 두고 기다리지 말고 끝날때까지 기다리면안될까?
  3. 즉 다른작업들이 있지만 기다려 내가 Future object 작업이 끝날때까지 기다렸다가 데이터나 에러를 처리를 하고 다른작업을 받을게~
  4. 이런 기능도 필요하여 Async Await Keyword 가 나온것이다.

중요한 점

  • 다트는 단일 스레드에서 실행된다.
  • 스레드를 차단하는 코드는 프로그램을 정지시킬 수 있다.
  • Future는 Async 코드의 결과를 나타낸다. 처리 또는 입출력은 나중에 완료된다.
  • future가 완료 될때까지 실행을 일시 중단하려면 Async함수에서 Await를 사용하면된다.
  • Async함수에서 Try catch를 사용해서 에러를 잡느다.
Future<String> gatherNewsReports() =>
Future.delayed(oneSecond, () => news);

Future 라이브러리를 사용해서 delayed를 하는것이다.

1초동안 기다렸다가 news를 리턴하라 이다.

void printDailyNewsDigest() async {
var newsDigest = await gatherNewsReports();
print(newsDigest);
}

gatherNewsReports 이것을 받을때까지 await 기다려라 그리고나서 print(newsDigest)

하자.

0개의 댓글