[Dart] 비동기 프로그래밍 - Future
비동기 프로그래밍이란?
- 동기 프로그래밍과 반대되는 개념.
- 작업이 완료될 때까지 기다리지 않고, 미래의 특정 시점에 값을 반환함
- 결과값이 나올 때까지 수행할 수 있는 다른 작업을 찾아서 진행함
- 특정 코드를 실행할 때 다른 모든 작업이 멈추지 않음
=> 따라서 비동기 프로그래밍을 사용하면 코드의 효율을 높일 수 있다.
Future
비동기 프로그래밍에서 사용되는 클래스
작업이 성공적으로 완료되었을 때 결과를 반환하고 실행을 종료함
즉, 결과를 한 번만 반환할 수 있으므로 단일 비동기 작업에 사용한다.
사용 예시
Future<int> number = Future.value(1);
Future<String> name = Future.value('홍길동');
Future는 제너릭 클래스로, 다른 클래스를 감싸 주는 역할을 한다.
예시코드의 타입은 각각 int, String이다.
예시 코드
delayed()메서드
형식
Future.delayed(Duration(seconds: [지연 시간]));
Future.delayed(Duration(seconds: [지연 시간]), () {[지연 시간 후의 동작]});
예시 코드
2초 후에 delayed()메서드 안의 코드가 진행된다.
printOrder를 두 번 실행해 보면 작동 방식을 더욱 명확히 알 수 있다.
1.
printOrder('Latte')을 진행하여 delay가 없는
print started
print completed
를 먼저 출력한다.
2.
delayed 메서드를 기다리는 사이 할 수 있는 다른 작업을 찾는다 => printOrder('Ice Cream')
마찬가지로 delay가 없는
print started
print completed
를 출력한다.
3.
마지막으로 2초 후 각각의 delayed메서드 안의 코드를 실행한다.
your order is "Latte"
your order is "Ice Cream"
async와 await
async와 await는 짝으로 함께 사용되며, 비동기 코드를 동기 코드와 매우 유사해 보이게 한다.
예시와 함께 알아보는 것이 더욱 이해하기 쉽다.
https://dart-ko.dev/codelabs/async-await
비동기 프로그래밍: futures, async, await
DartPad로 비동기 코드를 작성법을 배우고 연습해봅시다!
dart-ko.dev
사용형식은 공식 문서를 참고.
예시코드
맨 처음 원본 코드처럼 코드가 순서대로 출력된 것을 확인할 수 있다.
예시코드2
printOrder을 두 번 실행하면 어떤 차이가 생겼는지 더욱 명확히 보인다.
1.
printOrder('Latte')를 실행한다.
print started
를 출력한다
await가 있으므로 delayed메서드 안의 코드를 실행하기 위해 2초 기다린다.
2.
그 동안 실행할 수 있는다른 작업을 찾는다 =>printOrder('Ice Cream')
print started
를 출력한다.
await가 있으므로 delayed메서드 안의 코드를 실행하기 위해 2초 기다린다.
3.
2번의 delayed를 기다리는 동안 1번의 delayed가 완료된다.
your order is "Latte"
print completed
를 출력한다.
4.
2번의 delayed가 완료된다.
your order is "Ice Cream"
print completed
를 출력한다.
예시코드3
main 함수 안에 await를 넣고 main의 실행 코드 앞에 async를 넣어 주었다.
main 내부의 printOrder실행 시 delay가 있는 작업을 기다려 준다는 뜻이므로,
printOrder('Latte') 메서드가 완료된 후에야 printOrder('Ice Cream') 메서드가 실행된다는 것을 볼 수 있다.