Search
Duplicate
moon
sun

비동기 프로그래밍

비동기 프로그래밍

Future
async, await
Stream

Future

💡
종료되지 않은 비동기 요청의 결과를 가리키는 클래스
✅ 요청 후, 결과를 나중에 받기 위해 사용
“배달”
배달 앱 으로, 주문을 하고 아직 배달이 안 왔지만, 나중에 배달이 올 것을 약속한 상태
Future<반환타입> 메소드명() async { return 반환값; }
Dart
복사
// 5초 지연 Future<void> fetchOrder1() async { // Future.delayed( 지연, 콜백함수 ) Future.delayed(const Duration(seconds: 5), () { print('5초후 출력...'); }); } // 3초 지연 Future<void> fetchOrder2() async { // Future.delayed( 지연, 콜백함수 ) Future.delayed(const Duration(seconds: 3), () { print('3초후 출력...'); }); } void main(List<String> args) { fetchOrder1(); fetchOrder2(); print('요청 중...'); }
Dart
복사
Future<String> fetchData() { return Future.delayed(Duration(seconds: 2), () { return '결과 데이터'; }); } void fetchDataAwait() async { String result = await fetchData(); print(result); } void main(List<String> args) { // then(data) // : Future 가 완료된 후, 반환값 data 를 가져와서, // 특정 작업을 수행하는 메소드 fetchData().then((data) { print(data); print('추가 작업...'); }); fetchDataAwait(); print('요청 중...'); }
Dart
복사

async, await

aysnc

💡
함수가 비동기로 실행되도록 지정하는 키워드
✅ async 함수는 비동기로 실행되는 Future 객체를 반환합니다.
Future<void> exampleAsyncFunction() async { // 비동기 작업 수행 }
Dart
복사

await

💡
async 함수 내에서 Future 완료 시, 함수 실행을 기다려서 결과값을 반환해주는 키워드
Future<void> exampleAsyncFunction() async { // 비동기 작업 수행 var result = await someAsyncOperation(); print(result); }
Dart
복사

Stream

💡
비동기 작업 결과를 순차적으로 처리하는 클래스
Stream<int> countStream(int to) async* { for(int i = 1 ; i <= to ; i++ ){ await Future.delayed(Duration(seconds: 1), () { print('요청 : $i'); }); yield i; } } Future<int> sumStream(Stream<int> stream) async { var sum = 0; print('합계'); await for(final value in stream ) { sum += value; print('전달된 값 : $value - sum : $sum'); } return sum; } Future<void> main(List<String> args) async { var stream = countStream(10); var sum = await sumStream(stream); print('요청중...'); print(sum); print(stream); }
Dart
복사

코드 실행 흐름

1.
main 함수에서 countStream(10)을 호출하여 Stream 객체를 생성합니다.
2.
sumStream 함수에 Stream을 전달하여 합계를 계산합니다.
3.
countStream 함수에서 1초 간격으로 숫자를 생성하면서 Stream으로 전달합니다.
4.
sumStream 함수에서 Stream의 각 숫자를 받아서 합계를 계산하고 출력합니다.
5.
모든 숫자가 처리되면 최종 합계를 반환하고 출력합니다.
6.
stream 객체의 문자열 표현을 출력합니다.
1. countStream 함수:
1부터 입력받은 숫자까지 1초 간격으로 숫자를 생성하는 Stream을 생성합니다.
async* 키워드를 사용하여 비동기 생성기 함수로 정의합니다.
for 반복문에서 1부터 to까지 숫자를 반복합니다.
Future.delayed를 사용하여 1초 지연을 시뮬레이션합니다.
yield 키워드를 사용하여 각 숫자를 Stream으로 전달합니다.
2. sumStream 함수:
Stream을 전달받아서 합계를 계산하는 함수입니다.
async 키워드를 사용하여 비동기 함수로 정의합니다.
sum 변수를 0으로 초기화합니다.
await for 키워드를 사용하여 Stream의 각 값을 순회합니다.
각 값을 sum에 더하고, 현재 값과 합계 값을 출력합니다.
최종 합계를 반환합니다.
3. main 함수:
countStream 함수를 호출하여 1부터 10까지의 숫자를 생성하는 Stream을 생성합니다.
sumStream 함수를 호출하여 Stream의 합계를 계산합니다.
"요청중..." 메시지를 출력합니다.
계산된 합계를 출력합니다.
stream을 출력합니다. (stream 객체의 문자열 표현을 출력합니다.)

출력 결과

합계 요청 : 1 전달된 값 : 1 - sum : 1 요청 : 2 전달된 값 : 2 - sum : 3 ... 요청 : 10 전달된 값 : 10 - sum : 55 요청중... 55
Dart
복사