[Flutter] 동기와 비동기

zunu·2021년 3월 26일
1
post-thumbnail

Synchronous / Asynchronous

프로그램을 만들다 보면 가끔 기능을 백그라운드에서 실행해야 하는 경우가 생긴다. 그럴 때 쓰는 것이 바로 "비동기 처리"이다.

동기 처리

우선 동기 처리 방식의 코드를 보자.

void main() {
  print("It's first");
  print("I'm second");
  print("Last one");
}

위의 코드의 결과는 누가 보아도 알 수 있다.

It's first
I'm second
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

profile
개발새발

0개의 댓글