돌고 돌아 다시 온 Stream
11번 포스팅에서 Stream을 했었는데 중간에 where()에 막혀 3번의 포스팅 이후
드디어 다시 돌아왔다. Stream에 대해서 기억이 나시는가?
오늘도 정직하고 그날 당일 하루하루에 충실한 나의 뇌는
그날만 기억하기에도 벅차기에 당연하게도 다시 보고 돌아왔다.
11. Dart(async Returnung Future, Stream, Listen, asBroadcastStream)
일반인의 Flutter 앱개발 11. Dart(async Returnung Future, Stream, Listen, asBroadcastStream)
cont. Asynchronous Programming 지난번 10번 포스팅에 이어 같은 영상이다. 요새 드는 생각이 확실히 1강 2강 때보다는 좀 더 상위단계 같은 느낌이 나는 것 같다. 그렇지 않은가? 나만 그런가 ㅋㅋㅋ 재미
trythison.tistory.com
굳이 클릭 안 해도 몇 마디면 생각나실 것이다.
Stream은 멈추지 않고 졸졸 흐르는 개울이다.
사용자가 일을 시키면 그 일이 마치기 전까지 Thread라는 놈이 배정되는데
네트워크를 통해 하는 일 같이 일을 요청하고 그 응답을 기다리는 시간 동안
Thread는 아무 일도 안하고 기다리게 된다.기다리는 꼴을 못보고기다리는 시간 동안 효율적으로 Thread를 사용하기 위해
다른 일에 그 Thread를 쓰게 해 준다.
Stream 값 변형하기
Stream도 이전 포스팅에서 배운 것과 마찬가지로 여러 함수들의 리턴 값들을 이용하여
다양하게 변형할 수 있다.
우리는 Where()를 이용해 원하는 값을 필터링을 할 수 있게 되었기 때문에
이제 당당하게 다음 코드들을 분석하며 연습해 볼 수 있게 되었다.
먼저 기본이 되는 코드를 보자
이제 where()를 이용해서 홀짝을 뱉어내는 리스너로 변형시켜보자.
'나는 listen() 뒤에 붙이면 되겠지?'라고 생각했지만
stream.where()를 해야 입력값이 True일 때 listen을 하여 print를 해야 했다.
이제 결과를 보면 원하는 대로 나온다.
함수로 Stream 제공
이제 진짜로 제대로 Stream을 활용한다고 한다. 아주 기대가 크다.
바로 들어가 보자.
함수의 목적은 간단하다.
looping을 돌리면서 'number'와 'i'를 곱할 것이다. 그런데 future를 쓰려면 return 값을 줘야 한다.
for문에서 return을 쓰면 맨 처음 들어갔던 'i=0'에서 return을 해버려서 함수가 종료가 된다.
이건 함수의 한계라 어쩔 수가 없다.
우리는 stream을 이용해서 함수의 한계를 돌파하자.
calculate()를 Future로 작성을 하면 우리는 아래와 같이 작성을 할 것이다.
그러나 우리는 Stream을 이용하기 때문에 이렇게 바꿔주면 해결된다.
return값을 'yield'로 바꿔주면 yeild가 실행이 될 때마다 calculate를 듣고 있는 listener에게 값을 뿌려줄 수 있다.
결과는
예상대로 결과가 잘 나왔다.
async*에서 async에서 쓰던 일반 함수 쓸 수 있나?
간단하다. 써보자.
그냥 쓰면 된다.^^ 당연히 이 또한 async로 진행이 된다. 테스트를 해보자.
마지막 yield*
지금까지 탄탄하게 쌓아온 사람들이라면 할만할 텐데
그렇지 않은 사람(나 같은)은 헷갈릴 수 있다.
방금은 calculate() 값이 2,3이 번갈아 가면서 나왔는데
이젠 하나의 함수가 다 끝날 때까지 다음 함수는 안 나왔으면 좋겠을 때 하는 방법이다.
Stream으로 함수를 하나 선언한다.
playAllStream함수 안에 calculate함수 둘을 넣고 'yield*'로 선언해줬다.
기존 yield는 yeild가 실행됐을 때 하나씩 순서대로 가져왔지만
yield*은 한 함수가 끝날 때까지 기다린다. Future의 await 같은 기능이다.
결국 calculate(1)이 다 리턴되어야 calculate(123)이 실행이 된다.
결과는?
만족스러운 결과가 나왔다.
마무리
오늘은 두 가지를 배웠다.
1. 함수들의 리턴 값들을 이용할 수 있기에 where를 사용하여 홀짝을 걸러냈고
2. 함수를 Stream으로 이용하기 위해 Stream <> async* yield*까지 배워봤다.
async*도 async와 마찬가지로 await 같은 기능들을 쓸 수 있었고
yield*은 yield와 달리 해당 함수가 전부 리턴될 때까지 다음으로 넘어가지 않아
Future의 await 같은 기능을 수행해줬다.
Stream은 여기까지 하면 끝이다.
보통은 dart:async 패키지로 Stream을 쓸 일은 없다.
왜냐면 더 잘 꾸며진 라이브러리를 오픈소스로 쓰기 때문이다.
하지만 우리가 개념에 대해 알고 있어야지 다른 오픈소스를 쓰더라도
잘 이해하며 쓸 수 있기에 연습을 해본 것이다.
한번 공부했다고 바로 적용하며 슈퍼 개발자(=내 기준 앱 개발자)로
개발을 할 순 없겠지만 라이브러리 보면서 이해하며 여기저기 찾아보며
공부하다 보면 나오지 않겠는가?
아무튼 오늘은 여기까지이며
드디어 dart의 abc를 끝냈다.
다음부터는 flutter를 시작해보겠다.
flutter도 기본을 배워야 하는데 코드팩토리 형(나보다 잘하면 형)과
헤쳐나가 보자.
틀린 점이나 궁금한 점이 있으면 댓글로 알려달라.
입문자라 아무것도 모르고 이상한 소리를
썼을 가능성이 매우 매우 농후하다.
궁금한 점은 댓글로 토론하며 정답을 찾아보자.
코드팩토리님의 Dart강의를 보고 공부 중입니다.
'우당탕탕 무작정 앱 개발하기' 카테고리의 다른 글
Flutter 입문 2. Project 폴더의 구성, main widget의 기초, Scaffold (0) | 2022.10.18 |
---|---|
Flutter 입문 1. widget(stateless widget, stateful widget, Widget tree) (0) | 2022.10.17 |
일반인의 Flutter 앱개발 14. Dart(Cascading Operator, Map to Class, 실전 문제) (2) | 2022.10.15 |
일반인의 Flutter 앱개발 13. Dart(Mapping, Where, Reduce, fold) (0) | 2022.10.14 |
일반인의 Flutter 앱개발 12. Dart(async 였지만 Functional Programming 형변환) (2) | 2022.10.13 |