Flutter/์ผ๋ฐ˜

[Flutter] Future, async, await์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

Hac. Dog ๐ŸŒญ 2024. 4. 17. 21:49

๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ

๊ทธ๋™์•ˆ Flutter๋กœ ๊ฐœ๋ฐœ์„ ํ•ด์˜ค๋ฉด์„œ

Future๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด๋ณด์•˜๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์˜๊ตฌ์‹ฌ์„ ๊ฐ€์ง€๋ฉด์„œ ์ฝ”๋”ฉํ•˜์ง€ ์•Š์•˜๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ await๋ฅผ ์“ฐ๋ฉด ๊ธฐ๋‹ค๋ฆฌ๊ณ  Future๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋‹จ ์–˜๋Š” ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋‚˜์ค‘์— ๊ฐ’์„ ์ฃผ๋Š” ์–˜๊ตฌ๋‚˜ ๋ผ๊ณ  ๋ง‰์—ฐํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค.

์ด๋ฒˆ ๊ธฐํšŒ์— ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ฉด์„œ ๊ทธ์— ๋Œ€ํ•œ ๊ณต๋ถ€ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.


1. Dart์˜ ๋น„๋™๊ธฐ ๋™์ž‘ ์›๋ฆฌ

Dart๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์šด์˜๋˜๋Š” ์–ธ์–ด์ด๋‹ค.

Dart์—์„œ Future๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” Promise๊ฐ€ ์žˆ๋‹ค, ๋‘˜๋‹ค ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘์ด ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

for(int i=0; i<1000; i++){
	print(i);
 }
 .. next code

์œ„์™€๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด

next code๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๋ฉด, for๋ฌธ์ด 1000๋ฒˆ ๋™์ž‘ํ•˜๊ณ  ์ข…๋ฃŒ๊ฐ€ ๋œ ํ›„์—๋‚˜ ๋‹ค์Œ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ ์ด๋‹ค.

์ฆ‰ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋™์ž‘์„ ํ•œ๋‹ค๋ฉด, ํ”Œ๋Ÿฌํ„ฐ์—์„œ๋Š” UI๋„ ๋ Œ๋”๋งํ•ด์•ผํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ๊ฐ’๋„ ๋ฐ›์•„์•ผ ํ• ํ…๋ฐ

์œ„์ฒ˜๋Ÿผ๋งŒ ๋™์ž‘ ํ•œ๋‹ค๋ฉด ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๋„์ค‘์— ๋ฉˆ์ถฐ๋ฒ„๋ฆด ๊ฒƒ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํ”Œ๋Ÿฌํ„ฐ๋กœ ์ œ์ž‘๋œ ์•ฑ์„ ๋ณด๋ฉด ๊ทธ๋Ÿฌ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ์ผ๊นŒ?

 

์ผ๋‹จ Dart์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.


2. Event loop๋ž€?

๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ Flutter์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ˆœ๊ฐ„

isolate๋ผ๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰์ด ๋˜๊ณ  ์ด ์Šค๋ ˆ๋“œ๋Š” ์•ฑ ์ „์ฒด๋ฅผ ์ด๊ด„ํ•˜๋Š” ์œ ์ผํ•œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๊ฐ€ ๋œ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ์ด ๋˜๋Š” ์ˆœ๊ฐ„ ์ž๋™์ ์œผ๋กœ 3๊ฐ€์ง€ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ

1. FIFO๋ฐฉ์‹์œผ๋กœ 'MicroTask'์™€ 'Event'๋ฅผ ์ค€๋น„
2. main ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰
3. Event loop ์‹คํ–‰

Event loop๋Š” 'MicroTask'์™€ 'Event'๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด 'MicroTask'๋Š” ๋ฌด์—‡์ผ๊นŒ? ์ผ๋‹จ ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ด์ „์—

Future๋Š” ๋น„๋™๊ธฐ์  ์ž‘์—…์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ฆ‰, ๊ทธ๋ ‡๋‹ค๋ฉด ๋™๊ธฐ์  ์ž‘์—…์ด ์‹คํ–‰์ด ๋˜๊ณ  ๊ทธ ํ›„์— ๋น„๋™๊ธฐ์  ์ž‘์—…์ด ๋๋‚˜๋Š”๊ฒŒ ๋งž์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒฐ๊ตญ ๋™๊ธฐ์  ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋น„๋™๊ธฐ์  ์ž‘์—…์— ๋Œ€ํ•œ ๋Œ€๊ธฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋ณด๊ด€์„ ํ•˜๊ธฐ ์œ„ํ•ด

