[내배캠 앱창업] Day 14 - 비동기 프로그래밍

쏘쏠·2025년 12월 11일

1. 오늘 배운 거

기다리는 동안 멈춰 있지 말고, 다른 일도 같이 하자 → 비동기 프로그래밍

Dart에서는 Future / Stream + async/await로 구현.

2. 동기 vs 비동기

동기 프로그래밍 (Synchronous)

한 줄씩 차례대로 실행,
앞 작업이 끝나야 다음 작업이 시작됨.

예:

void introduce(String name) {
  print('자기소개 시작!');
  print('안녕? 나는 $name ~');
  print('자기소개 완료!');
}

단점:
파일 읽기, 네트워크 요청처럼 시간 오래 걸리는 작업이 있으면
그동안 프로그램이 기다리기만 함 → 비효율적

비동기 프로그래밍 (Asynchronous)

작업 완료를 기다리지 않고,
"나중에 알려줌"이라고 약속해놓고 바로 다음 작업 진행

결과는 미래의 특정 시점에 전달됨

3. Future – 한 번 값이 오가는 비동기

✔ 개념 정리

Future<T>: “나중에 T 타입 값을 줄게”라는 약속

한 작업당 결과 한 번 나오는 구조 (단발성)

예:

Future<int> number = Future.value(1);
Future<String> name = Future.value('강미래');

✔ Future.delayed()

특정 시간 후에 동작시키고 싶을 때 사용

print('실행 시작!');
Future.delayed(Duration(seconds: 2), () {
  print('2초 후 실행!');
});
print('실행 끝!');

출력 흐름:

실행 시작!

실행 끝!

(2초 후) 2초 후 실행!

→ 기다리는 동안 프로그램이 멈추지 않고 계속 진행.

4. async / await – 비동기를 동기처럼 읽기

✔ 기본 패턴

Future<void> introduce(String name) async {
  print('$name의 자기소개 시작!');

  await Future.delayed(Duration(seconds: 2), () {
    print('안녕? 나는 $name ~');
  });

  print('$name의 자기소개 끝!');
}

async : 이 함수 안에 비동기 로직 있음

await : 해당 Future가 끝날 때까지 그 줄만 잠깐 대기 (나머지 프로그램은 계속 돌아감)

✔ 순서 보장하기

Future<void> introduce(String name) async { ... }

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

→ “미래 → 현재” 순서대로 확실하게 실행됨.

✔ Future에서 값 반환하기

Future<String> introduce(String name) async {
  await Future.delayed(Duration(seconds: 2));
  return '이름은 $name ~';
}

void main() async {
  final me = await introduce('강미래');
  final you = await introduce('강현재');
  print('나의 $me 너의 $you');
}

5. Stream – 여러 번 값이 오가는 비동기

✔ 개념 정리

Stream<T>: “T 타입 값을 여러 번 흘려보낼게”

버튼 클릭, 타이머, 센서값처럼 이벤트가 여러 번 발생하는 경우에 사용

Future와 마찬가지로 제네릭: Stream<int>, Stream<String>

✔ yield & async*

Stream<String> emitNames() async* {
  yield '강미래';
  yield '강현재';
  yield '강과거';
}

async* : “이 함수는 Stream을 반환합니다”

yield : 값 하나를 “흘려보내기”

✔ listen() – 스트림 듣기

emitNames().listen((name) {
  print(name);
});

방출되는 값들을 순차적으로 “구독”해서 받아 처리

✔ 카운트다운 예제

Stream<int> emitNumbers(int first) async* {
  for (var i = first; i >= 0; i--) {
    yield i;
    await Future.delayed(Duration(seconds: 1));
  }
}

10 → 0까지 1초에 하나씩 비동기적으로 흘려보내는 스트림

✔ 여러 리스너 + 필터링(where)

emitNumbers(10)
  .where((n) => n.isOdd)
  .listen((n) => print('[홀수 타이머] $n'));

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

→ 홀수, 짝수만 따로 필터링해서 각각 다른 타이머처럼 동작

6. 오늘 배운 포인트 정리

동기(Sync) : 한 줄 끝나야 다음 줄 실행

비동기(Async) : 기다리는 작업과 동시에 다른 작업도 처리

Future : 결과 한 번 나오는 비동기 작업

Stream : 결과 여러 번 나오는 비동기 작업 (이벤트 스트림)

async / await : 비동기 코드를 읽기 좋은 “동기 스타일”로 표현

yield + async* : 값을 여러 번 방출하는 비동기 함수 패턴

profile
Flutter 앱창업 일기장

0개의 댓글