Stream 기초
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 77번째.
Future는 단일 값을 전달하는 반면, Stream은 시간에 걸쳐 일련의 값들을 전달합니다. 여러 데이터 조각을 내보낼 수 있는 파이프라고 생각하면 됩니다. 이는 이벤트, 실시간 업데이트 또는 데이터를 하나씩 처리하는 데 적합합니다.
Stream.fromIterable()를 사용하거나 async* 및 yield를 사용하는 비동기 제너레이터 함수를 사용하여 간단한 스트림을 생성할 수 있습니다:
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}
// Output: 1, 2, 3async* 키워드는 Stream을 반환하는 함수를 나타내며, yield는 각 값을 방출합니다. 스트림을 소비하려면 각 값이 도착할 때마다 처리하는 await for를 사용하세요.
또한 콜백 함수를 인자로 받는 listen() 메서드를 사용하여 스트림을 리스닝할 수도 있습니다:
Stream<String> greetings() async* {
yield 'Hello';
yield 'Hi';
yield 'Hey';
}
void main() {
greetings().listen((message) {
print(message);
});
}Futures와의 주요 차이점은 다음과 같습니다. Future는 단일 값으로 한 번 완료되는 반면, Stream은 완료되기 전까지 여러 값을 내보낼 수 있습니다. 이러한 특성 덕분에 Streams는 사용자 상호작용, 센서 판독값 또는 청크 단위로 도착하는 데이터와 같이 지속적인 데이터를 처리하는 데 이상적입니다.
챌린지
쉬움스트림을 사용하여 시간에 따라 값을 방출하는 카운트다운 타이머 시스템을 만들어 봅시다! 카운트다운 숫자 시퀀스를 생성하는 클래스를 만들어, 스트림이 단일 값이 아닌 여러 값을 어떻게 전달하는지 실습해 볼 것입니다.
코드를 두 개의 파일로 구성합니다:
countdown.dart: 카운트다운 스트림을 생성하는Countdown클래스를 만듭니다. 클래스에는 다음이 포함되어야 합니다:- 카운트다운의 시작 숫자를 저장하는
start필드 (int) - 시작 숫자를 매개변수로 받는 생성자
Stream<int>를 반환하는countDown()메서드.async*와yield를 사용하여start부터0까지(포함) 숫자를 방출합니다.Stream<String>를 반환하는countDownWithMessage()메서드. 이 메서드는start부터1까지 각 숫자에 대해'T-minus [number]'형식의 문자열을 방출한 다음, 마지막 값으로'Liftoff!'를 방출해야 합니다.
- 카운트다운의 시작 숫자를 저장하는
main.dart: 카운트다운 파일을 임포트하고 두 스트림 메서드를 시연합니다. main 함수는 async여야 하며 다음을 수행합니다:3부터 시작하는Countdown인스턴스를 생성합니다.'Number countdown:'를 출력합니다.await for를 사용하여countDown()을 반복하며 각 숫자를 출력합니다.- 빈 줄을 출력합니다.
'Launch sequence:'를 출력합니다.await for를 사용하여countDownWithMessage()를 반복하며 각 메시지를 출력합니다.
각 yield 문이 스트림을 통해 값을 방출하고, await for가 각 값이 도착할 때마다 처리하는 방식에 주목하세요. 하나의 결과만 전달하는 Future와 달리, 스트림은 여러 값을 순차적으로 방출합니다!
예상 출력:
Number countdown:
3
2
1
0
Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!치트 시트
Stream은 단일 값을 전달하는 Future와 달리, 시간에 걸쳐 일련의 값을 전달합니다. 스트림은 이벤트, 실시간 업데이트 또는 데이터를 조각별로 처리하는 데 이상적입니다.
async*와 yield를 사용하는 비동기 제너레이터 함수를 사용하여 스트림을 생성하세요:
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}await for를 사용하여 스트림을 소비하세요:
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}또는 콜백과 함께 listen() 메서드를 사용하세요:
void main() {
greetings().listen((message) {
print(message);
});
}Stream.fromIterable()을 사용하여 이터러블(iterable)로부터 스트림을 생성할 수도 있습니다.
직접 해보기
import 'countdown.dart';
Future<void> main() async {
// TODO: 3부터 시작하는 Countdown 인스턴스 생성
// TODO: 'Number countdown:' 출력
// TODO: await for를 사용하여 countDown()을 반복하고 각 숫자를 출력
// TODO: 빈 줄 출력
// TODO: 'Launch sequence:' 출력
// TODO: await for를 사용하여 countDownWithMessage()를 반복하고 각 메시지를 출력
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.