'Event'๋ผ๋Š” ํ์— Future๋ฅผ FIFO ๋ฐฉ์‹์œผ๋กœ ๋ณด๊ด€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ž ๊ทธ๋Ÿฌ๋ฉด, ์ด์ œ 'MicroTask'์— ๋Œ€ํ•ด์„œ ์„ค๋ช…์„ ํ•˜์ž๋ฉด

์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ์  ์ž‘์—…์ด์™ธ์— ๋™๊ธฐ์ ์ž‘์—…์— ๋Œ€ํ•œ ๊ฒƒ๋“ค์„ 'MicroTask'๋ผ๊ณ  ํ•œ๋‹ค.

์ฆ‰, Event loop๊ฐ€ ์‹คํ–‰๋ ๋•Œ ํ์— ๋“ฑ๋ก๋˜๊ธฐ ์ „์ธ Future๊ฐ’ ์ด์™ธ์— 'MicroTask' ๊ฐ’๋“ค์„ ์ผ๋‹จ ์ฒ˜๋ฆฌ ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ ํ›„ ๋”์ด์ƒ ๋‚ด๋ถ€์ ์œผ๋กœ ์ง„ํ–‰ํ•  'MicroTask'๊ฐ€ ์—†๋‹ค๋ฉด

Event loop๋Š” ์™ธ์ ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ข… ์ด๋ฒคํŠธ์ธ

1. Future
2. Stream
3. Gesture
4. Drawing
5. Reading files
6. Fetching data
7. Button touch
8. etc...

๋“ฑ๋“ฑ์˜ ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰ 'MicroTask'๊ฐ€ ๋๋‚œ ํ›„์— ์™ธ์ ์ธ ์ž‘์—…๋“ค์˜ Task๊ฐ€ Event Queue์— ๋“ฑ๋ก์ด ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.


3. ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Future ์•Œ์•„๋ณด๊ธฐ

์ด์ œ๋Š” ๋™์ž‘๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ์ดํ•ด๋ฅผ ํ•ด๋ณด๋„๋ก ํ•˜์ž.

๋ช‡๊ฐœ์˜ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด์„œ ๋ฐฉ๊ธˆ ์„ค๋ช…ํ•œ ์ด๋ก ์ด ์–ด๋–ป๊ฒŒ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณต์Šตํ•ด๋ณด์ž.

 

1-1

void main() {
  print('Before the Future');
  Future(() => print('Future is complete'));
  print('After the Future');
}

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋‚˜์˜ฌ์ง€ ์˜ˆ์ƒํ•ด๋ณด์ž.

 

๋‹ต์€

Before the Future
After the Future
Future is complete

์ด ๋  ๊ฒƒ์ด๋‹ค.

 

์œ„ ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๋Š” ์ด์œ ๋Š” ์œ„์—์„œ๋„ ์„ค๋ช…ํ–ˆ๋“ฏ์ด

๋™๊ธฐ์ ์ธ ๋ถ€๋ถ„์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  Future๊ฐ™์€ ๋น„๋™๊ธฐ์ ์ธ ๋ถ€๋ถ„์ด ๋“ค์–ด์˜ค๋ฉด ์ผ๋‹จ Event Queue์— ๋„ฃ๊ณ 

๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์œ„ ๊ฒฐ๊ณผ๊ฐ’์ด

'Before the Future' -> 'After the Future' -> 'Future is complete' ์ˆœ์ด ๋œ๋‹ค.


4. ์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด async, await ์•Œ์•„๋ณด๊ธฐ

Future๋ฅผ ์•Œ์•„๋ดค์œผ๋‹ˆ, ์ด์ œ๋Š” async์™€ await๋ฅผ ์•Œ์•„๋ณด์ž.

๋‘˜๋‹ค ์–ด๋””์— ์“ฐ๋Š” ๊ฒƒ ์ผ๊นŒ?

๋ฐ‘ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

Future<ProcessedData> createData() {
  return _loadFromDisk().then((id){
    return _fetchNetworkData(id);
  }).then((data){
    return ProcessedData(data);
  })
}

_loadFromDisk์—์„œ id๊ฐ’์„ ๋ฐ›๊ณ  ๊ทธํ›„ _fetchNetworkDate์—์„œ ๋‹ค์‹œ id๊ฐ’์„ ๋ฐ›๊ณ 

๊ทธ ํ›„ ๋‹ค์‹œ data์˜ ๊ฐ’์„ ๋ฐ›๊ณ  ProcessedDate์— data๊ฐ’์„ ๋„ฃ๋Š” ์ˆœ์„œ๋กœ ์ง„ํ–‰์ด ๋œ๋‹ค.

