728x90

다트 언어에서 비동기 처리를 지원합니다. 비동기 처리는 어떤 호출이 끝나기를 마냥 기다리는 것이 아닌 일단 호출 후 다른 작업 후 추후에 처리를 해주게 됩니다. 이 비동기 처리는 파일 IO, 데이터베이스 처리, 네트워크와 같이 언제 끝날 지 모르는 작업에 유용하게 사용됩니다. 

동기/비동기에 대한 윈도우 시스템이 궁금하시다면 이 링크를 클릭해주세요.

 

다트에서 비동기 처리를 위해 사용되는 예약어는 async, await, Future을 통해 진행됩니다. 설명에 앞서 간단한 예제를 보여드리겠습니다.

void main() {
  print('Hello World!');
  PrintValue(); 
  print('Main End');
}

Future PrintValue() async {
  print('PrintValue Start');
  var value = await Getvalue();
  print(value);
  print('PrintValue End');
}

int Getvalue() {
  return 1;
}

비동기 처리에 대한 개념 없이 봤을 때 예상되는 호출 결과는

Hello World!

PrintValue Start

1

PrintValue End

Main End

가 될 것입니다. 하지만 실제 실행 결과를 보시면 아래와 같습니다.

PrintValue 함수에서 await가 붙은 함수 다음 동작을 기다리지 않고 Main End부터 실행합니다. 그 이후 Getvalue의 결과를 출력하고 마지막으로 PrintValue End를 출력합니다. 

이 결과는 future async await로 인해 비동기로 처리가 되는데 PrintValue 함수 뒤에 붙은 async로 PrintValue 함수를 비동기 함수로 만들겠으며 await가 붙은 GetValue 함수를 비동기 처리를 하겠다는 의미입니다. 그렇기 때문에 PrintValue 함수 안의 GetValue 다음 행동은 GetValue가 마무리 될 때 까지 기다렸다 실행히 되고 PrintValue 이후는 그대로 진행이 되는 것입니다.

 

위 구성에서 await를 사용하기 위해서 Future는 생략해도 가능하지만 async를 생략하면 에러가 발생합니다.

await의 반환 값을 사용하는 방법에는 위와 같이 사용하는 방법과 then을 사용하는 방법이 있습니다. 그러기 위해선 호출하는 함수의 반환 타입이 Future 클래스에 타입을 명시해줘야 합니다.

void main() {
  print('Hello World!');
  PrintValue(); 
  print('Main End');
}

Future PrintValue() async {
  print('PrintValue Start');
  await Getvalue().then((value) => {
    print(value)
  });
  
  print('PrintValue End');
}

Future<int> Getvalue() async {
  return 1;
}

728x90

'Programming > Flutter' 카테고리의 다른 글

[Flutter] Dart 문법  (0) 2022.11.23
[Flutter] 레이아웃과 위젯  (0) 2022.11.20
[Flutter] 프로젝트 내 폰으로 실행  (0) 2022.11.20
[Flutter] 기본 프로젝트 설명  (0) 2022.11.18
[Flutter] 개발 환경 세팅  (0) 2022.11.17

+ Recent posts