Flow를 이해하려고 여러 블로그, 유튜브를 돌아다녔는데 그 중 이 영상이 가장 이해하기 쉽게 설명되어 있는 것 같아 정리를 한다.
KotlinConf 2019: Asynchronous Data Streams with Kotlin Flow by Roman Elizarov
우리가 서버로 부터 Response를 받을 때 라고 가정한다.
Response를 여러개 받을 때 반환형을 List로 하여 List<Response> 로 받을 수 있다.
예시 1
위의 예시1로 보아 List<Response>로 받을 시 foo() 호출 시 메인 스트림에서 foo()가 분리되어 함수 내에 있는 코드들이 모두 실행 된 후 메인으로 돌아와 출력을 한다.
그렇다면 Channel을 활용하면 어떨까
채널의 구조
예시2 (Channel)
예시 2를 보면 메인에서 channel을 실행할 때 (foo()) 메인스트림에서 응답을 받기 위해 foo()스트림이 끝날때 까지 기다릴 필요가 없이 바로바로 메인에 값을 넘겨준다.
channel의 문제점은 foo()를 생성만하고 돌리지 않을때 channel(foo())스트림은 해당 응답이 다 보내질때 까지 계속 실행된다. (라디오를 빗대어 생각해 봐도 이해하는데 도움이 된다. 청취자는 채널을 틀어 ‘흘러나오고 있는’ 방송을 들을 수 있다. 하지만 라디오는 청취자가 없어도 계속 흘러 나오고 있는 상태이다. )