๋‹ค๋งŒ ์œ„ ์ฝ”๋“œ๋Š” ๊ฐ€๋…์„ฑ์ด ์ข‹์•„๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด async์™€ await๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด?

Future<ProcessedData> createDate() async {
  final id = await _loadFromDisk();
  final data = await _fetchNetworkData(id);
  return ProcessedData(data);
}

์œ„ ์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š”๋ฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์€ ํ›จ์”ฌ ์ข‹์•„์กŒ๋‹ค.

 

์ด์ œ๋Š” ์กฐ๊ธˆ ์‹ฌํ™”๋ฒ„์ „์œผ๋กœ then๊ณผ await๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ์˜ ํ๋ฆ„์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณด์ž.

void prepareDinner() {
  print('Dinner preparation started...');

  // ์žฌ๋ฃŒ๋ฅผ ์‡ผํ•‘ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  Future<String> shopping = shopForIngredients();

  // ์‡ผํ•‘์ด ์™„๋ฃŒ๋˜๋ฉด ์š”๋ฆฌ ์‹œ์ž‘
  shopping.then((ingredients) {
    print('Ingredients bought: $ingredients');
    return cookDinner(ingredients);  // ์š”๋ฆฌ ์‹œ์ž‘
  }).then((meal) {
    print('Dinner is ready: $meal');
  }).catchError((error) {
    print('Error: $error');
  });

  // ์‡ผํ•‘๊ณผ ์š”๋ฆฌ๊ฐ€ ์ง„ํ–‰ ์ค‘์ด์ง€๋งŒ, ์ด ์ฝ”๋“œ๋Š” ๋ฐ”๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  print('Dinner is being prepared...');
}

Future<String> shopForIngredients() async {
  await Future.delayed(Duration(seconds: 3));  // ์žฌ๋ฃŒ ์‡ผํ•‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  return 'Fresh tomatoes and basil';
}

Future<String> cookDinner(String ingredients) async {
  await Future.delayed(Duration(seconds: 5));  // ์š”๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  return 'Tomato basil pasta';
}

void main() {
  prepareDinner();
  print('Main function continues running while dinner is being prepared...');
}

์œ„ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

์šฐ๋ฆฌ๊ฐ€ ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณผ๋•Œ๋Š” ์ด์ œ๋ถ€ํ„ฐ ๋™๊ธฐ์ ์ธ ๋ถ€๋ถ„๊ณผ ๋น„๋™๊ธฐ์ ์ธ ๋ถ€๋ถ„์„ ๋‚˜๋ˆ„๋ฉด์„œ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ ์ด๋‹ค.

์ผ๋‹จ ์ฒ˜์Œ์œผ๋กœ๋Š”

'Dinner preparation started...' ์ด ์‹คํ–‰์ด ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ ํ›„ ๋‹ค์Œ ๋ผ์ธ์ธ 'Future<String> shopping = shopForIngredients()' ์‹คํ–‰๋˜๋Š”๋ฐ

shopForIngredients ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด Future<String>์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค.

Future<String> shopForIngredients() async {
  await Future.delayed(Duration(seconds: 3));  // ์žฌ๋ฃŒ ์‡ผํ•‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  return 'Fresh tomatoes and basil';
}

 

์—ฌ๊ธฐ์„œ๋Š” 3์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— String๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์•ž์„œ ๊ณต๋ถ€ํ–ˆ๋“ฏ์ด,

'Future shopping = shopForIngredients()' ์•ž์— await๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ผ๋‹จ Future<String>๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ shopping๊ฐ’์—๋Š” Future<String>๊ฐ’์ด ๋“ค์–ด ๊ฐˆ ๊ฒƒ์ด๋‹ค. (ํ™•์ธํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ด๋ก ์ƒ ๊ทธ๋Ÿด ๊ฒƒ์ด๋‹ค.)

 

์ด์ œ ๊ทธ ํ›„ then ํ•จ์ˆ˜๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๊ฒƒ๋„ ๋น„๋™๊ธฐ์ ์ธ ๋ถ€๋ถ„์ด๋ผ ์ผ๋‹จ event queue์— ๋„ฃ๊ณ  ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

shopping.then((ingredients) {
    print('Ingredients bought: $ingredients');
    return cookDinner(ingredients);  // ์š”๋ฆฌ ์‹œ์ž‘
  }).then((meal) {
    print('Dinner is ready: $meal');
  }).catchError((error) {
    print('Error: $error');
  });

 

์ด์ œ ๋‹ค์Œ์œผ๋กœ 'Dinner is being prepared...' ๊ฐ€ ์ถœ๋ ฅ์ด ๋˜๊ณ 

