TIL 2025.03.17 - Dart 비동기 프로그래밍

임대한·2025년 3월 17일

오늘은 내일배움캠프의 Dart 프로그래밍 1주차 강의 중 19강: 비동기 프로그래밍과 Dart를 복습했습니다. 비동기 프로그래밍의 개념과 Dart에서 이를 구현하는 방법에 대해 중점적으로 학습했습니다.

학습 내용

1. 동기 프로그래밍과 비동기 프로그래밍의 차이

동기 프로그래밍 (Synchronous Programming)

  • 작업이 완료될 때까지 기다렸다가 결과가 나오면 값을 반환합니다.
  • 결과값이 나올 때까지 다른 모든 연산이 멈추기 때문에 다른 작업을 할 수 없습니다.
  • 간단한 작업에는 문제가 없지만, 파일 읽기, 데이터베이스 접근, 네트워크 통신과 같이 시간이 오래 걸리는 작업에서는 비효율적입니다.

비동기 프로그래밍 (Asynchronous Programming)

  • 작업이 완료될 때까지 기다리지 않고, 미래의 특정 시점에 값을 반환합니다.
  • 결과값이 나올 때까지 다른 작업을 계속 수행할 수 있어 효율적입니다.
  • Dart에서는 dart:async 라이브러리의 FutureStream 클래스를 통해 비동기 프로그래밍을 지원합니다.

2. Future 클래스

  • 비동기 프로그래밍에서 사용되는 대표적인 클래스로, 단일 비동기 작업에 사용됩니다.
  • 작업이 성공적으로 완료되었을 때 해당 결과값을 반환하고 실행을 종료합니다.
  • 제네릭 클래스로, Future<int>, Future<String> 등 다양한 타입의 결과를 처리할 수 있습니다.
void introduce(String name) {
  print('$name의 자기소개 시작 !');
  
  Future.delayed(Duration(seconds: 2), () {
    print('안녕 ? 나는 $name ~');
  });
  
  print('$name의 자기소개 끝 !');
}

void main() {
  introduce('강미래');
  introduce('강현재');
}

/* 출력 결과:
강미래의 자기소개 시작 !
강미래의 자기소개 끝 !
강현재의 자기소개 시작 !
강현재의 자기소개 끝 !
안녕 ? 나는 강미래 ~
안녕 ? 나는 강현재 ~
*/

3. async와 await 키워드

  • asyncawait는 비동기적인 코드를 동기적인 코드처럼 작성할 수 있게 해줍니다.
  • await는 Future 류의 코드 앞에만 사용할 수 있으며, await를 포함하는 함수는 반드시 async로 선언해야 합니다.
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');
}

4. Stream 클래스

  • 한 번에 하나의 값이 아닌 여러 값을 비동기적으로 받을 수 있는 클래스입니다.
  • 하나의 작업에 대해 값이나 이벤트가 여러 번 발생하는 경우에 사용합니다.
  • Future와 달리 실행을 직접 종료해주어야 하며, 그렇지 않으면 계속 실행됩니다.
Stream<int> emitNumbers(int first) async* {
  for (var i = first; i >= 0; i--) {
    yield i;
    await Future.delayed(Duration(seconds: 1));
  }
}

void main() {
  emitNumbers(10).where((number) => number.isOdd).listen((number) {
    print('[홀수 타이머] $number');
  });

  emitNumbers(10).where((number) => number.isEven).listen((number) {
    print('[짝수 타이머] $number');
  });
}

5. yield 키워드와 async*

  • yield는 Stream에서 값을 방출하는 키워드입니다.
  • async*는 Stream을 반환 타입으로 갖는 함수에 사용합니다.
  • 함수 내에서 yield를 통해 방출된 값은 listen() 메서드를 통해 받아올 수 있습니다.
Stream<String> emitNames() async* {
  yield '강미래';
  yield '강현재';
  yield '강과거';
}

void main() {
  int number = 1;
  
  emitNames().listen((name) {
    print('$number번째는 $name ~');
    number += 1;
  });
}

비동기 프로그래밍은 시간이 오래 걸리는 작업을 효율적으로 처리할 수 있게 해주는 중요한 개념입니다. Dart에서 제공하는 Future와 Stream 클래스를 통해 다양한 비동기 작업을 처리할 수 있으며, async와 await 키워드를 사용해 비동기 코드를 더 직관적으로 작성할 수 있습니다.

profile
안드로이드, Flutter, 머신러닝

0개의 댓글