프로그램을 만들다 보면 가끔 기능을 백그라운드에서 실행해야 하는 경우가 생긴다. 그럴 때 쓰는 것이 바로 "비동기 처리"이다.
우선 동기 처리 방식의 코드를 보자.
void main() {
print("It's first");
print("I'm second");
print("Last one");
}
위의 코드의 결과는 누가 보아도 알 수 있다.
It's first
I'm second
Last one
컴퓨터 입장에서는 아래와 같이 실행된다.
첫번째 print 명령이 끝나면 그 다음 줄로, 그리고 그 다음 줄로 차근차근 실행 되어진다.
동기 처리 방식은 이와 같이 직렬적인 구조이다.
그럼 비동기 처리는 어떨까?
void main() {
print("It's first");
Future.delayed(Duration(seconds: 0), () => print("I'm second"));
print("Last one");
}
Future.delayed는 Duration만큼의 지연 후 계산하는 생성자이다. 하지만 지연 시간을 0초로 해놓았으니 당연히 위와 같은 결과가 나와야할 것이다.
출처 - Flutter SDK: Future.delayed constructor
It's first
Last one
I'm second
하지만 결과는 그렇지 않다. 마지막에 나와야할 "Last One"이 "I'm second"보다 먼저 출력이 되었다. 그럼 찰나의 순간에 의해 "Last One"이 먼저 출력이 된 것일까? 이 궁금증은 쉽게 해결할 수 있다.
void main() {
print("It's first");
Future.delayed(Duration(seconds: 0), () => print("I'm second"));
print("Four");
print("I am Five");
print("It is Six");
print("Last one");
}
"I'm second" 과연 어디에서 나타날까?
It's first
Four
I am Five
It is Six
Last one
I'm second
정답은 "제일 아래에서 나타난다."이다. 이와 같이 비동기 처리는 동기 처리가 모두 끝난 뒤 이루어진다.
작은 프로그램에서야 처리 시간이 짧으니 동기 처리 방식을 사용해도 괜찮지만, 프로그램이 커지면 비동기 처리 방식은 선택이 아닌 필수이다.
참고 - Dart.dev: Asynchronous programming: futures, async, await