2025-09-30

Future

  • ν•˜λ‚˜μ˜ μž‘μ—…μ— λŒ€ν•΄ κ°’μ΄λ‚˜ μ΄λ²€νŠΈκ°€ ν•œ 번 λ°œμƒν•˜λŠ” 단일 비동기 μž‘μ—…μ— μ‚¬μš©.
  • μž‘μ—…λ‹Ή 결과값을 ν•œ 번만 받을 수 μžˆλ‹€.

Future의 λ°˜ν™˜

Future<String> introduce(String name) async {
	print('$name의 μžκΈ°μ†Œκ°œ μ‹œμž‘ !');
  
  await Future.delayed(Duration(seconds: 2), () {
    print('μ•ˆλ…• ? λ‚˜λŠ” $name ~');
  });
	
	print('$name의 μžκΈ°μ†Œκ°œ 끝 !');
  
  return '이름은 $name ~';
}

void main() async {
  var riverfuture = await introduce('κ°•λ―Έλž˜');
  var riverpresent = await introduce('κ°•ν˜„μž¬');
  print('λ‚˜μ˜ $riverfuture λ„ˆμ˜ $riverpresent');
}
  • ν•˜λ‚˜μ˜ μž‘μ—…μ— 결과값이 μ—¬λŸ¬ 번 λ‚˜μ˜€λŠ” κ²½μš°λŠ” μ–΄λ–»κ²Œ ν• κΉŒ?
  • Stream을 μ‚¬μš©ν•˜μ—¬ 결과값을 λ°›λŠ”λ‹€.


Stream

  • ν•˜λ‚˜μ˜ μž‘μ—…μ— λŒ€ν•΄ κ°’μ΄λ‚˜ μ΄λ²€νŠΈκ°€ μ—¬λŸ¬ 번 λ°œμƒν•˜λŠ” κ²½μš°μ— μ‚¬μš©
  • 비동기 μ—°μ‚°μ˜ 결과값이 μ—¬λŸ¬ 번 λ°˜ν™˜λ˜λŠ” 경우 κ·Έ 값을 순차적으둜 λ°›κΈ° μœ„ν•΄ μ‚¬μš©
  • 결과값을 ν•œ 번 λ°˜ν™˜ν•˜κ³  λ‚˜λ©΄ 싀행이 μ’…λ£Œλ˜λŠ” Future 와 λ‹€λ₯΄κ²Œ 직접 싀행을 μ’…λ£Œν•΄ μ£Όμ–΄μ•Ό 싀행이 μ’…λ£Œλ˜κ³ , 싀행을 μ’…λ£Œν•΄ μ£Όμ§€ μ•ŠμœΌλ©΄ 계속 μ‹€ν–‰λœλ‹€.
  • κ²°κ³Όκ°’μ˜ νƒ€μž…μ€ Stream
Steam<int> number = Steam.value(1);
Steam<String> name = Steam.value('κ°•λ―Έλž˜');
Steam<bool> isOddNumber = Steam.value(1.isOdd);
  • Steam<bool> 은 bool μ΄λž‘ 같은데 단지 Steam 이 감싸고 μžˆμ„ 뿐이라고 μƒκ°ν•˜λ©΄ λœλ‹€.
  • μ•„λž˜μ˜ 예제λ₯Ό 톡해 μžμ„Ένžˆ μ•Œμ•„λ³΄μž.


Stream<String> emitNames() async* {
  yield 'κ°•λ―Έλž˜';
  yield 'κ°•ν˜„μž¬';
  yield 'κ°•κ³Όκ±°';
}
  • yieldλŠ” 값을 λ°©μΆœν•˜λ„λ‘ ν•˜λŠ” ν‚€μ›Œλ“œ
  • Future λ₯Ό λ°˜ν™˜ νƒ€μž…μœΌλ‘œ κ°–λŠ” ν•¨μˆ˜λŠ” async λ₯Ό μ‚¬μš©ν–ˆλŠ”λ°, Stream 을 λ°˜ν™˜ νƒ€μž…μœΌλ‘œ κ°–λŠ” ν•¨μˆ˜λŠ” async* 을 μ‚¬μš©ν•œλ‹€.


Stream<String> emitNames() async* {
  yield 'κ°•λ―Έλž˜';
  yield 'κ°•ν˜„μž¬';
  yield 'κ°•κ³Όκ±°';
}

void main() {
  int number = 1;
  
  emitNames().listen((name) {
    print('$numberλ²ˆμ§ΈλŠ” $name ~');
    number += 1;
  });
}
  • listen()은 μ§€μ†μ μœΌλ‘œ 값을 받을 수 μžˆλ‹€.
  • μ—¬κΈ°μ„œλŠ” yield λ₯Ό 톡해 λ°©μΆœλ˜λŠ” 값을 λ°›κΈ° μœ„ν•΄ μ‚¬μš©



νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: