DAMPER's 낙서장

1-2. Dart 비동기 처리 본문

Flutter

1-2. Dart 비동기 처리

DAMPER 2022. 2. 11. 21:52
728x90

다음 내용은 'doit! 플러터 앱 프로그래밍' 책 내용을 정리한 내용입니다.

 

 

동기 VS 비동기

 

비동기 프로세스 작동방식

다트는 asyncawait 키워드를 이용해 비동기 처리를 구현한다.

1. 함수를 선언할 때, 함수 이름 뒤 본문이 시작하는 중괄호 { 앞에 async 키워드를 붙여 비동기로 만든다.

2. 비동기 함수 안에서 언제 끝날지 모르는 작업 앞에 await 키워드를 붙인다.

3. 2번 작업을 마친 결과를 받기 위해 비동기 함수 이름 앞에 Future (값이 여러 개면 Stream) 클래스를 지정한다.

 

void main() {
  checkVersion();
  print('end process');
}

Future checkVersion() async {
  var version = await lookUpVersion();
  print(version);
}

int lookUpVersion() {
  return 12;
}
결과
end process
12

checkVersion() 함수를 보면 이름 앞뒤로 Future 와 async 가 붙어있다.

이렇게 하면 checkVersion() 함수를 비동기로 만들겠다는 의미가 된다.

-> checkVersion() 함수 안에 await 가 붙은 함수를 따로(비동기로) 처리한 다음 그 결과는 Future 클래스에 저장해 둘 테니 먼저 checkVersion() 함수를 호출한 main() 함수의 나머지 코드를 실행하라는 의미이다.

main() 함수를 모두 실행한 후 Future 클래스에 저장해 둔 결과를 이용해서 checkVersion() 함수의 나머지 코드를 실행한다.

 

await 키워드는 처리를 완료하고 결과를 반환할 때까지 이후 코드의 처리를 멈춘다.

lookUpVersion()함수를 호출해 version 변수에 12가 저장된 다음에야 비로소 print(version) 을 실행한다.

 

비동기 함수에서 어떤 결과값이 필요하다면 해당 코드를 await로 지정한다.

-> 네트워크 지연 등으로 제대로 된 값을 반환받지 못한 채 이후 과정이 실행되는 것을 방지할 수 있다.

 

 

비동기 함수가 반환하는 값 활용하기

비동기 함수가 반환하는 값을 처리하려면 then() 함수를 이용한다.

void main() async {
  await getVersionName().then((value) => {print(value)});
  print('end process');
}

Future<String> getVersionName() async {
  var versionName = await lookUpVersionName();
  return versionName;
}

String lookUpVersionName() {
  return 'Android Q';
}
결과
Anroid Q
end process

Future<String> 형 반환값을 정해놓은 getVersionName()이라는 함수가 있다.

이 함수는 async 키워드가 붙었으므로 비동기 함수이다.

비동기 함수가 데이터를 성공적으로 반환하면 호출하는 쪽에서 then() 함수를 이용해 처리할 수 있다.

then(), error() 등 함수를 사용할 수 있다.

error() 함수는 실행과정에서 오류가 발생했을 때 호출되어 예외처리가 가능하다.

 

 

다트와 쓰레드

다트는 하나의 쓰레드로 동작하는 프로그래밍 언어이다.

그래서 await 키워드를 잘 사용해야한다.

 

void main() {
  printOne();
  printTwo();
  printThree();
}

void printOne() {
  print('1');
}

void printThree() {
  print('3');
}

void printTwo() async {
  Future.delayed(Duration(seconds: 1),() {
    print('Future!');
  });
  print('2');
}
결과
1
2
3
Future!

Future.delayed() 함수는 Duration 기간 동안 기다린 후에 진행하라는 의미이다.

예제 코드에서는 1초 뒤에 진행하라는 의미이다.

1을 출력 한 후에 printTwo() 함수에 들어가면 Future를 1초 지연했으므로 async로 정의한 비동기 함수의 특징에 따라 2가 먼저 출력된다.

그리고 3을 출력하고 'Future!'가 출력된다.

 

printTwo()를 다음과 같이 수정해보자.

void printTwo() async {
  await Future.delayed(Duration(seconds: 1),() {
    print('Future!');
  });
  print('2');
}

Future.delayed() 함수 앞에 await 키워드를 붙였으므로 이후의 코드 실행이 멈춘다.

printTwo() 함수를 벗어나 main() 함수의 나머지 코드를 모두 실행하고, 그 다음에 await 가 붙은 코드부터 차례대로 실행한다.

결과
1
3
Future!
2

 

await 키워드를 사용하면

1. await가 '속한 함수'를 호출한 명령어의 프로세스가 끝날 때까지 기다린다.

2. await 이후의 명령어들을 실행한다.

 

 

728x90

'Flutter' 카테고리의 다른 글

2-2. Flutter 프로젝트 기본 구조 2  (0) 2022.02.14
2-1. Flutter 프로젝트 기본 구조  (0) 2022.02.12
1.4 Dart 스트림 통신하기  (0) 2022.02.12
1.3 Dart으로 JSON 데이터 주고받기  (0) 2022.02.11
1-1. Dart  (0) 2022.02.11