[ Dart&Flutter ] Dart 비동기 프로그래밍 (Async & Await) 심화 학습

Dart 비동기 프로그래밍(Async & Await) 개념과 내용 그리고 실습 방법등을 정리하여 배울수 있도록 작성하였습니다. 비동기 프로그래밍에 대한 개념 설명 → 실습 예제 2개 → 해설 & 출력 예시 방식으로 만들어져 있사오니 하나 하나 차근차근 시도해보시고 심화하여 역량을 쌓으시길 바래요. 


Dart 비동기 프로그래밍 (Async & Await) 심화 학습
Dart 비동기 프로그래밍 (Async & Await) 심화 학습




⚡. Dart 비동기 프로그래밍 (Async & Await) 심화 학습

느린 작업(예: 인터넷 요청, 파일 읽기)을 기다리지 않고 똑똑하게 처리하는 법!


 

✅ 1. Future 기본 개념

📘 개념 설명

  • Future는 “미래에 완료될 작업”을 의미해요.

  • 시간이 걸리는 작업(네트워크 요청, 파일 다운로드 등)을 기다리지 않고 예약하는 방식이에요.

  • 예시: 배달을 시키고, 음식이 올 때까지 다른 일을 하는 것과 같아요!




🏆 실습 예제 1: Future로 지연 작업 만들기

Future<String> fetchData() {
  return Future.delayed(Duration(seconds: 2), () => '데이터 도착!');
}

void main() {
  fetchData().then((data) => print(data));
  print('기다리는 중...');
}

✅ 출력:

기다리는 중...
(2초 후) 데이터 도착!





🏆 실습 예제 2: Future 기본 예제

Future<String> sayHello() {
  return Future(() => '안녕하세요!');
}

void main() {
  sayHello().then((msg) => print(msg));
}

✅ 출력:

안녕하세요!




✅ 2. async, await 사용법

📘 개념 설명

  • async: 비동기 함수임을 표시

  • await: Future가 끝날 때까지 잠깐 기다렸다가 다음 코드 실행





🏆 실습 예제 1: async & await으로 데이터 가져오기

Future<String> getData() async {
  await Future.delayed(Duration(seconds: 1));
  return '데이터 완료!';
}

void main() async {
  print('요청 중...');
  String result = await getData();
  print(result);
}

✅ 출력:

요청 중...
(1초 후) 데이터 완료!



🏆 실습 예제 2: 두 개의 비동기 작업 순서대로 실행하기

Future<void> firstTask() async {
  await Future.delayed(Duration(seconds: 1));
  print('첫 번째 작업 완료');
}

Future<void> secondTask() async {
  await Future.delayed(Duration(seconds: 1));
  print('두 번째 작업 완료');
}

void main() async {
  await firstTask();
  await secondTask();
}

✅ 출력:

첫 번째 작업 완료
두 번째 작업 완료





✅ 3. then, catchError 체이닝

📘 개념 설명

  • then: Future가 성공했을 때 실행

  • catchError: 에러가 발생했을 때 처리

  • 체이닝으로 여러 작업을 연결해서 깔끔하게 관리 가능





🏆 실습 예제 1: then으로 결과 처리

Future<String> fetchMessage() {
  return Future.delayed(Duration(seconds: 1), () => '메시지 도착!');
}

void main() {
  fetchMessage().then((msg) => print(msg));
}





🏆 실습 예제 2: 에러 처리 with catchError

Future<String> fetchData() {
  return Future.error('서버 오류 발생!');
}

void main() {
  fetchData()
      .then((data) => print(data))
      .catchError((e) => print('에러: $e'));
}

✅ 출력:

에러: 서버 오류 발생!




✅ 4. Stream 개념 및 활용

📘 개념 설명

  • Stream은 여러 개의 데이터를 시간 차를 두고 연속적으로 제공하는 구조

  • 예시: 유튜브 라이브 채팅, 센서 데이터, 실시간 알림




🏆 실습 예제 1: 기본 Stream 생성

Stream<int> numberStream() async* {
  for (int i = 1; i <= 3; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() {
  numberStream().listen((num) => print('숫자: $num'));
}

✅ 출력:

(1초마다) 숫자: 1
숫자: 2
숫자: 3




🏆 실습 예제 2: 문자열 스트림

Stream<String> messageStream() async* {
  yield '첫 번째 메시지';
  await Future.delayed(Duration(seconds: 1));
  yield '두 번째 메시지';
}

void main() {
  messageStream().listen((msg) => print(msg));
}





✅ 5. StreamController로 데이터 관리

📘 개념 설명

  • StreamController를 사용하면 내가 직접 스트림에 데이터를 추가하고 관리할 수 있어요.

  • 버튼 클릭 같은 이벤트 처리에 활용!




🏆 실습 예제 1: StreamController 기본 사용

import 'dart:async';

void main() {
  final controller = StreamController<String>();

  controller.stream.listen((data) {
    print('받은 데이터: $data');
  });

  controller.sink.add('Hello');
  controller.sink.add('World');

  controller.close();
}

✅ 출력:

받은 데이터: Hello
받은 데이터: World





🏆 실습 예제 2: 숫자 데이터 관리

import 'dart:async';

void main() {
  final controller = StreamController<int>();

  controller.stream.listen((n) => print('숫자: $n'));

  for (int i = 1; i <= 3; i++) {
    controller.sink.add(i);
  }

  controller.close();
}




✅ 6. 비동기 반복문 (await for)

📘 개념 설명

  • await for 문법을 사용하면 스트림 데이터를 하나씩 쉽게 처리할 수 있어요.





🏆 실습 예제 1: await for로 스트림 읽기

Stream<String> getMessages() async* {
  yield '안녕!';
  await Future.delayed(Duration(seconds: 1));
  yield '반가워!';
}

void main() async {
  await for (var msg in getMessages()) {
    print(msg);
  }
}





🏆 실습 예제 2: 숫자 스트림 반복 출력

Stream<int> getNumbers() async* {
  for (int i = 1; i <= 2; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() async {
  await for (var num in getNumbers()) {
    print('번호: $num');
  }
}



🎓 마무리 요약

개념

설명

Future

미래에 완료될 작업

async / await

비동기 코드를 쉽게 작성

then / catchError

체이닝으로 결과 & 에러 처리

Stream

여러 데이터를 시간차로 전달

StreamController

직접 데이터 관리

await for

스트림을 반복문처럼 처리


💡 실전 활용 예시

  • 서버 API 호출

  • 실시간 채팅 앱

  • Flutter에서 비동기 UI 업데이트

  • 파일 다운로드 진행 상황 표시


댓글 쓰기