일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- MDP
- Flutter
- Widget
- rao
- BFS
- fastapi를 사용한 파이썬 웹 개발
- Kaggle
- FastAPI
- Dreamhack
- Image Processing
- Stream
- 영상처리
- bloc
- ARM
- C++
- ML
- PCA
- MATLAB
- study book
- DART
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- llm을 활용 단어장 앱 개발일지
- system hacking
- Algorithm
- BOF
- Computer Architecture
- Got
- BAEKJOON
- 백준
- pytorch
- Today
- Total
Bull
[Dart] Stream이란? (기본, before understanding Bloc Concept) 본문
[Dart] Stream이란? (기본, before understanding Bloc Concept)
Bull_ 2024. 7. 11. 21:49
https://bloclibrary.dev/bloc-concepts/
Bloc Concepts
An overview of the core concepts for package:bloc.
bloclibrary.dev
이 글은 Bloc을 이해하기 전 Stream이란 무엇인지 이해하기 위해 해당 공식 문서를 그대로 옮겨보기 + 제 생각 덧붙여보기로 작성해보았습니다.
Streams
Streams은 비동기식 시퀀스 데이터입니다.
Bloc 라이브러리를 이해하기 위해 Streams이 어떻게 동작하는지 이해하는 것은 중요합니다.
만약 Streams이 익숙치 않은 분은 물이 흐르는 파이프를 생각하세요.
파이프는 Stream이고 물은 비동기식 데이터 입니다.
우린 Stream을 dart의 async* (async 생성자)키워드를 통해 생성할 수 있습니다.
Stream<int> countStream(int max) async* {
for (int i = 0; i < max; i++) {
yield i;
}
}
함수를 async*로 표기하여 우리는 yield 키워드를 사용할 수 있고, 스트림 데이터를 반환할 수 있습니다.
예제에서 우리는 int형 Stream을 max 까지 반환합니다.
async* 함수에서 yield 지점마다 우리는 Stream을 통해 데이터 조각을 푸시합니다.
여러 가지 방법을 사용할 수 있지만 정수 스트림의 합계를 반환하는 함수를 작성해봅니다.
Future<int> sumStream(Stream<int> stream) async {
int sum = 0;
await for (int value in stream) {
sum += value;
}
return sum;
}
async를 사용하여 함수를 표기하면 await을 사용할 수 있고 정수형 Future를 반환합니다.
예시에서 우리는 각 스트림 데이터의 값을 기다리고 합계를 반환 받을 수 있습니다.
Stream<int> countStream(int max) async* {
for (int i = 0; i < max; i++) {
yield i;
}
}
Future<int> sumStream(Stream<int> stream) async {
int sum = 0;
await for (int value in stream) {
sum += value;
}
return sum;
}
void main() async {
/// Initialize a stream of integers 0-9
Stream<int> stream = countStream(10);
print(stream);
/// Compute the sum of the stream of integers
int sum = await sumStream(stream);
/// Print the sum
print(sum); // 45
}
main()을 통해 실행하면 위와 같습니다.
이를 통해 이제 Cubit이라는 개념이 뭔지 배울 수 있습니다.
아래는 비공식적인 제 개인적인 생각입니다.
개념 비유해보기
신화 토르를 모티브로 한 마블 스튜디오의 영화 '토르'에서 아스가르드는 우주에 떠 있는 섬으로 나옵니다. 그곳에서는 평평한 섬 바깥으로 물이 흘러내립니다. 흐르는 물이 어디로 가는지 모르지만, 그것을 비유삼아 설명해보고자 합니다.
Streams의 개념과 async*를 통해 구현한 함수인 countStream은 아스가르드 섬에서 흘러내리는 시냇물 혹은 강가 또는 폭포로 비유할 수 있습니다. 섬 아래에는 원래 아무것도 없지만, 아스가르드에서 흘러내리는 물은 다이아보다 비싸고 하루에 일정량만 흘러내린다고 가정해봅시다.
그리고 어떤 상인이 그 소문을 듣고 배에 수통을 가지고 와서 아스가르드의 물을 팔아먹으려고 아침 일찍 폭포의 물이 내리기를 기다리고 있다고 합니다. 이제 그 물이 총 10군데에서 흘러내리기 시작합니다.
1번째 구역에서는 1억, 2번째 구역에서는 2억, ..., 9번째 구역에서는 9억입니다. 상인은 이 물을 순서대로 다 받았습니다.
여기서 상인은 sumStream, 아스가르드의 폭포는 countStream이라고 할 수 있겠습니다. 이제 상인은 집에 귀가하여 아스가르드의 폭포에서는 45억이라는 스트림 데이터를 반환받을 수 있는 함수처럼 생각하겠네요.
Stream<int> countStream(int max) async* {} → 아스가르드 폭포
논리구조를 어렵게 생각하지말고 이 method는 폭포 역할을 한다고 생각합니다.
Future<int> sumStream(Stream<int> stream) async {} → 물을 받는 상인
논리구조를 어렵게 생각하지말고 이 method는 상인 역할을 한다고 생각합니다.
참고 자료
[Stream 공식 문서]
https://dart.dev/libraries/async/using-streams
Asynchronous programming: Streams
Learn how to consume single-subscriber and broadcast streams.
dart.dev
'Computer Language > Dart' 카테고리의 다른 글
[Dart::Stream] listen method (0) | 2024.08.19 |
---|---|
[Dart] Mixin은 언제 사용하나요? (1) | 2024.07.23 |
[Dart] Extension Methods란? (0) | 2024.07.15 |
[Dart] late String과 String? 의 차이 (0) | 2024.06.10 |
[Dart] 다양한 for문 (0) | 2024.03.11 |