Menu
Coddy logo textTech

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, 3

async* 키워드는 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는 사용자 상호작용, 센서 판독값 또는 청크 단위로 도착하는 데이터와 같이 지속적인 데이터를 처리하는 데 이상적입니다.

challenge icon

챌린지

쉬움

스트림을 사용하여 시간에 따라 값을 방출하는 카운트다운 타이머 시스템을 만들어 봅시다! 카운트다운 숫자 시퀀스를 생성하는 클래스를 만들어, 스트림이 단일 값이 아닌 여러 값을 어떻게 전달하는지 실습해 볼 것입니다.

코드를 두 개의 파일로 구성합니다:

  • 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()를 반복하고 각 메시지를 출력
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