Main์— ์žˆ๋Š” 'Main function continues running while dinner is being prepared...' ๊ฐ€ ์ถœ๋ ฅ์ด ๋œ๋‹ค.

 

์ด์ œ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ๋ชปํ•œ ๋น„๋™๊ธฐ์ ์ธ ๋ถ€๋ถ„์œผ๋กœ ๋‹ค์‹œ ๋„˜์–ด๊ฐ€์„œ

shopping.then((ingredients) {
    print('Ingredients bought: $ingredients');
    return cookDinner(ingredients);  // ์š”๋ฆฌ ์‹œ์ž‘
  }).then((meal) {
    print('Dinner is ready: $meal');
  }).catchError((error) {
    print('Error: $error');
  });

ingredients์ด๋ผ๋Š” ๊ฐ’์€ 3์ดˆ๋ฅผ ๋Œ€๊ธฐ ํ›„ ๊ฐ’์ด ํŠ€์–ด๋‚˜์˜ค๊ฒŒ ๋˜๊ณ ,

'Ingredients bought: Fresh tomatoes and basil' ๊ฐ€ ์ถœ๋ ฅ

Future<String> shopForIngredients() async {
  await Future.delayed(Duration(seconds: 3));  // ์žฌ๋ฃŒ ์‡ผํ•‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  return 'Fresh tomatoes and basil';
}

Future<String> cookDinner(String ingredients) async {
  await Future.delayed(Duration(seconds: 5));  // ์š”๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  return 'Tomato basil pasta';
}

5์ดˆ ํ›„์— 'Dinner is ready: Tomato basil pasta' ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ์ข…๋ฃŒ ๋œ๋‹ค.

 

5. ์ถ”๊ฐ€ ์˜ˆ์ œ

Future<void> printOrderMessage() async {
  print('Awaiting user order...');
  var order = await fetchUserOrder();
  print('Your order is: $order');
}

Future<String> fetchUserOrder() {
  // Imagine that this function is more complex and slow.
  return Future.delayed(const Duration(seconds: 4), () => 'Large Latte');
}

void main() async {
  countSeconds(4);
  await printOrderMessage();
}

// You can ignore this function - it's here to visualize delay time in this example.
void countSeconds(int s) {
  for (var i = 1; i <= s; i++) {
    Future.delayed(Duration(seconds: i), () => print(i));
  }
}

์œ„ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๋‚ด๊ฐ€ ์ฒ˜์Œ ์˜ˆ์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Awaiting user order...
Your order is: Large Latte
1
2
3
4

ํ•˜์ง€๋งŒ ์‹ค์ œ ์ถœ๋ ฅ๊ฒฐ๊ณผ๊ฐ’์€

Awaiting user order...
1
2
3
4
Your order is: Large Latte

์œ„์™€ ๊ฐ™์•˜๋‹ค.

์™œ ๊ทธ๋Ÿฐ๊ฒƒ์ผ๊นŒ? ํ•œ๋ฒˆ ์ฝ”๋“œ์˜

var order = await fetchUserOrder();
print('Awaiting user order...');

์œ„ ๋‘์ค„์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด์•˜๋‹ค.

1
2
3
4
Awaiting user order...
Your order is: Large Latte

๊ทธ๋žฌ๋”๋‹ˆ ๊ฒฐ๊ณผ๊ฐ’์ด ์ด๋ ‡๊ฒŒ ๋‚˜์™”๋‹ค.

์ฆ‰, ๋‚ด๊ฐ€ ์ดํ•ดํ•œ๊ฒŒ ๋งž๋‹ค๋ฉด

await๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ž ์‹œ ๋ฉˆ์ถ”๊ณ  Event Queue์— ์žˆ๋Š” ๊ฐ’๋“ค์„ FIFO์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค์Œ

๋‘๋ฒˆ์งธ ์ˆœ์„œ์ธ

var order = await fetchUserOrder();
print('Awaiting user order...');
print('Your order is: $order');

๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.


๋งˆ๋ฌด๋ฆฌ ์ดํ‰

์—ญ์‹œ ํ”Œ๋Ÿฌํ„ฐ๋Š” ๋ฐฐ์šธ ์ˆ˜๋ก ์žฌ๋ฐŒ๋‹ค. ์˜์–ด ๊ณต๋ถ€๋ฅผ ์—ด์‹ฌํžˆ ํ•ด์„œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์›์–ด๋ฏผ ์ฒ˜๋Ÿผ ์ฝ์–ด๋ณด์ž!