기다리는 동안 멈춰 있지 말고, 다른 일도 같이 하자 → 비동기 프로그래밍
Dart에서는 Future / Stream + async/await로 구현.
한 줄씩 차례대로 실행,
앞 작업이 끝나야 다음 작업이 시작됨.
예:
void introduce(String name) {
print('자기소개 시작!');
print('안녕? 나는 $name ~');
print('자기소개 완료!');
}
단점:
파일 읽기, 네트워크 요청처럼 시간 오래 걸리는 작업이 있으면
그동안 프로그램이 기다리기만 함 → 비효율적
작업 완료를 기다리지 않고,
"나중에 알려줌"이라고 약속해놓고 바로 다음 작업 진행
결과는 미래의 특정 시점에 전달됨
Future<T>: “나중에 T 타입 값을 줄게”라는 약속
한 작업당 결과 한 번 나오는 구조 (단발성)
예:
Future<int> number = Future.value(1);
Future<String> name = Future.value('강미래');
특정 시간 후에 동작시키고 싶을 때 사용
print('실행 시작!');
Future.delayed(Duration(seconds: 2), () {
print('2초 후 실행!');
});
print('실행 끝!');
실행 시작!
실행 끝!
(2초 후) 2초 후 실행!
→ 기다리는 동안 프로그램이 멈추지 않고 계속 진행.
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<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');
}
Stream<T>: “T 타입 값을 여러 번 흘려보낼게”
버튼 클릭, 타이머, 센서값처럼 이벤트가 여러 번 발생하는 경우에 사용
Future와 마찬가지로 제네릭: Stream<int>, Stream<String> 등
Stream<String> emitNames() async* {
yield '강미래';
yield '강현재';
yield '강과거';
}
async* : “이 함수는 Stream을 반환합니다”
yield : 값 하나를 “흘려보내기”
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초에 하나씩 비동기적으로 흘려보내는 스트림
emitNumbers(10)
.where((n) => n.isOdd)
.listen((n) => print('[홀수 타이머] $n'));
emitNumbers(10)
.where((n) => n.isEven)
.listen((n) => print('[짝수 타이머] $n'));
→ 홀수, 짝수만 따로 필터링해서 각각 다른 타이머처럼 동작
동기(Sync) : 한 줄 끝나야 다음 줄 실행
비동기(Async) : 기다리는 작업과 동시에 다른 작업도 처리
Future : 결과 한 번 나오는 비동기 작업
Stream : 결과 여러 번 나오는 비동기 작업 (이벤트 스트림)
async / await : 비동기 코드를 읽기 좋은 “동기 스타일”로 표현
yield + async* : 값을 여러 번 방출하는 비동기 함수 패턴