{"id":1045,"date":"2023-08-01T17:33:15","date_gmt":"2023-08-01T08:33:15","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=1045"},"modified":"2025-09-07T11:42:34","modified_gmt":"2025-09-07T02:42:34","slug":"kotlin-flow-part-1","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2023\/08\/01\/1045\/","title":{"rendered":"Kotlin : Flow Part. 1"},"content":{"rendered":"\n<p> Reactive Stream\uaddc\uaca9\uc758 Kotlin \uad6c\ud604. Asynchronouse cold stream. Asynchronouse \ud558\uac8c \ub3d9\uc791\ud558\ub294\uac8c \ucf54\ub8e8\ud2f4\uacfc \ucc30\ub5a1\uc73c\ub85c \ub3cc\uc544\uac04\ub2e4. <\/p>\n\n\n\n<p> \ub370\uc774\ud130 \uc2a4\ud2b8\ub9bc\uc774\ub77c\uace0 \ud55c\ub2e4\uba74, \ud55c\ucabd(Producer)\uc5d0\uc11c\ub294 \uc18c\uc2a4 \ub370\uc774\ud130\ub97c \uacc4\uc18d \ub123\uc5b4\uc8fc\uace0 \uc774 \ub370\uc774\ud130\ub4e4\uc774 \uc77c\ub828\uc758 \ud30c\uc774\ud504\ub77c\uc778\uc744 \ub530\ub77c \ucc98\ub9ac\ub41c \ud6c4, \ub9de\uc740\ud3b8(Consumer)\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ube7c\uac00\ub294 \ubaa8\uc2b5\uc744 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \uc8fc\ub85c \ud30c\uc77c\ucc98\ub9ac\ub4f1\uc758 \ub300\uc6a9\ub7c9 \ub370\uc774\ud130\uc758 \ucc98\ub9ac\uc5d0 \uc0ac\uc6a9\ub418\uc9c0\ub9cc, \uc774\ubbf8 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \ubc94\uc6a9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uace0 \uc788\ub4ef, \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 reactive programming \ud615\ud0dc\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc758 \ud06c\uae30\uc640 \uc0c1\uad00\uc5c6\uc774 \ubcf4\ud3b8\uc801\uc73c\ub85c \uc0ac\uc6a9\ub418\uba70 \uaf64 \ub9ce\uc740 \ud3b8\uc758\uc131\uc744 \uc81c\uacf5\ud558\ub294 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\"> Channel<\/h4>\n\n\n\n<p> \ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 \ucf54\ub8e8\ud2f4\uac04\uc5d0 \uc774\ub7f0 \ub370\uc774\ud130 \uc2a4\ud2b8\ub9bc\uc744 \uc704\ud574 <a href=\"https:\/\/kotlinlang.org\/docs\/channels.html#ticker-channels\">Channel<\/a>\uc774\ub780\uac78 \uc81c\uacf5\ud55c\ub2e4. \ucc44\ub110\uc740 BlockingQueue\uc640 \uc720\uc0ac\ud55c\ub370, \uac12\uc744 \ub123\uc5b4\uc8fc\ub294 \ube14\ub85d\ud0b9\uc73c\ub85c \ub3d9\uc791\ud558\ub294  put() \ub300\uc2e0\uc5d0 suspend \ud568\uc218\uc778 send()\ub97c \uc0ac\uc6a9\ud558\uace0, \ub9c8\ucc2c\uac00\uc9c0\ub85c \ube14\ub85d\ud0b9\uc73c\ub85c \ub3d9\uc791\ud558\ub294 take() \ub300\uc2e0\uc5d0 suspend receive()\ub97c \uc0ac\uc6a9\ud55c\ub2e4. <\/p>\n\n\n\n<p> \uc544\uc8fc \uac04\ub2e8\ud55c channel \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun main(args: Array&lt;String>): Unit = runBlocking {\n\n    channelSample()\n    println(\"\\nend of main\")\n}\n\nsuspend fun channelSample() {\n    val channel = Channel&lt;Int>()\n\n    CoroutineScope(Dispatchers.Default).launch {\n        for(x in 1..5) {\n            println(\"send $x^2\")\n            channel.send(x*x)\n        }\n    }\n\n    repeat(5) {\n        println(\"received : ${channel.receive()}\")\n    }\n\n    println(\"Done!\")\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">fun <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(args: Array<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">String<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\">): Unit <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> runBlocking {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">channelSample<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">end of main&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">suspend fun <\/span><span style=\"color: #DCBDFB\">channelSample<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val channel <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Channel<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">&gt;()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">CoroutineScope<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default).launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\">(x <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..5<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;send $x^2&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            channel.<\/span><span style=\"color: #DCBDFB\">send<\/span><span style=\"color: #ADBAC7\">(x<\/span><span style=\"color: #F47067\">*<\/span><span style=\"color: #ADBAC7\">x)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">repeat<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;received : ${channel.receive()}&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Done!&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Channel\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4 Dispatchers.Default\uc758 \ucf54\ub8e8\ud2f4\uc5d0\uc11c send()\ub85c \ub370\uc774\ud130\ub97c \ubcf4\ub0b4\uace0, \uba54\uc778\uc5d0\uc11c receive()\ub85c \ub370\uc774\ud130\ub97c \ubc1b\uace0 \uc788\ub2e4. \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>send 1^2\nsend 2^2\nreceived : 1\nreceived : 4\nsend 3^2\nsend 4^2\nreceived : 9\nsend 5^2\nreceived : 16\nreceived : 25\nDone!\n\nend of main<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">send <\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #F47067\">^<\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">send <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #F47067\">^<\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">received<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">received<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">send <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #F47067\">^<\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">send <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #F47067\">^<\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">received<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">send <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #F47067\">^<\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">received<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">16<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">received<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">25<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Done<\/span><span style=\"color: #F47067\">!<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">end <\/span><span style=\"color: #F47067\">of<\/span><span style=\"color: #ADBAC7\"> main<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uacb0\uacfc\ub97c \ubcf4\uba74, Producer \ucabd\uc740 Consumer\uc5d0 \uc0c1\uad00\uc5c6\uc774 \ub370\uc774\ud130\ub97c \uc4f0\uace0 \uc788\ub294\uac8c \ubcf4\uc778\ub2e4. \uc77c\ubc18\uc801\uc778 \ud050\ub97c \uc774\uc6a9\ud558\ub294 \ub4ef\ud55c \uc774\ub7ec\ud55c \ub370\uc774\ud130 \uc2a4\ud2b8\ub9bc\uc740 Producer\/Consumer\uac00 \ub3c5\ub9bd\uc801\uc73c\ub85c \ub3d9\uc791\ud558\uace0, Consumer\uac00 \uc77c\uc744 \uc548\ud574\ub3c4 Producer\ub294 \uc77c\uc744 \ud558\uba70 \ud56d\uc0c1 \ud65c\uc131\ud654 \ub418\uc5b4 \uc788\uae30 \ub54c\ubb38\uc5d0, &#8216;Hot&#8217; stream\uc774\ub77c\uace0 \ub9d0\ud55c\ub2e4. Flow\ub97c \ubcf4\uba74\uc11c \ube44\uad50\ud574\ubcf4\uc790.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Flow<\/h4>\n\n\n\n<p> Flow\ub294 builder\ub97c \uc774\uc6a9\ud558\uc5ec \uba3c\uc800 Flow\ub97c \ub9ac\ud134\ud558\ub294 suspend \ud568\uc218\ub97c \uc815\uc758\ud55c\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>suspend fun flowSample(): Flow&lt;Int> = flow {\n    for(i in 1..5) {\n        delay(100)\n        println(\"emit $i\")\n        emit(i)\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">suspend fun <\/span><span style=\"color: #DCBDFB\">flowSample<\/span><span style=\"color: #ADBAC7\">(): Flow<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">Int<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> flow {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\">(i <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..5<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">delay<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">100<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;emit $i&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> \ub9ac\ud134\uac12\uc774 Flow&lt;&gt; \ud0c0\uc785\uc778 suspend \ud568\uc218\ub85c, flow \ube4c\ub354\uc758 \ud55c \ud615\ud0dc\uc778 flow { }\ub85c \uc815\uc758\ud588\ub2e4. Channel\uacfc \ub2e4\ub974\uac8c send()\uac00 \uc544\ub2cc emit()\uc73c\ub85c \uac12\uc744 \ubcf4\ub0b4\ub294\uac8c \ubcf4\uc778\ub2e4. \uac12\uc744 \uc5b4\ub5bb\uac8c \ubc1b\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun main(args: Array&lt;String>): Unit = runBlocking {\n\n    flowSample().collect{value -> println(\"value = $value\")}\n    println(\"\\nend of main\")\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">fun <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(args: Array<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">String<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\">): Unit <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> runBlocking {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">flowSample<\/span><span style=\"color: #ADBAC7\">().collect{value <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;value = $value&quot;<\/span><span style=\"color: #ADBAC7\">)}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">end of main&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Consumer\uac00 \uac12\uc744 \uac00\uc838\uc624\ub294\uac74 <a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines.flow\/collect.html\">Flow.collect()<\/a>\ub97c \uc774\uc6a9\ud558\uace0 \uc788\ub2e4. \ubc1b\uc544\uc624\ub294 \uac12\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \ucf54\ub4dc\ub294 \ub78c\ub2e4 \ud615\ud0dc\ub85c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4. Channel\ucc98\ub7fc \uac12\uc744 \uac00\uc838\uc624\uae30 \uc704\ud574 \ub8e8\ud504\ub97c \ub3cc\uc9c0 \uc54a\uace0 \uac12\uc774 \ucc98\ub9ac\ub418\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4. \ucd9c\ub825\uac12\uc744 \ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>emit 1\nvalue = 1\nemit 2\nvalue = 2\nemit 3\nvalue = 3\nemit 4\nvalue = 4\nemit 5\nvalue = 5\n\nend of main<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">emit <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">value <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">emit <\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">value <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">emit <\/span><span style=\"color: #6CB6FF\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">value <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">emit <\/span><span style=\"color: #6CB6FF\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">value <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">emit <\/span><span style=\"color: #6CB6FF\">5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">value <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">5<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">end <\/span><span style=\"color: #F47067\">of<\/span><span style=\"color: #ADBAC7\"> main<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> \uac12\uc744 \ud558\ub098 emit()\ud558\uba74 collect\uc758 \ub78c\ub2e4\uac00 \uc2e4\ud589\ub418\uace0, \uc774\ub807\uac8c \ud558\ub098\uc529 \uc21c\ucc28\uc801\uc73c\ub85c \uc2e4\ud589\ub418\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4. KotlinConf 2019: Asynchronous Data Streams with Kotlin Flow \uc5d0\uc11c \uc18c\uac1c\ub41c \uadf8\ub798\ud504\ub85c \ubcf4\uba74 \ubcf4\ub2e4 \uc9c1\uad00\uc801\uc774\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"195\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2023\/07\/flow_diagram01-1024x195.png\" alt=\"\" class=\"wp-image-1968\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2023\/07\/flow_diagram01-1024x195.png 1024w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2023\/07\/flow_diagram01-300x57.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2023\/07\/flow_diagram01-768x146.png 768w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2023\/07\/flow_diagram01.png 1185w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\ucc98\uc74c\uc5d0\ub294 Flow&lt;R&gt;\uc744 \uc815\uc758\ub9cc \ud574\ub193\uace0 collect\ub97c \ud638\ucd9c\ud558\uba74, \uadf8 \ub54c\ubd80\ud130 \uc2e4\ud589\uc774 \ub418\uba74\uc11c \ud558\ub098\uc529 emit\uc744 \uae30\uc900\uc73c\ub85c \ubc88\uac08\uc544\uac00\uba70 \uc2e4\ud589\ub418\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p> Flow\ub294 Channel\ucc98\ub7fc producer\uc640 consumer\uac00 \ubcc4\ub3c4\ub85c \uc2e4\ud589\ub418\ub294\uac8c \uc544\ub2c8\ub2e4. Flow\ub294 \ubbf8\ub9ac \uc815\uc758\ud574\ub193\uace0, collect()\ub97c \ud638\ucd9c\ud574\uc8fc\uba74, Flow\uc758 \ucf54\ub4dc\ub97c \ud558\ub098\uc758 \uac12\uc774 emit()\ub420 \ub54c\uae4c\uc9c0 \uc2e4\ud589\ud55c \ud6c4, collect()\uc758 \ub78c\ub2e4 \ud568\uc218\uac00 \uadf8 \uac12\uc73c\ub85c \uc2e4\ud589\ub41c\ub2e4. \uc774 \uacfc\uc815\uc774 emit\uc774 \ubaa8\ub450 \ub05d\ub0a0 \ub54c\uae4c\uc9c0 \ubc18\ubcf5\ub41c\ub2e4. \ub208\uce58\uac00 \ube60\ub978 \uc0ac\ub78c\uc740 \uc54c\ud150\ub370, \ud615\ud0dc\ub9cc Channel\uacfc \uac19\uc9c0, \uadf8\ub0e5 Flow\uc758 collect() \ud568\uc218\ub97c \ub78c\ub2e4 \ud615\ud0dc\uc758 callback \ud568\uc218\uc640 \ud568\uaed8 \ud638\ucd9c\ud574 \uc8fc\ub294 \uac83\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Flow is Cold stream!<\/h4>\n\n\n\n<p>Flow\uc758 \uad6c\ud604\uc744 \uc880 \ub354 \uae4a\uac8c \uc54c\uc544\ubcf4\uc790. Flow \uc815\uc758\ub97c \uc0b4\ud3b4\ubcf4\uba74, \ud558\ub098\uc758 \uc778\ud130\ud398\uc774\uc2a4\ub85c suspend \ud568\uc218\uc778 collect()\ub97c \uac16\ub3c4\ub85d \uc815\uc758\ub418\uc5b4 \uc788\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>interface Flow&lt;out T> {\n    suspend fun collect(collector: FlowCollector&lt;T>)\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Flow<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F47067\">out<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    suspend fun <\/span><span style=\"color: #DCBDFB\">collect<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">collector<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FlowCollector<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc778\uc790\uac12\uc778 FlowCollector\ub97c \ubcf4\uba74, \ud568\uc218 \uac1d\uccb4 \uc778\ud130\ud398\uc774\uc2a4\ub85c, suspend \ud568\uc218\uc778 emit()\uc744 \uac16\ub3c4\ub85d \uc815\uc758\ub418\uc5b4 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>interface FlowCollector&lt;in T> {\n    suspend fun emit(value: T)\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FlowCollector<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    suspend fun <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">value<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> \ub3d9\uc791\uc744 \uc815\ud655\ud788 \uc54c\uae30\uc704\ud574, \uad6c\ud604 \ubd80\ubd84\uc778 flow{ } \ube4c\ub354\uc758 \uad6c\ud604\uc744 \ubcf4\uba74, <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public fun &lt;T> flow(@BuilderInference block: suspend FlowCollector&lt;T>.() -> Unit): Flow&lt;T> = SafeFlow(block)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">public fun <\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #6CB6FF\">T<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flow<\/span><span style=\"color: #ADBAC7\">(@BuilderInference block: suspend FlowCollector<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #6CB6FF\">T<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\">.() <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> Unit): Flow<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #6CB6FF\">T<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">SafeFlow<\/span><span style=\"color: #ADBAC7\">(block)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc6b0\ub9ac\uac00 flow{ &#8230; } \ube14\ub7ed\uc548\uc5d0 \ub123\ub294 \ub78c\ub2e4 \ud568\uc218\ub294 block\uc774\ub780 \uc774\ub984\uc758 FlowCollector&lt;T&gt;\uc758 \ud655\uc7a5\ud568\uc218\ub85c \ub118\uc5b4\uac00\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4. \uad6c\ud604\uccb4\ub294 SafeFlow(block)\uc774\ub2c8\uae4c \ub530\ub77c\uac00\ubcf4\uba74, <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private class SafeFlow&lt;T>(private val block: suspend FlowCollector&lt;T>.() -> Unit) : AbstractFlow&lt;T>() {\n    override suspend fun collectSafely(collector: FlowCollector&lt;T>) {\n        collector.block()\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">private <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">SafeFlow<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;(<\/span><span style=\"color: #F69D50\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">val<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">block<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F69D50\">suspend<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FlowCollector<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;.() -&gt; <\/span><span style=\"color: #F69D50\">Unit<\/span><span style=\"color: #ADBAC7\">) : <\/span><span style=\"color: #F69D50\">AbstractFlow<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> suspend fun <\/span><span style=\"color: #DCBDFB\">collectSafely<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">collector<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FlowCollector<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        collector.<\/span><span style=\"color: #DCBDFB\">block<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> AbstractFlow&lt;T&gt;\ub97c \ub530\ub77c\uac00\uc57c \uc54c \uc218 \uc788\uc744\uac70 \uac19\ub2e4. \ub610 \ub4e4\uc5b4\uac00\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public abstract class AbstractFlow&lt;T> : Flow&lt;T>, CancellableFlow&lt;T> {\n\n    public final override suspend fun collect(collector: FlowCollector&lt;T>) {\n        val safeCollector = SafeCollector(collector, coroutineContext)\n        try {\n            collectSafely(safeCollector)\n        } finally {\n...<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">public <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">AbstractFlow<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; : <\/span><span style=\"color: #F69D50\">Flow<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;, <\/span><span style=\"color: #F69D50\">CancellableFlow<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> final <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> suspend fun <\/span><span style=\"color: #DCBDFB\">collect<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">collector<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FlowCollector<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        val safeCollector <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">SafeCollector<\/span><span style=\"color: #ADBAC7\">(collector, coroutineContext)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">try<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">collectSafely<\/span><span style=\"color: #ADBAC7\">(safeCollector)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        } <\/span><span style=\"color: #F47067\">finally<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uc81c \uc880 \ubcf4\uc778\ub2e4. \uc6b0\ub9ac\uac00 Flow\uc758 collect{ &#8230; } \ub97c \ud638\ucd9c\ud574\uc8fc\uba74, \uac12\uc744 \ubc1b\uc544 \ucc98\ub9ac\ud558\ub294 Consumer \ub78c\ub2e4 \ud568\uc218\uac00 FlowCollector&lt;T&gt; \ud568\uc218\uac1d\uccb4\ub85c \ub118\uc5b4\uac04 \uac83\uc774\ub2e4. \uc774 collector\ub85c safeCollector\ub97c \ub9cc\ub4e4\uace0 \uc774\uac78 collectSafely()\uc758 \uc778\uc790\ub85c \ub118\uae34\ub2e4. <\/p>\n\n\n\n<p> \uac70\uafb8\ub85c \ub2e4\uc2dc \uac70\uc2ac\ub7ec \uc62c\ub77c\uac00\uba74, SafeFlow&lt;T&gt;\uc5d0\uc11c collectSafely()\ub97c \uc624\ubc84\ub77c\uc774\ub4dc \ud588\ub294\ub370, collector.block()\uc744 \ubd88\ub7ec\uc8fc\uace0 \uc788\ub2e4. \uc55e\uc5d0\uc11c\ub3c4 \ub9d0\ud588\uc9c0\ub9cc, block\uc740 flow \ube4c\ub354\ub85c flow\ub97c \uc815\uc758\ud560 \ub54c \uad6c\ud604\ud55c \ub78c\ub2e4 \ud568\uc218 \uc774\ub2e4. \uc774 block\uc744 collector\uc758 \ud655\uc7a5\ud568\uc218\ub85c \uc815\uc758\ub418\uc5c8\uae30 \ub54c\ubb38\uc5d0, collector.block()\uc73c\ub85c \uc2e4\ud589\uc774 \uac00\ub2a5\ud558\ub2e4. \uc989, collect()\ub97c \uc2e4\ud589\ud558\uba74, \ub370\uc774\ud130 \uc18c\uc2a4\ub97c emit\ud558\ub294 producer \ucf54\ub4dc\ub97c \uc2e4\ud589\ud558\ub294 \uac83\uc774\ub2e4. emit()\uc758 \uad6c\ud604\uae4c\uc9c0 \ucc3e\uc544\ubcf4\uba74, collector \ubcf8\uccb4\uc640 block \uc0ac\uc774\ub97c \uc624\uace0\uac00\ub294 \ub0b4\uc6a9\uae4c\uc9c0 \uc54c\uaca0\uc9c0\ub9cc, \uadf8\uac74 \uc54c\uc544\uc11c \ud574\ubcf4\ub358\uc9c0 \ud83d\ude42 <strong>\ud575\uc2ec\uc740 Flow\uc758 \uacbd\uc6b0, \ub2e8\uc21c\ud788 \ucf54\ub8e8\ud2f4 \ub0b4\uc5d0\uc11c \ud568\uc218\uc758 \ud638\ucd9c\ub85c \uad6c\ud604\ub41c \uc810\uc774\ub77c\ub294 \uac83\uc774\ub2e4<\/strong>. Channel\ucc98\ub7fc Consumer\uac00 \ub3d9\uc791\uc744 \uba48\ucdc4\uc744 \ub54c, Producer\uac00 \ub370\uc774\ud130\ub97c \uacc4\uc18d \uc0dd\uc131\ud558\uba74\uc11c \uc0b4\uc544\uc788\ub294 \uc77c\uc740 \uc788\uc744 \uc218\uac00 \uc5c6\ub2e4. \uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 Channel\uc740 &#8216;hot&#8217; stream\uc774\ub77c\uace0 \ubd80\ub974\ub4ef, Flow\ub294 collect\ub97c \uc2e4\ud589\ud560 \ub54c\ub9cc \ub3d9\uc791\ud558\ub294 &#8216;Cold&#8217; stream\uc774\ub2e4. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Context Preservation <\/h4>\n\n\n\n<p> Flow\uc758 collection\uc740 \ub2e8\uc21c\ud55c \ud568\uc218 \ud638\ucd9c\uc774\ubbc0\ub85c, \ud56d\uc0c1 \ubd80\ubaa8 \ucf54\ub8e8\ud2f4\uc758 context\ub0b4\uc5d0\uc11c \uc774\ub8e8\uc5b4\uc9c4\ub2e4. \uc774\uac78 context Preservation\uc774\ub77c \ud55c\ub2e4. \ub9cc\uc57d, \ub2e4\ub978 context\uc5d0\uc11c \uac12\uc744 emit\ud558\ub3c4\ub85d \uad6c\ud604\ud558\uace0\uc2f6\ub2e4\uba74, Flow\uac00 \ub2e8\uc21c\ud55c \ud568\uc218 \ucf5c \ud615\ud0dc\uc774\uae30 \ub54c\ubb38\uc5d0, \uc5ec\ub7ec\uac00\uc9c0\ub85c \ubcf5\uc7a1\ud55c \ubb38\uc81c\uac00 \uc0dd\uae34\ub2e4. \ud558\uc9c0\ub9cc, \uc2dc\uac04\uc774 \uac78\ub9ac\ub294 \uc791\uc5c5\uc758 \uacb0\uacfc\ubb3c\ub85c UI \uc5c5\ub370\uc774\ud2b8\ub97c \ud558\uace0\uc2f6\uc740 \ub108\ubb34\ub098\ub3c4 \ud3c9\ubc94\ud558\uace0 \ud754\ud55c \uacbd\uc6b0\uc5d0\ub3c4 context\uc758 \ubcc0\uacbd\uc740 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4. \uc774\ub97c \uc704\ud574 \uc81c\uacf5\ud558\ub294 \uac83\uc774 flowOn(Dispatcher) \uc5f0\uc0b0\uc790\uc774\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun simple(): Flow&lt;Int> = flow {\n    for (i in 1..3) {\n        Thread.sleep(100) \/\/ pretend we are computing it in CPU-consuming way\n        log(\"Emitting $i\")\n        emit(i) \/\/ emit next value\n    }\n}.flowOn(Dispatchers.Default) \/\/ RIGHT way to change context for CPU-consuming code in flow builder\n\nfun main() = runBlocking&lt;Unit> {\n    simple().collect { value ->\n        log(\"Collected $value\") \n    } \n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">fun <\/span><span style=\"color: #DCBDFB\">simple<\/span><span style=\"color: #ADBAC7\">(): Flow<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">Int<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> flow {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..3<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        Thread.<\/span><span style=\"color: #DCBDFB\">sleep<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">100<\/span><span style=\"color: #ADBAC7\">) <\/span><span style=\"color: #768390\">\/\/ pretend we are computing it in CPU-consuming way<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Emitting $i&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(i) <\/span><span style=\"color: #768390\">\/\/ emit next value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}.<\/span><span style=\"color: #DCBDFB\">flowOn<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default) <\/span><span style=\"color: #768390\">\/\/ RIGHT way to change context for CPU-consuming code in flow builder<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">fun <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> runBlocking<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">Unit<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">simple<\/span><span style=\"color: #ADBAC7\">().collect { value <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Collected $value&quot;<\/span><span style=\"color: #ADBAC7\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    } <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uacb0\uacfc\uac12\uc744 \uc0b4\ud3b4\ubcf4\uba74, <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;DefaultDispatcher-worker-1 @coroutine#2&#93; Emitting 1\n&#91;main @coroutine#1&#93; Collected 1\n&#91;DefaultDispatcher-worker-1 @coroutine#2&#93; Emitting 2\n&#91;main @coroutine#1&#93; Collected 2\n&#91;DefaultDispatcher-worker-1 @coroutine#2&#93; Emitting 3\n&#91;main @coroutine#1&#93; Collected 3<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">&#91;DefaultDispatcher<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">worker<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\"> @coroutine#<\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">&#93; Emitting <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">&#91;main @coroutine#<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">&#93; Collected <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">&#91;DefaultDispatcher<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">worker<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\"> @coroutine#<\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">&#93; Emitting <\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">&#91;main @coroutine#<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">&#93; Collected <\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">&#91;DefaultDispatcher<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">worker<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\"> @coroutine#<\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">&#93; Emitting <\/span><span style=\"color: #6CB6FF\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">&#91;main @coroutine#<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">&#93; Collected <\/span><span style=\"color: #6CB6FF\">3<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>emit\ud558\ub294 \ucf54\ub8e8\ud2f4\uacfc collect\ud558\ub294 \ucf54\ub8e8\ud2f4\uc774 \ub2e4\ub978 \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. \uc5b4\ub5bb\uac8c \uad6c\ud604\ub41c\uac74\uc9c0 \uc870\uae08 \uad81\uae08\ud558\uae34 \ud558\uc9c0\ub9cc, \uc774\ub807\uac8c \uc54c\uc544\uac08\ub824\uba74 \ud55c\ub3c4 \ub05d\ub3c4 \uc5c6\uc744\uac70 \uac19\uc544\uc11c \uc77c\ub2e8 \ub118\uc5b4\uac04\ub2e4. \ub0b4\ubd80\uc801\uc73c\ub85c \ucc44\ub110\uc744 \uc4f0\ub294\uac74\uac00 \uc2f6\uae30\ub3c4?<\/p>\n\n\n\n<p> <a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines.flow\/flow-on.html\">flowOn<\/a>\uc740 \uc911\uac04 \uc5f0\uc0b0\uc790\uc778\ub370, upstream\uc758 CoroutineContext\ub97c \ubcc0\uacbd\ud55c\ub2e4. \uc989, flowOn \uc774\uc804 \ud30c\uc774\ud504\ub77c\uc778\uc5d0 \uc801\uc6a9\ub41c\ub2e4. kotlin api \ubb38\uc11c\uc5d0 \uc608\uc81c\ucf54\ub4dc\uac00 \ub098\uc640\uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>withContext(Dispatchers.Main) {\n    val singleValue = intFlow \/\/ will be executed on IO if context wasn't specified before\n        .map { ... } \/\/ Will be executed in IO\n        .flowOn(Dispatchers.IO)\n        .filter { ... } \/\/ Will be executed in Default\n        .flowOn(Dispatchers.Default)\n        .single() \/\/ Will be executed in the Main\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">withContext<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Main) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val singleValue <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> intFlow <\/span><span style=\"color: #768390\">\/\/ will be executed on IO if context wasn&#39;t specified before<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .map { <\/span><span style=\"color: #F47067\">...<\/span><span style=\"color: #ADBAC7\"> } <\/span><span style=\"color: #768390\">\/\/ Will be executed in IO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">flowOn<\/span><span style=\"color: #ADBAC7\">(Dispatchers.<\/span><span style=\"color: #6CB6FF\">IO<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .filter { <\/span><span style=\"color: #F47067\">...<\/span><span style=\"color: #ADBAC7\"> } <\/span><span style=\"color: #768390\">\/\/ Will be executed in Default<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">flowOn<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">single<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #768390\">\/\/ Will be executed in the Main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc8fc\uc11d\uc5d0 \ub2ec\ub824\uc788\ub4ef\uc774, flowOn \uc774\uc804 \ubd80\ubd84\uc5d0\ub9cc \ud574\ub2f9 context\uac00 \uc801\uc6a9\ub418\ub294\uac78 \uc54c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Flow Builders<\/h4>\n\n\n\n<p> \uc55e\uc5d0\uc11c \uae30\ubcf8\uc801\uc778 flow builder\ub97c \ub2e4\ub918\ub294\ub370, \uc5ec\ub7ec\uac00\uc9c0 flow builder\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val myFlow = flow {...}\nval myFlow = flowOf(\"aaa\", \"bbb\", \"ccc\", \"ddd\")\nval myFlow = listOf(\"aaa\", \"bbb\", \"ccc\", \"ddd\").asFlow()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">val myFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> flow {<\/span><span style=\"color: #F47067\">...<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">val myFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;aaa&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;bbb&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;ccc&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;ddd&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">val myFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">listOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;aaa&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;bbb&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;ccc&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;ddd&quot;<\/span><span style=\"color: #ADBAC7\">).<\/span><span style=\"color: #DCBDFB\">asFlow<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ubb50, \uc694\uc815\ub3c4?<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Flow Operators<\/h4>\n\n\n\n<p> \uc55e\uc5d0\uc11c \uc7a0\uae50 \ub2e4\ub918\ub358 flowOn\uc774\ub098 collect\ub4f1\uc740 \ub2e4 \uc5f0\uc0b0\uc790(Operator)\ub4e4\uc774\ub2e4. Flow\uac00 reactive programming\uc5d0 \uae30\uc6d0\ud588\ub4ef, \uac70\uae30\uc11c \uc0ac\uc6a9\ub418\ub294 \uac01\uc885 \uc5f0\uc0b0\uc790\ub4e4\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \uc774 \uc5f0\uc0b0\uc790\ub4e4\uc740 \ud30c\uc774\ud504\ub77c\uc778\ucc98\ub7fc \uc791\ub3d9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uac00\uacf5\ud55c\ub2e4. <\/p>\n\n\n\n<p> Flow  \uc5f0\uc0b0\uc790(Operator)\uc5d0\ub294 terminal operator\uc640 intermediate operator\uac00 \uc788\ub2e4. terminal operator\ub294 \ucd5c\uc885\uc801\uc73c\ub85c \ub370\uc774\ud130\ub97c collect\ud558\ub294 \uac83\ub4e4\uc774\ub2e4. \uba3c\uc800 terminal operator\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uc790. \uc608\uc81c\ub4e4\uc740 <a href=\"https:\/\/medium.com\/@andkemal\/kotlin-flow-terminal-operators-93969202f5f3\">Kotlin Flow: Terminal Operators<\/a> \ud3ec\uc2a4\ud305\uacfc <a href=\"https:\/\/blog.canopas.com\/android-9-useful-kotlin-flow-operators-you-need-to-know-b9daef4b630f\">Android-9 Useful Kotlin Flow Operators You Need to Know<\/a> \ub4f1\uc5d0\uc11c \uac00\uc838\uc654\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>collect() : \uac00\uc7a5 \uae30\ubcf8\uc801\uc778 terminal operator<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val numbersFlow = flowOf(1, 2, 3, 4, 5)\n\nnumbersFlow.collect { number -> \n    println(\"Received number: $number\")\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">val numbersFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">numbersFlow.collect { number <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Received number: $number&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>first : collect\ud55c \ub370\uc774\ud130\uc911\uc5d0 \uc870\uac74\uc5d0 \ub9de\ub294 \uccab\ubc88\uc9f8 \uc544\uc774\ud15c\uc744 \ub3cc\ub824\uc8fc\uace0 \uba48\ucd98\ub2e4.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val numbersFlow = flowOf(1, 2, 3, 4, 5)\n\nval firstEvenNumber = numbersFlow.first { it % 2 == 0 }\nprintln(firstEvenNumber) \/\/ prints: 2<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">val numbersFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">val firstEvenNumber <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> numbersFlow.first { it <\/span><span style=\"color: #F47067\">%<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(firstEvenNumber) <\/span><span style=\"color: #768390\">\/\/ prints: 2<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>last : \ub9c8\uc9c0\ub9c9\uc73c\ub85c emit\ub41c \uac12\uc744 \ub3cc\ub824\uc900\ub2e4.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val numbersFlow = flowOf(1, 2, 3, 4, 5)\n\nprintln(numbersFlow.last())<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">val numbersFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(numbersFlow.<\/span><span style=\"color: #DCBDFB\">last<\/span><span style=\"color: #ADBAC7\">())<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>toList : collect\ud55c \ub370\uc774\ud130\ub97c \ub9ac\uc2a4\ud2b8\ub85c \ubc14\uafd4\uc900\ub2e4. <\/li>\n\n\n\n<li>toSet : collect\ud55c \ub370\uc774\ud130\ub97c \uc14b\uc73c\ub85c \ubc14\uafd4\uc900\ub2e4. <\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val numbersFlow = flowOf(1, 2, 3, 4, 5)\n\nval numbersList = numbersFlow.toList()\nprintln(numbersList) \/\/ prints: &#91;1, 2, 3, 4, 5&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">val numbersFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">val numbersList <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> numbersFlow.<\/span><span style=\"color: #DCBDFB\">toList<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(numbersList) <\/span><span style=\"color: #768390\">\/\/ prints: &#91;1, 2, 3, 4, 5&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>reduce : \ub370\uc774\ud130\ub97c \ud569\uc0b0\ud558\ub294 \ubc29\ubc95\uc744 \uc81c\uacf5\ud55c\ub2e4. <\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>flowOf(1, 2, 3)\n    .reduce { acc, value -> acc + value }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    .reduce { acc, value <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> acc <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> value }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ub78c\ub2e4 \ud568\uc218\uc758 \uc778\uc790\uac00 \ub450\uac1c\uc778\ub370, \uc55e\uc774 accumulator\ub85c \ud569\uc0b0\ub418\ub294 \uac12\uc774\uace0, value\ub294 \ub9e4\ubc88 \ub4e4\uc5b4\uc624\ub294 \ud558\ub098\uc758 \uac12\uc774\ub2e4. \uc704 \ucf54\ub4dc\uc5d0\uc11c\ub294 accumulator\uc5d0 value\ub97c \ubaa8\ub450 \ub354\ud574\uc8fc\uace0 \uc788\ub2e4. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>fold : reduce\uc640 \ub3d9\uc77c\ud558\uc9c0\ub9cc, \ucd08\uae30\uac12\uc774 \uc874\uc7ac\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val numbersFlow = flowOf(1, 2, 3, 4, 5)\n\nval sumFromTen = numbersFlow .fold(10) { total, num -> total + num }\nprintln(\"folded: $sumFromTen\")<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">val numbersFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">val sumFromTen <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> numbersFlow .<\/span><span style=\"color: #DCBDFB\">fold<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">) { total, num <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> total <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> num }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;folded: $sumFromTen&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774 \uc678\uc5d0\ub3c4 \uc5ec\ub7ec\uac00\uc9c0\uac00 \uc788\uc74c\uc744 \uc54c\uc544\ub450\uc790.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\uc774\uc81c Intermediate operator\ub4e4\uc744 \uc54c\uc544\ubcf4\uc790. \uc774\uac83\ub4e4\uc740 \ud30c\uc774\ud504\ub77c\uc778 \uccb4\uc778\ucc98\ub7fc \ub3d9\uc791\ud558\uba70, \uc704\uc5d0\uc11c \uc544\ub798(\ub610\ub294 \uc55e\uc5d0\uc11c \ub4a4)\uc758 \uc21c\uc11c\ub300\ub85c \ub370\uc774\ud130\ub97c \ubcc0\ud658\ud55c\ub2e4. collect\ub97c \ud558\ub294 \uacbd\uc6b0, \ubc18\ub300\ub85c \uc544\ub798\uc5d0\uc11c \uc704(\ub610\ub294 \ub4a4\uc5d0\uc11c \uc55e)\ub85c \ub370\uc774\ud130 collect\ub97c \uc694\uccad\ud55c\ub2e4. flowOn\uc774 \uadf8 \uc774\uc804\ub2e8\uacc4\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\ub294 \uc774\uc720\ub3c4 \uc774\ub807\uac8c \ubc18\ub300\ub85c \uc694\uccad\ud558\uae30 \ub54c\ubb38\uc774\ub2e4. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>flowOn(Dispatcher) : flow\ub97c \ud574\ub2f9 Dispatcher\ub85c \ub3d9\uc791\ud558\uac8c \ub9cc\ub4e0\ub2e4. flowOn\uc744 \ud638\ucd9c\ud55c \uc774\uc804 \ub2e8\uacc4\uc5d0 \uc601\ud5a5\uc744 \uc900\ub2e4. \uc608\uc81c\ub294 \uc55e\uc5d0\uc11c \ub098\uc654\ub358 \uac83\uacfc \ub3d9\uc77c\ud55c \uc608\uc81c.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>withContext(Dispatchers.Main) {\n    val singleValue = intFlow \/\/ will be executed on IO if context wasn't specified before\n        .map { ... } \/\/ Will be executed in IO\n        .flowOn(Dispatchers.IO)\n        .filter { ... } \/\/ Will be executed in Default\n        .flowOn(Dispatchers.Default)\n        .single() \/\/ Will be executed in the Main\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">withContext<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Main) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val singleValue <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> intFlow <\/span><span style=\"color: #768390\">\/\/ will be executed on IO if context wasn&#39;t specified before<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .map { <\/span><span style=\"color: #F47067\">...<\/span><span style=\"color: #ADBAC7\"> } <\/span><span style=\"color: #768390\">\/\/ Will be executed in IO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">flowOn<\/span><span style=\"color: #ADBAC7\">(Dispatchers.<\/span><span style=\"color: #6CB6FF\">IO<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .filter { <\/span><span style=\"color: #F47067\">...<\/span><span style=\"color: #ADBAC7\"> } <\/span><span style=\"color: #768390\">\/\/ Will be executed in Default<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">flowOn<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">single<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #768390\">\/\/ Will be executed in the Main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>map : \ub9d0 \uadf8\ub300\ub85c value\ub97c value\uc5d0 \ud574\ub2f9\ud558\ub294 \ub2e4\ub978 \uac12\uc73c\ub85c \ub9e4\ud551 \ud558\ub294 \uac83\uc774\ub2e4. \ube14\ub7ed \uc548\uc5d0\uc11c suspend \ud568\uc218\ub4e4\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>suspend fun performRequest(request: Int): String {\n    delay(1000) \/\/ imitate long-running asynchronous work\n    return \"response $request\"\n}\n\nfun main() = runBlocking&lt;Unit> {\n    (1..3).asFlow() \/\/ a flow of requests\n        .map { request -> performRequest(request) }\n        .collect { response -> println(response) }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">suspend fun <\/span><span style=\"color: #DCBDFB\">performRequest<\/span><span style=\"color: #ADBAC7\">(request: Int): String {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">delay<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1000<\/span><span style=\"color: #ADBAC7\">) <\/span><span style=\"color: #768390\">\/\/ imitate long-running asynchronous work<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;response $request&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">fun <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> runBlocking<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">Unit<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    (<\/span><span style=\"color: #6CB6FF\">1..3<\/span><span style=\"color: #ADBAC7\">).asFlow() <\/span><span style=\"color: #768390\">\/\/ a flow of requests<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .map { request <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">performRequest<\/span><span style=\"color: #ADBAC7\">(request) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .collect { response <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(response) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>filter : \uc870\uac74\uc5d0 \ub9de\uc9c0 \uc54a\ub294 \uac12\ub4e4\uc744 \uac78\ub7ec\ub0b4\uace0 \ub9de\ub294 \uac12\ub4e4\ub9cc \ub0b4\ubcf4\ub0b8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>val numbersFlow = flowOf(1, 2, 3, 4, 5, 6)\nval evenNumbersFlow = numbersFlow.filter { it % 2 == 0 }\n\nevenNumbersFlow.collect { println(it) } \/\/ Output: 2, 4, 6<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">val numbersFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">flowOf<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">6<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">val evenNumbersFlow <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> numbersFlow.filter { it <\/span><span style=\"color: #F47067\">%<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\"> }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">evenNumbersFlow.collect { <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(it) } <\/span><span style=\"color: #768390\">\/\/ Output: 2, 4, 6<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>onEach : \ub370\uc774\ud130 \uac12\ub4e4\uc5d0 \ubcc0\ud615\uc740 \ud558\uc9c0 \uc54a\uace0, \ub0b4\ubcf4\ub0b4\uae30 \uc804\uc5d0 \ucf54\ub4dc \ube14\ub7ed\uc744 \uc2e4\ud589\ud55c\ub2e4. \uc608\ub97c\ub4e4\uc5b4, \uadf8\ub0e5 \uac12\uc744 \ucc0d\uc5b4\ubcfc \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>flowOf(1, 2, 3)\n    .onEach { println(it) }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>transform : map\uc774\ub098 filter\ubcf4\ub2e4 \uc77c\ubc18\uc801\uc778 \ubcc0\ud615\uc744 \ud558\ub294 \uacbd\uc6b0 \uc0ac\uc6a9\ud558\ub294 \uc5f0\uc0b0\uc790\uc774\ub2e4. \ucf54\ub4dc \ube14\ub7ed \ub0b4\uc5d0\uc11c emit\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>(1..3).asFlow() \/\/ a flow of requests\n    .transform { request ->\n        emit(\"Making request $request\") \n        emit(performRequest(request)) \n    }\n    .collect { response -> println(response) }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1..3<\/span><span style=\"color: #ADBAC7\">).<\/span><span style=\"color: #DCBDFB\">asFlow<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #768390\">\/\/ a flow of requests<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    .transform { request <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Making request $request&quot;<\/span><span style=\"color: #ADBAC7\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">performRequest<\/span><span style=\"color: #ADBAC7\">(request)) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    .collect { response <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(response) }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>take(number) : \uc0ac\uc774\uc988\ub97c \uc81c\ud55c\ud558\ub294 \uc5f0\uc0b0\uc790\uc774\ub2e4. number \ub9cc\ud07c \ucc98\ub9ac\ud558\uba74, flow\ub97c cancel \uc2dc\ud0a8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>fun numbers(): Flow&lt;Int> = flow {\n    try {                          \n        emit(1)\n        emit(2) \n        println(\"This line will not execute\")\n        emit(3)    \n    } finally {\n        println(\"Finally in numbers\")\n    }\n}\n\nfun main() = runBlocking&lt;Unit> {\n    numbers() \n        .take(2) \/\/ take only the first two\n        .collect { value -> println(value) }\n}  <\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">fun <\/span><span style=\"color: #DCBDFB\">numbers<\/span><span style=\"color: #ADBAC7\">(): Flow<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">Int<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> flow {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">try<\/span><span style=\"color: #ADBAC7\"> {                          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;This line will not execute&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">emit<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">)    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    } <\/span><span style=\"color: #F47067\">finally<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Finally in numbers&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">fun <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> runBlocking<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">Unit<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">numbers<\/span><span style=\"color: #ADBAC7\">() <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .<\/span><span style=\"color: #DCBDFB\">take<\/span><span style=\"color: #ADBAC7\">(2) <\/span><span style=\"color: #768390\">\/\/ take only the first two<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        .collect { value <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(value) }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}  <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uac83\ub4e4\uc740 \uae30\ubcf8\uc801\uc778 \uc5f0\uc0b0\uc790\ub4e4\uc774\uace0, \uc774 \uc678\uc5d0\ub3c4 \uc5ec\ub7ec\uac00\uc9c0\uac00 \uc788\ub294\ub370, \ud558\ub098\ub85c \uc815\ub9ac\ub41c \ubb38\uc11c\ub97c \ubabb\ucc3e\uaca0\ub2e4. <a href=\"https:\/\/kotlinlang.org\/docs\/flow.html\">\uacf5\uc2dd\ubb38\uc11c<\/a>\uac00 \uadf8\ub098\ub9c8 \uac00\uc7a5 \uc798 \uc815\ub9ac\ub418\uc5b4 \uc788\ub294\uac70 \uac19\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\uc694\uc815\ub3c4\ub85c \uc815\ub9ac\ud558\uace0, \uac1c\ubcc4 \ud3ec\uc2a4\ud305\uc73c\ub85c stateFlow\uc640 sharedFlow\ub97c \ub2e4\ub904\ubcf4\uaca0\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud558\ub294\uc9c0\ub3c4 \ub2e4\ub904\uc57c\uaca0\ub124.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ucc38\uace0\uc790\ub8cc<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=tYcqn48SMT8&amp;list=PLR6tylU8G3IfQC98Yj0xvQhNZE70T0VGh\">KotlinConf 2019: Asynchronous Data Streams with Kotlin Flow<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/flow.html#flows\">Kotlin \uacf5\uc2dd \ubb38\uc11c : Asynchronous Flow<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.android.com\/kotlin\/flow\">Android Developers : Kotlin flows on Android<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.android.com\/kotlin\/flow\/stateflow-and-sharedflow\">Android Developers : StateFlow and SharedFlow<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Reactive Stream\uaddc\uaca9\uc758 Kotlin \uad6c\ud604. Asynchronouse cold stream. Asynchronouse \ud558\uac8c \ub3d9\uc791\ud558\ub294\uac8c \ucf54\ub8e8\ud2f4\uacfc \ucc30\ub5a1\uc73c\ub85c \ub3cc\uc544\uac04\ub2e4. \ub370\uc774\ud130 \uc2a4\ud2b8\ub9bc\uc774\ub77c\uace0 \ud55c\ub2e4\uba74, \ud55c\ucabd(Producer)\uc5d0\uc11c\ub294 \uc18c\uc2a4 \ub370\uc774\ud130\ub97c \uacc4\uc18d \ub123\uc5b4\uc8fc\uace0 \uc774 \ub370\uc774\ud130\ub4e4\uc774 \uc77c\ub828\uc758 \ud30c\uc774\ud504\ub77c\uc778\uc744 \ub530\ub77c \ucc98\ub9ac\ub41c \ud6c4, \ub9de\uc740\ud3b8(Consumer)\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ube7c\uac00\ub294 \ubaa8\uc2b5\uc744 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \uc8fc\ub85c \ud30c\uc77c\ucc98\ub9ac\ub4f1\uc758 \ub300\uc6a9\ub7c9 \ub370\uc774\ud130\uc758 \ucc98\ub9ac\uc5d0 \uc0ac\uc6a9\ub418\uc9c0\ub9cc, \uc774\ubbf8 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \ubc94\uc6a9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uace0 \uc788\ub4ef, \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 reactive programming \ud615\ud0dc\uc5d0\uc11c\ub294 \ub370\uc774\ud130\uc758 \ud06c\uae30\uc640 \uc0c1\uad00\uc5c6\uc774 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,34],"tags":[186,329,38,333,332,20,41,330,331],"class_list":["post-1045","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-android-2","tag-flow","tag-kotlin","tag-programming","tag-reactive","tag-android","tag-kotlin-kr","tag-330","tag-331"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1045","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=1045"}],"version-history":[{"count":40,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1045\/revisions"}],"predecessor-version":[{"id":3381,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1045\/revisions\/3381"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=1045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=1045"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=1045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}