{"id":672,"date":"2023-07-29T16:35:41","date_gmt":"2023-07-29T07:35:41","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=672"},"modified":"2025-09-07T11:44:32","modified_gmt":"2025-09-07T02:44:32","slug":"kotlin-coroutines","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2023\/07\/29\/672\/","title":{"rendered":"Kotlin: Coroutines"},"content":{"rendered":"\n<p>coroutine\uc744 \uc54c\uae30\uc704\ud574\uc120 asynchronous process\uc758 \uc5ed\uc0ac\ub97c \uac04\ub7b5\uc774 \uc54c\uc544\uc57c\ud560 \ud544\uc694\uac00 \uc788\ub2e4. async process, \uc989 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub294 \uc608\uc804\ubd80\ud130 \ud544\uc694\ud55c \uacbd\uc6b0\ub4e4\uc774 \uc788\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ub124\ud2b8\uc6cc\ud0b9, DB \uc791\uc5c5\ub4f1\uc740 \uc751\ub2f5\uc5d0 \uc2dc\uac04\uc774 \uac78\ub9ac\uae30 \ub54c\ubb38\uc5d0, \uba54\uc778\uc4f0\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud558\uac8c\ub418\uba74 \uadf8\ub3d9\uc548 \ud504\ub85c\uadf8\ub7a8\uc774 \uba48\ucd94\uac8c\ub41c\ub2e4. \uadf8\ub798\uc11c \uc4f0\ub808\ub4dc\ub97c \uc774\uc6a9\ud55c \ucc98\ub9ac\ubc29\uc2dd\uc774 \uc77c\ubc18\uc801\uc774\ub2e4.<\/p>\n\n\n\n<p> \ubb38\uc81c\ub294 \uc4f0\ub808\ub4dc\ub77c\ub294 \ub188\uc774 \ub2e4\ub8e8\uae30 \ub108\ubb34 \uae4c\ub2e4\ub86d\ub2e4\ub294\ub370 \uc788\ub2e4. \uc77c\ub2e8, \ubcc4\ub3c4\uc758 context\ub97c \uac16\uae30 \ub54c\ubb38\uc5d0, \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\ub294 \uc77c\uc740 \ubd80\ud558\uac00 \ud06c\uac8c \uac78\ub9ac\ub294 \uc77c\uc774\ub2e4. \uc4f0\ub808\ub4dc\uc758 \uc885\ub8cc\uc2dc\uc810\ub3c4 \ubb38\uc81c\ub2e4. \uc4f0\ub808\ub4dc\ub294 \uc815\ud655\ud55c \uc885\ub8cc\uc2dc\uc810\uc744 \ubcf4\uc7a5\ud574\uc8fc\uc9c0 \uc54a\ub294\ub2e4. \uc989, \uc4f0\ub808\ub4dc\ub97c \uc885\ub8cc\ud558\uace0 \ub2e4\uc2dc \uc2e4\ud589\ud558\uace0\uc790 \ud558\ub294 \uacbd\uc6b0 \uc774\uc804 \uc4f0\ub808\ub4dc\uc758 \uc885\ub8cc\ub97c \ubcf4\uc7a5\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc774 \uc81c\ud55c\ub41c\ub2e4. \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uc4f0\ub808\ub4dc \ub0b4\uc5d0\uc11c \ucf54\ub4dc\uc801\uc73c\ub85c \uad00\ub828\ub41c \ubd80\ubd84\uc744 \uad6c\ud604\ud574 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<br> \ub610\ud55c, \uba54\uc778\uc4f0\ub808\ub4dc\uc640 \uc2dc\uadf8\ub110\uc744 \uc8fc\uace0\ubc1b\uac70\ub098 \uba54\uc138\uc9c0\ub97c \uc8fc\uace0\ubc1b\uc544\uc57c \ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \uc9c1\uc811 \ub3d9\uae30\ud654 \uc624\ube0c\uc81d\ud2b8\ub97c \uc0ac\uc6a9\ud558\uc5ec \uad6c\ud604\ud558\uac70\ub098 handler\ub97c \uc774\uc6a9\ud558\uc5ec \uad00\ub828 \ub0b4\uc6a9\ub4e4\uc744 \uad6c\ud604\ud574\uc918\uc57c \ud55c\ub2e4. \uacfc\uac70\uc5d0\ub294 \uc774 \ubaa8\ub4e0\uac78 \uc9c1\uc811 \uad6c\ud604\ud574 \uc0ac\uc6a9\ud588\uc9c0\ub9cc, \uba38\ub9ac\uac00 \ubcf5\uc7a1\ud574\uc9c0\ub294\uac74 \ub2f9\uc5f0\ud558\ub2e4.<\/p>\n\n\n\n<p>\uc4f0\ub808\ub4dc\uc758 \uc0dd\uc131\uc2dc \uac78\ub9ac\ub294 \ubd80\ud558\uc640 \uba85\ud655\ud558\uc9c0 \uc54a\uc740 \uc885\ub8cc\uc2dc\uc810\uc5d0 \ub300\ud55c \uc88b\uc740 \ud574\uacb0\ucc45\uc740 Thread Pool \ubc29\uc2dd\uc774 \uc788\ub2e4. Thread Pool\uc774\ub780, \uc4f0\ub808\ub4dc\ub4e4\uc744 \ubbf8\ub9ac \ub9cc\ub4e4\uc5b4\ub193\uace0, \uc4f0\ub808\ub4dc\uac00 \ud544\uc694\ud558\uba74 \uc0dd\uc131\ud574\ub193\uc740 \uc4f0\ub808\ub4dc\ub97c \uc791\uc5c5\uc5d0 \ud560\ub2f9\ud588\ub2e4\uac00, \uc791\uc5c5\uc774 \ub05d\ub098\uba74 \ub2e4\uc2dc \ubc18\ud658\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4. Coroutine\uc5d0\uc11c\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c\ub294 Thread Pool\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p> \uc5ec\ub7ec \uc5b4\ub824\uc6c0\uc774 \uc788\uc9c0\ub9cc, \uc5b4\ub835\ub2e4\uace0 \uc4f0\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc744\uc218\ub294 \uc5c6\ub2e4. \uadfc\ubcf8\uc801\uc73c\ub85c\ub294 \uc4f0\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud560 \uc218 \ubc16\uc5d0 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uc4f0\ub808\ub4dc\ub97c \uc0ac\uc6a9\uc740 \ud558\ub418, \uc0ac\uc6a9\uc790\uac00 \uac04\ub2e8\ud558\uac8c \uc811\uadfc\ud560 \uc218 \uc788\uac8c \ub9cc\ub4dc\ub294\uac8c \ud575\uc2ec\uc774\ub2e4. \uc774\ub7f0 \ubc29\ubc95\ub4e4\uc774 \uc810\uc810 \uc9c4\ud654\ud558\uba70 \uc5ec\ub7ec\uac00\uc9c0\uac00 \ub098\uc654\ub294\ub370, \ud604\uc7ac\uae4c\uc9c0\uc758 \uac00\uc7a5 \uc9c4\ubcf4\uc801\uc778 \uad6c\ud604\uc774 Kotlin\uc758 coroutine\uc73c\ub85c \uc0dd\uac01\ub41c\ub2e4. <\/p>\n\n\n\n<p>\uc4f0\ub808\ub4dc\ubd80\ud130 \ucf54\ub8e8\ud2f4\uc774 \ub098\uc624\uae30\uae4c\uc9c0 (Thread&gt;Callback&gt;Future, Promise&gt;Coroutine) \uc9c4\ud654\uacfc\uc815\uc740 \ub2e4\uc74c \ubb38\uc11c\ub97c \ucc38\uc870:  <a href=\"https:\/\/kotlinlang.org\/docs\/async-programming.html#callbacks\">Asnychronous programming techniques<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\ucf54\ub8e8\ud2f4\uc740 \ub9e4\uc6b0 \uac00\ubcbc\uc6b4 \uc18c\ud504\ud2b8\uc6e8\uc5b4\uc801 \uc4f0\ub808\ub4dc(light weight thread)\ub77c\uace0 \ud560 \uc218 \uc788\ub2e4. \uc4f0\ub808\ub4dc\uc5d0 \uc775\uc219\ud558\ub2e4\uba74, \ucf54\ub8e8\ud2f4\uc744 \uadf8\ub0e5 \uc4f0\ub808\ub4dc\ub77c\uace0 \uc0dd\uac01\ud574 \ubc84\ub9ac\ub294 \uac83\ub3c4 \uc774\ud574\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uac83\uc774\ub2e4. \ubb3c\ub860 \ub611\uac19\uc9c0\ub294 \uc54a\uace0, \uc774\ud574\ud574\uc57c\ud560 \ub0b4\uc6a9\ub4e4\uc774 \ub354 \uc788\uc9c0\ub9cc. \uac04\ub2e8\ud55c \uc4f0\ub808\ub4dc\ubd80\ud130 \uc2dc\uc791\ud574\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 {\n\n    val thread = Thread {\n        for (i: Int in 1..100000) {\n            print(\"$i\")\n        }\n    }\n    thread.start()\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>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val thread <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Thread {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..100000<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;$i&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 style=\"color: #ADBAC7\">    thread.<\/span><span style=\"color: #DCBDFB\">start<\/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> \ub2e8\uc21c\ud558\uac8c \ub9ce\uc740 \uc218\uc758 \ubc18\ubcf5\uc744 \ud558\uba74\uc11c \uc22b\uc790\ub97c \ucc0d\ub294 \uc4f0\ub808\ub4dc\ub97c \ub78c\ub2e4 \ud615\ud0dc\ub85c \uc815\uc758\ud574 \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4. \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uace0 \uba54\uc778 \uc4f0\ub808\ub4dc\ub294 \ubc14\ub85c \uc885\ub8cc\ud558\uace0 \uc788\ub294\ub370, \uc2e4\ud589\ud574\ubcf4\uba74 100000\uae4c\uc9c0 \ub2e4 \ucc0d\uace0 \uc4f0\ub808\ub4dc\uac00 \uc885\ub8cc\ub418\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p> \uc774\uc640 \ub3d9\uc77c\ud55c \ud615\ud0dc\ub85c \ucf54\ub8e8\ud2f4\uc73c\ub85c \ub9cc\ub4e4\uc5b4\ubcf4\uba74 \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(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    launch {\n        for (i: Int in 1..100000) {\n            print(\"$i \")\n        }\n    }\n\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 style=\"color: #ADBAC7\">    launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..100000<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;$i &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\">    <\/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>\uc6b0\uc120, \uba54\uc778\ud568\uc218\uc5d0 runBlocking\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294\ub370, \uc774\ub294 \ube14\ub7ed\ub0b4\uc758 \ucf54\ub8e8\ud2f4\uc774 \uc644\ub8cc\ub420 \ub54c\uae4c\uc9c0 \ube14\ub85c\ud0b9 \uc0c1\ud0dc\ub85c \uae30\ub2e4\ub9ac\ub3c4\ub85d \ud558\ub294 \ucf54\ub8e8\ud2f4 \ube4c\ub354\uc758 \ud558\ub098\uc774\ub2e4. \uc55e\uc5d0\uc11c \uc4f0\ub808\ub4dc\ub294 \uc4f0\ub808\ub4dc\uc5d0 \ub300\ud55c \ud1b5\uc81c\uad8c\uc774 \ub530\ub85c \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ub05d\uae4c\uc9c0 \uc2e4\ud589\ub410\ub294\ub370, \ucf54\ub8e8\ud2f4\uc740 \uba54\uc778 \uc4f0\ub808\ub4dc\uac00 \uc885\ub8cc\ub418\uba74 \ub0b4\ubd80\uc758 \ucf54\ub8e8\ud2f4\ub3c4 \uc54c \uc218 \uc5c6\ub294 \uc601\ud5a5\uc744 \ubc1b\uc544 \uc885\ub8cc\ub418\uc5b4 \ubc84\ub9b0\ub2e4. \uc5ec\ub7ec\uac00\uc9c0 \ud14c\uc2a4\ud2b8\ub97c \ud574\ubd24\ub294\ub370, \uc774\ub294 \uc544\ub9c8\ub3c4 \uacc4\ud68d\ub418\uc9c0 \uc54a\uc740 \ube44\uc815\uc0c1 \uc2dc\ub098\ub9ac\uc624\ub85c \ubcf4\uc778\ub2e4. \uc774\ub7f0\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud558\uba74 \uc548\ub418\ub294\uac70\uc9c0. \ucf54\ub8e8\ud2f4\uc740 \ud544\uc218\uc801\uc73c\ub85c CoroutineScope\ub77c\uace0\ud574\uc11c \uc5b8\uc81c\uae4c\uc9c0 \uc0b4\uc544\uc788\uc5b4\uc57c \ud558\ub294\uc9c0 \uc815\ud574\uc9c4 \ub77c\uc774\ud504 \uc0ac\uc774\ud074\uc744 \uac16\ub294\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\ub294 Activity\ub97c \ub530\ub77c\uac08 \uc218\ub3c4(LifecycleScope), Viewmodel\uc758 lifecycle\uc744 \ub530\ub77c\uac08 \uc218\ub3c4(ViewmodelScope) \uc788\ub2e4. \uc4f0\ub808\ub4dc\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc9c0\ub9cc, \ubcf4\ud1b5\uc740 \ucf54\ub8e8\ud2f4\uc744 \uc0ac\uc6a9\ud558\ub294 \uc720\uc800\uac00 \uc885\ub8cc\ub410\ub294\ub370 \ucf54\ub8e8\ud2f4 \ud63c\uc790 \ub3cc\uace0 \uc788\uc744 \ud544\uc694\ub3c4 \uc5c6\uace0 \uc624\ub958\ub97c \ubc1c\uc0dd\uc2dc\ud0ac \uc218\ub3c4 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4. \uc548\ub4dc\ub85c\uc774\ub4dc\uc758 \uacbd\uc6b0, Activity\uac00 UI\uc5c5\ub370\uc774\ud2b8\ub97c \uc704\ud574 \ucf54\ub8e8\ud2f4\uc744 \uc0ac\uc6a9\ud558\ub294\ub370, Activity\uac00 \uc0ac\ub77c\uc84c\uc74c\uc5d0\ub3c4 \ucf54\ub8e8\ud2f4\uc774 UI\uc5c5\ub370\uc774\ud2b8\ub97c \uc2dc\ub3c4\ud55c\ub2e4\uba74 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud560\ud14c\ub2c8\uae4c. \uc4f0\ub808\ub4dc\ub294 \uc774\ub7f0 \ubd80\ubd84\ub4e4\u3147\ub974 \uc9c1\uc811 \uad6c\ud604\ud574\uc57c \ud558\ub294 \uc0ac\ud56d\uc774\uc9c0\ub9cc, \ucf54\ub8e8\ud2f4\uc5d0\uc11c\ub294  CoroutineScope\ub85c \ub9cc\ub4e4\uc5b4\uc838 \uc81c\uacf5\ub41c\ub2e4. \uc704 main\ud568\uc218\uc5d0\uc11c\ub294 \uba85\uc2dc\uc801\uc73c\ub85c CoroutineScope\ub97c \ud45c\uc2dc\ud55c \ubd80\ubd84\uc774 \uc548\ubcf4\uc774\ub294\ub370, \ud2b9\ubcc4\ud55c \uacbd\uc6b0\ub85c\uc11c runBlocking\uc774 \ubc14\ub85c \uc774\uc5d0 \ud574\ub2f9\ud55c\ub2e4. \uc774\ub97c \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368, main\ud568\uc218\uac00 runBlocking\ub0b4\uc758 \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub450 \uc2e4\ud589 \ud55c \ud6c4, \uc885\ub8cc\ub418\ub3c4\ub85d \ub9cc\ub4e0\ub2e4. \ucf54\ub8e8\ud2f4\uc740 \ucf54\ud2c0\ub9b0\uc774 \uc81c\uacf5\ud558\ub294 \uc5b8\uc5b4\uc801 \uae30\ub2a5\uc774\uc9c0, \uc548\ub4dc\ub85c\uc774\ub4dc \ud2b9\ud654\ub41c \uae30\ub2a5\uc774 \uc544\ub2c8\ub2e4. \ucc3e\uc544\ubcf4\uba74 \ub300\ubd80\ubd84 \uc548\ub4dc\ub85c\uc774\ub4dc \uc608\uc81c\ub9cc \uac00\ub4dd\ud55c\ub370, runBlocking\uc744 \uc0ac\uc6a9\ud558\uba74 \uac04\ub2e8\ud55c \ucf54\ud2c0\ub9b0 \uba54\uc778\ud568\uc218\uc5d0\uc11c \ucf54\ub8e8\ud2f4\ub4e4\uc758 \ud14c\uc2a4\ud2b8\uac00 \uc5bc\ub9c8\ub4e0\uc9c0 \uac00\ub2a5\ud574\uc9c4\ub2e4. \uc5ec\uae30\uc11c\ub294 \uc774\ub97c \uc774\uc6a9\ud574\uc11c \uae30\ubcf8\uc801\uc778 \ucf54\ub8e8\ud2f4\uc5d0 \ub300\ud55c \uc124\uba85\uc744 \ud558\uace0, \uc548\ub4dc\ub85c\uc774\ub4dc\ub85c \ub118\uc5b4\uac00\uc11c \ud2b9\ud654\ub41c \ub0b4\uc6a9\uc744 \ub2e4\ub8f0 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<p>\ub9d0\uc774 \uc880 \uae38\uc5b4\uc84c\ub294\ub370 \ub2e4\uc2dc \ucf54\ub4dc\ub85c \ub3cc\uc544\uac00\uc790. runBlocking\uc548\uc5d0 launch\uac00 \uc0ac\uc6a9\ub418\uace0 \uc788\ub294\ub370, \uc774\uac8c \uc77c\ubc18\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \ucf54\ub8e8\ud2f4 \ube4c\ub354\uc774\ub2e4. \uc774 \ub0b4\ubd80\uc758 \ucf54\ub4dc\ub294 \uc4f0\ub808\ub4dc\ucc98\ub7fc \ubcc4\ub3c4\ub85c \uc2e4\ud589\ub41c\ub2e4. \uc774\ub984\uc774 launch\uc778 \uc774\uc720\ub294 \ub85c\ucf13\ucc98\ub7fc \uc3d8\uace0 \uc78a\uc5b4\ubc84\ub9ac\ub294\uac83(fire and forget)\uc73c\ub85c \ubc14\ub85c \ub9ac\ud134\ub418\uae30 \ub54c\ubb38\uc774\ub2e4. \uc2e4\ud589\ud574\ubcf4\uba74, \uba54\uc778 \uc4f0\ub808\ub4dc\uac00 \uba3c\uc800 \ub05d\ub098 &#8220;end of main&#8221;\uc774 \ucd9c\ub825\ub418\uace0 \ucf54\ub8e8\ud2f4 \ucf54\ub4dc\uac00 \ucd9c\ub825\ub418\ub294 \uac78 \ubcfc \uc218 \uc788\ub2e4. \uc55e\uc5d0\uc11c \ub9d0\ud588\ub4ef, runBlocking \ub54c\ubb38\uc5d0 \ucf54\ub8e8\ud2f4\uc774 \ubaa8\ub450 \uc2e4\ud589\ub418\uace0 \ub05d\ub09c\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Dispatcher<\/h4>\n\n\n\n<p>&#8220;\ucf54\ub8e8\ud2f4\uc740 \uc4f0\ub808\ub4dc\uc640 \ub3d9\uc77c\ud558\uac8c \uc791\ub3d9\ud558\ub124?&#8221; \ub77c\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4. \uc55e\uc5d0\uc11c \ucf54\ub8e8\ud2f4\uc740 light thread\ub77c\uace0 \ub9d0\ud588\uc5c8\ub2e4\uae30 \ub54c\ubb38\uc5d0 \uac70\uc758 \ub3d9\uc77c\ud55c \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4. \ud765\ubbf8\ub85c\uc6b4\uac74 \ud558\ub098\uc758 \uc4f0\ub808\ub4dc\uc5d0\uc11c \uc5ec\ub7ec\uac1c\uc758 \ucf54\ub8e8\ud2f4\uc774 \ub3cc \uc218\ub3c4 \uc788\ub2e4\ub294 \uc810\uc774\ub2e4. \ub9c8\uce58, Unity \uac8c\uc784\uc5d4\uc9c4\uc758 coroutine\uacfc \ube44\uc2b7\ud55c \uc810\uc778\ub370, Unity\ub294 \ub2e8\uc77c \uc4f0\ub808\ub4dc\ub85c \ub3cc\uae30 \ub54c\ubb38\uc5d0, Unity\uc758 coroutine\uc744 \ub9cc\ub4e4\uc5b4\uc8fc\uba74 \uac8c\uc784 \ub8e8\ud504\uc0c1\uc5d0\uc11c \ub9e4\ubc88 \ud638\ucd9c\ud574\uc8fc\uba70 \ubcc4\ub3c4\uc758 \uc4f0\ub808\ub4dc\uac00 \ub3c4\ub294\ub4ef\ud55c \ucc29\uac01\uc744 \ubd88\ub7ec\uc77c\uc73c\ud0a8\ub2e4. <\/p>\n\n\n\n<p> \ud655\uc778\uc744 \uc704\ud574, \uc55e\uc5d0\uc11c \ub3cc\ub9b0 \ucf54\ub8e8\ud2f4\uc758 \uc4f0\ub808\ub4dc\ub97c \ucc0d\uc5b4\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    print(Thread.currentThread().name + Thread.currentThread().id + \"\\n\")\n    launch {\n        print(Thread.currentThread().name + Thread.currentThread().id + \"\\n\")\n        for (i: Int in 1..100000) {\n            print(\"$i \")\n        }\n    }\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 style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().name <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().id <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().name <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().id <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..100000<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;$i &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 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>\uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\uc77c \uac83\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(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>main1\n\nend of main\nmain1\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...<\/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\">main1<\/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>\n<span class=\"line\"><span style=\"color: #ADBAC7\">main1<\/span><\/span>\n<span class=\"line\"><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 style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">8<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">9<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">11<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">12<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">13<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">14<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">15<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ub458 \ub2e4 main1\uc774 \ucc0d\ud614\ub2e4. \uac19\uc740 \uc4f0\ub808\ub4dc\ub780 \uc598\uae30\ub2e4. &#8220;end of main&#8221;\uc774 \uba3c\uc800 \ucc0d\ud600\uc11c \ubcc4\ub3c4\uc758 \uc4f0\ub808\ub4dc\ub85c \ubcf4\uc778 \uac83 \ubfd0\uc774\ub2e4. \uc989, launch\ub97c \uc2e4\ud589\ud558\uace0 \ubc14\ub85c \ub9ac\ud134\ubc1b\uc544 &#8220;end of main&#8221;\uc744 \ucc0d\uace0, \ub2e4\uc2dc launch\ub0b4\uc758 \ucf54\ub4dc\ub97c \uc2e4\ud589\ud55c \uac83\uc774\ub2e4. \uc4f0\ub808\ub4dc\uc758 \uc774\ub984\uc744 \ucc0d\ub4ef\uc774, \ucf54\ub8e8\ud2f4\uc744 \uad6c\ubcc4\ud558\ub294 \uace0\uc720\ud55c \uac12\uc744 \ucc0d\uc5b4\ubcfc \uc218\ub3c4 \uc788\ub2e4. \ub2e4\uc74c\uc758 \ucf54\ub4dc\ub97c \uc2e4\ud589\ud574\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    print(Thread.currentThread().name + Thread.currentThread().id + \"\\n\")\n    println(\"coroutine context : ${coroutineContext&#91;Job&#93;}\" + \"\\n\")\n    launch {\n        print(Thread.currentThread().name + Thread.currentThread().id + \"\\n\")\n        println(\"coroutine context : ${coroutineContext&#91;Job&#93;}\" + \"\\n\")\n        for (i: Int in 1..100000) {\n            print(\"$i \")\n        }\n    }\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 style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().name <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().id <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">&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;coroutine context : ${coroutineContext&#91;Job&#93;}&quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().name <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> Thread.<\/span><span style=\"color: #DCBDFB\">currentThread<\/span><span style=\"color: #ADBAC7\">().id <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">&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;coroutine context : ${coroutineContext&#91;Job&#93;}&quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #F47067\">\\n<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..100000<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;$i &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 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>coroutineContext\uc5d0 \ub300\ud574\uc120 \ub4a4\uc5d0\uc11c \ub2e4\ub8f0 \uac83\uc774\ub2c8 \uc77c\ub2e8 \ub118\uc5b4\uac00\uace0, \uc2e4\ud589 \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(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>main1\ncoroutine context : BlockingCoroutine{Active}@b5b18566\n\n\nend of main\nmain1\ncoroutine context : StandaloneCoroutine{Active}@5f90063<\/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\">main1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">coroutine <\/span><span style=\"color: #F69D50\">context<\/span><span style=\"color: #ADBAC7\"> : BlockingCoroutine{Active}@b5b18566<\/span><\/span>\n<span class=\"line\"><\/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>\n<span class=\"line\"><span style=\"color: #ADBAC7\">main1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">coroutine <\/span><span style=\"color: #F69D50\">context<\/span><span style=\"color: #ADBAC7\"> : StandaloneCoroutine{Active}@5f90063<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucf54\ub8e8\ud2f4 \uc2dd\ubcc4\uc790\ub294 runBlocking\uacfc launch\uac00 \ub2e4\ub978 \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p> \ucf54\ub8e8\ud2f4\uc740 \ud558\ub098\uc758 \uc4f0\ub808\ub4dc \uc548\uc5d0\uc11c\ub3c4 \uc774\uc640\uac19\uc774 \uc5ec\ub7ec\uac1c\uac00 \uc2e4\ud589 \uac00\ub2a5\ud558\uae30 \ub54c\ubb38\uc5d0, \ucf54\ub8e8\ud2f4\uc774 \uc2e4\ud589\ub420 \uc4f0\ub808\ub4dc\ub97c \uace0\ub97c \uc218\ub3c4 \uc788\ub2e4. \ub2e4\uc74c\uacfc\uac19\uc774 launch\uc5d0 \uc778\uc790\ub85c Dispatchers.Default\ub97c \ub118\uaca8\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>...\n    launch(Dispatchers.Default) {\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\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uacb0\uacfc\ub97c \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>main1\ncoroutine context : BlockingCoroutine{Active}@d8851b26\n\n\nend of main\nDefaultDispatcher-worker-130\ncoroutine context : StandaloneCoroutine{Active}@7aa9f6c5\n\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...<\/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\">main1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">coroutine <\/span><span style=\"color: #F69D50\">context<\/span><span style=\"color: #ADBAC7\"> : BlockingCoroutine{Active}@d8851b26<\/span><\/span>\n<span class=\"line\"><\/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>\n<span class=\"line\"><span style=\"color: #ADBAC7\">DefaultDispatcher<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\">worker<\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #6CB6FF\">130<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">coroutine <\/span><span style=\"color: #F69D50\">context<\/span><span style=\"color: #ADBAC7\"> : StandaloneCoroutine{Active}@7aa9f6c5<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><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 style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">8<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">9<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">11<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">12<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">13<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">14<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">15<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">16<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">17<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">18<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">19<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">21<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc4f0\ub808\ub4dc \uc774\ub984\uc774 \ub2ec\ub77c\uc9c4\uac78 \ubcfc \uc218 \uc788\ub2e4! \uc989, launch\uc5d0 \uc778\uc790\ub85c \ucf54\ub8e8\ud2f4\uc774 \uc2e4\ud589\ub420 \uc4f0\ub808\ub4dc\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\ub2e4. \uadf8\ub7f0\ub370, Dispatchers\ub294 \uc5b4\ub514\uc11c \ub098\uc628 \uac83\uc778\uac00? \ucf54\ud2c0\ub9b0\uc5d0\uc11c \ucf54\ub8e8\ud2f4 \uc0ac\uc6a9\uc2dc, \uc4f0\ub808\ub4dc \ud480\uc744 \uc774\uc6a9\ud558\uc5ec \uae30\ubcf8\uc801\uc778 \uba87\uac1c\uc758 \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud574 \ub193\ub294\ub2e4. \uc0dd\uc131\ub418\ub294 \uc4f0\ub808\ub4dc\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Dispatchers.Main<\/strong><\/td><td>\uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\ub9cc \uc4f0\uc778\ub2e4. UI \uba54\uc778 \uc4f0\ub808\ub4dc\ub97c \uc758\ubbf8<\/td><\/tr><tr><td><strong>Dispatchers.Default<\/strong><\/td><td>\ubcc4\ub3c4\uc758 \uc4f0\ub808\ub4dc\uac00 \ud544\uc694\ud55c \ub300\ubd80\ubd84\uc758 \uac83\ub4e4\uc744 \uc704\ud55c \uc4f0\ub808\ub4dc<\/td><\/tr><tr><td><strong>Dispatchers.IO<\/strong><\/td><td>\uc785\ucd9c\ub825\uc740 \uc2dc\uac04\uc774 \ub9ce\uc774 \uac78\ub9ac\ub294\ub370, \uc774\ub97c \uc704\ud55c \uc4f0\ub808\ub4dc<\/td><\/tr><tr><td><strong>Dispatchers.Unconfined<\/strong><\/td><td>\ucf54\ub8e8\ud2f4\uc774 \uc2e4\ud589\ub418\ub294 \uc21c\uac04\ub9c8\ub2e4, \uc790\uc2e0\uc744 \ud638\ucd9c\ud55c \uc4f0\ub808\ub4dc\uc5d0\uc11c \uc2e4\ud589\ub41c\ub2e4. <br>\ub9e4\ubc88 \uc4f0\ub808\ub4dc\uac00 \ubc14\ub014 \uc218 \uc788\ub2e4\ub294 \uac83.<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Dispatchers<\/figcaption><\/figure>\n\n\n\n<p>Dispatchers\ub77c\ub294 \uc774\ub984\uc744 \uac16\ub294 \uac83\uc740, launch()\uac00 \uc2e4\ud589\ud560 \ucf54\ub4dc\ub97c \ud574\ub2f9 \uc4f0\ub808\ub4dc\ub85c dispatch(\ubcf4\ub0b4\uae30, \ubc1c\uc1a1)\ud558\uae30 \ub54c\ubb38\uc774\ub2e4. Unconfined\uac00 \uc798 \uc774\ud574\uc548\ub420 \uc218 \uc788\ub294\ub370, \ubcc4\ub85c \uc4f8\uc77c\uc740 \uc5c6\uc73c\uba70 <a href=\"https:\/\/kotlinlang.org\/docs\/coroutine-context-and-dispatchers.html#unconfined-vs-confined-dispatcher\">\uacf5\uc2dd \ubb38\uc11c\ub97c \uc0b4\ud3b4\ubcf4\uae30<\/a> \ubc14\ub780\ub2e4.<\/p>\n\n\n\n<p> \ub2f9\uc5f0\ud558\uac8c\ub3c4 \uc9c1\uc811 Custom Dispatcher\ub97c \ub9cc\ub4e4\uc5b4 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc9c0\ub9cc, \uc0ac\uc6a9\ud560 \uc77c\uc774 \ubcc4\ub85c \uc5c6\uc73c\ubbc0\ub85c \uc5ec\uae30\uc120 \uc0dd\ub7b5\ud55c\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">suspend function<\/h4>\n\n\n\n<p>  \uadf8\ub807\ub2e4\uba74, \ucf54\ub8e8\ud2f4\uc740 \uc5b4\ub5bb\uac8c \ud558\ub098\uc758 \uc4f0\ub808\ub4dc\uc5d0\uc11c\ub3c4 \ub3cc\uc544\uac00\ub294\uac78\uae4c? \uc774 \uc9c8\ubb38\uc5d0 \ub300\ud55c \ub2f5\uc740, \ucf54\ub8e8\ud2f4\uc740 \uc911\uac04\uc5d0 \uba48\ucd94\uac70\ub098(Stop) \uba48\ucd98 \ubd80\ubd84\ubd80\ud130 \ub2e4\uc2dc \uc2e4\ud589(resume)\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc774\ub2e4. \uc774\ub7f0 stop-resume\uc774 \uc790\ub3d9\uc73c\ub85c \uc774\ub8e8\uc5b4\uc9c0\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc4f0\ub808\ub4dc\uc5d0\ub3c4 \ud504\ub85c\uc138\uc2a4\ub97c \ub3c5\uc810\ud558\uc9c0 \uc54a\uae30 \uc704\ud574 \ub2e4\ub978 \uc4f0\ub808\ub4dc\uc5d0\uac8c \uc591\ubcf4\ud558\ub294 yield() \ud568\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4. \ucf54\ub8e8\ud2f4\ub3c4 \ud611\ub825\uc801\uc778 \uad00\uacc4\ub97c \ud1b5\ud574 \ud558\ub098\uc758 \uc4f0\ub808\ub4dc\ub97c \uacf5\uc720\ud558\ub294\ub370, \uc4f0\ub808\ub4dc\uc758 sleep()\uc5d0 \ud574\ub2f9\ud558\ub294 delay(), \uc4f0\ub808\ub4dc\uc758 yield() \uc5d0 \ud574\ub2f9\ud558\ub294 yield()\ub97c \uc81c\uacf5\ud55c\ub2e4. \uc774\ub4e4\uc774 \uc0ac\uc6a9\ub418\uba74, \ucf54\ub8e8\ud2f4\uc744 \uba48\ucd94\uace0 \uac19\uc740 \uc4f0\ub808\ub4dc\ub97c \uc0ac\uc6a9\ud558\ub294 \ub2e4\ub978 \ucf54\ub8e8\ud2f4\uc5d0\uac8c \uc2e4\ud589\uad8c\uc744 \ub118\uaca8\uc900\ub2e4. \ub2e4\uc74c \ucf54\ub4dc\ub97c \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    launch {\n        for (i: Int in 1..100) {\n            println(\"printName01 : $i \")\n        }\n    }\n\n    launch {\n        for (i: Int in 1..100) {\n            println(\"printName02 : $i \")\n        }\n    }\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 style=\"color: #ADBAC7\">    launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..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;printName01 : $i &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\">    launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..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;printName02 : $i &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 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>\uba54\uc778 \ud568\uc218\uc5d0\uc11c \ud558\ub098\uc758 \uba54\uc778 \uc4f0\ub808\ub4dc\ub85c \ub450\uac1c\uc758 \ucf54\ub8e8\ud2f4\uc744 \uc2e4\ud589\ud558\uace0 \uc788\ub2e4. \ucd9c\ub825\uacb0\uacfc\ub97c \uc0b4\ud3b4\ubcf4\uba74,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">end of main\nprintName01 : 1 \nprintName01 : 2 \nprintName01 : 3 \nprintName01 : 4 \n...\nprintName01 : 98 \nprintName01 : 99 \nprintName01 : 100 \nprintName02 : 1 \nprintName02 : 2 \nprintName02 : 3 \n...<\/code><\/pre>\n\n\n\n<p>\uc704\uc640 \uac19\uc774 \uccab\ubc88\uc9f8 \ucf54\ub8e8\ud2f4\uc774 \ubaa8\ub450 \uc2e4\ud589\ub418\uace0, \ub450\ubc88\uc9f8 \ucf54\ub8e8\ud2f4\uc774 \uc2e4\ud589\ub418\uc5b4 \ub05d\ub09c\ub2e4. \ubcf4\ud1b5 \uc4f0\ub808\ub4dc\ucc98\ub7fc \uc4f0\uae30\uc704\ud574 \ubcd1\ub82c \uc2e4\ud589\uc744 \uc6d0\ud55c\ub2e4\uba74 \uae30\ub300\ud55c \uacb0\uacfc\uac00 \uc544\ub2c8\ub2e4. \uc5ec\uae30\uc5d0 delay() \ub610\ub294 yield()\ub97c \uc0ac\uc6a9\ud558\uba74 \uc6d0\ud558\ub294 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \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(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    launch {\n        for (i: Int in 1..100) {\n            println(\"printName01 : $i \")\n            \/\/            delay(1)\n            yield()\n        }\n    }\n\n    launch {\n        for (i: Int in 1..100) {\n            println(\"printName02 : $i \")\n            \/\/            delay(1)\n            yield()\n        }\n    }\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 style=\"color: #ADBAC7\">    launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..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;printName01 : $i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #768390\">\/\/            delay(1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">yield<\/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\">    launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..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;printName02 : $i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #768390\">\/\/            delay(1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">yield<\/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 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>\uac12 \ud558\ub098\ub97c \ucd9c\ub825\ud558\uace0 yield()\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub294\ub370, \uc774 \uc9c0\uc810\uc5d0\uc11c \uba48\ucd94\uace0 \ub2e4\ub978 \ucf54\ub8e8\ud2f4\uc5d0\uac8c \uc2e4\ud589\uad8c\uc744 \ub118\uaca8\uc900 \ub2e4\uc74c, \ub2e4\uc2dc \uc2e4\ud589\uad8c\uc744 \ubc1b\uc744 \ub54c, \uc5ec\uae30\uc11c\ubd80\ud130 \uacc4\uc18d \uc2e4\ud589\ub41c\ub2e4. delay()\ub97c \uc368\ub3c4 \ube44\uc2b7\ud558\uc9c0\ub9cc, \uc5ec\uae30\uc5d4 \uc2dc\uac04\uc778\uc790\uac00 \ub4e4\uc5b4\uac00\ubbc0\ub85c \ub2e4\ub978 \uc2dc\uac04\uac12\uc744 \uc8fc\uba74, \ub450 \ub8e8\ud504\uc758 \uc18d\ub3c4\uac00 \ub2e4\ub978\uc18d\ub3c4\ub85c \ub3cc\uc544\uac00\ub294 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4. \ucd9c\ub825 \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(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>end of main\nprintName01 : 1 \nprintName02 : 1 \nprintName01 : 2 \nprintName02 : 2 \nprintName01 : 3 \nprintName02 : 3 \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\">end <\/span><span style=\"color: #F47067\">of<\/span><span style=\"color: #ADBAC7\"> main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/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: #F69D50\">printName02<\/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: #F69D50\">printName01<\/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: #F69D50\">printName02<\/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: #F69D50\">printName01<\/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: #F69D50\">printName02<\/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: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>yield()\ub97c \uc0ac\uc6a9\ud574\uc11c \ud558\ub098\uc529 \uc21c\uc11c\ub97c \ubc14\uafd4\uac00\uba70 \uc2e4\ud589\ub418\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p>\uc0ac\uc2e4, delay()\ub098 yield()\ub97c \ubcf4\uba74, \ud568\uc218 \uc55e\uc5d0 &#8216;suspend&#8217; modifier\uac00 \ubd99\uc5b4\uc788\ub2e4. \uc774\uac78 suspend function\uc774\ub77c \ubd80\ub974\ub294\ub370, \uc774 \ud568\uc218\ub4e4\uc744 \ucf54\ub8e8\ud2f4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uaca0\ub2e4\ub294 \ud45c\uc2dc\uc774\ub2e4. \uc2e4\uc81c\ub85c suspend \ud568\uc218\ub4e4\uc740 \ucf54\ub8e8\ud2f4 \ub610\ub294 \ub2e4\ub978 suspend \ud568\uc218 \ub0b4\uc5d0\uc11c\ub9cc \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4. \uc0ac\uc6a9\uc790\uac00 suspend\ub97c \ub9cc\ub4dc\ub294 \uacbd\uc6b0, \ucef4\ud30c\uc77c\ub7ec\uac00 \ud2b9\ubcc4\ud55c \uc791\uc5c5\uc744 \ud558\uc9c4 \uc54a\uae30 \ub54c\ubb38\uc5d0 \ud611\ub825\uc801\uc73c\ub85c stop and resume\uc774 \uac00\ub2a5\ud558\ub3c4\ub85d \ucf54\ub4dc\ub97c \uc791\uc131\ud574\uc57c \ud55c\ub2e4. \ub9c8\ucc2c\uac00\uc9c0\ub85c \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c suspend \ud568\uc218\ub85c \uc81c\uacf5\ub418\ub294 \uac83\ub4e4\uc740 stop and resume\uc774 \uc798 \uc791\ub3d9\ud560 \uac83\uc774\ub77c\ub294 \ucd94\uce21\uc744 \uac00\uc9c0\uace0 \uc0ac\uc6a9\ud558\uac8c \ub41c\ub2e4. <\/p>\n\n\n\n<p> suspend \ud568\uc218\uac00 \uc5b4\ub5bb\uac8c stop\uacfc resume\uc744 \ud560 \uc218 \uc788\ub294\uc9c0\ub294 <a href=\"https:\/\/www.youtube.com\/watch?v=YrrUCSi72E8&amp;list=PLR6tylU8G3IfQC98Yj0xvQhNZE70T0VGh\">2017\ub144 \ucf54\ud2c0\ub9b0 \ucee8\ud37c\ub7f0\uc2a4\uc758 Deep Dive into Coroutines on JVM<\/a> \uc774\ub098, <a href=\"https:\/\/www.youtube.com\/watch?v=BOHK_w09pVA&amp;list=PLR6tylU8G3IfQC98Yj0xvQhNZE70T0VGh\">Google IO 2019\uc758 Understand Kotlin Coroutines on Android<\/a> \ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4. \uc801\ub2f9\ud788 \ub0a9\ub4dd\ub9cc \ud558\uace0 \ub118\uc5b4\uac00\uace0 \uc2f6\ub2e4\uba74, Kotlin\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 Sequence\uc758 \uc0ac\uc6a9\ubc29\ubc95\uacfc \uc720\uc0ac\ud558\ub2e4\uace0 \uc0dd\uac01\ud558\uae30 \ubc14\ub780\ub2e4. <\/p>\n\n\n\n<p>\ucf54\ub8e8\ud2f4\uc774 stop and resume \uc678\uc5d0 \uac00\uc9c0\ub294 \uac00\uc7a5 \ud070 \ud2b9\uc9d5\uc911 \ud558\ub098\ub294 cancel\uc774 \uac00\ub2a5\ud558\ub2e4\ub294 \uc810\uc774\ub2e4. \uc4f0\ub808\ub4dc\uc5d0\uc11c\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uc774 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0 \uc54a\ub294\ub2e4. \uc704\uc758 \ucf54\ub4dc\ub97c \ubcc0\ud615\ud55c \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    val job01 = launch {\n        for (i: Int in 1..100) {\n            println(\"printName01 : $i \")\n            \/\/            delay(1)\n            yield()\n        }\n    }\n\n    val job02 = launch {\n        for (i: Int in 1..100) {\n            println(\"printName02 : $i \")\n            \/\/            delay(1)\n            yield()\n        }\n    }\n    println(\"\\nend of main\")\n    delay(10)\n    job01.cancel()\n    job02.cancel()\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 style=\"color: #ADBAC7\">    val job01 <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..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;printName01 : $i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #768390\">\/\/            delay(1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">yield<\/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\">    val job02 <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..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;printName02 : $i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #768390\">\/\/            delay(1)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">yield<\/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 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 style=\"color: #DCBDFB\">delay<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    job01.<\/span><span style=\"color: #DCBDFB\">cancel<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    job02.<\/span><span style=\"color: #DCBDFB\">cancel<\/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> \ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uba74, \ucf54\ub8e8\ud2f4\uc744 job01, job02\ub77c\ub294 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud588\ub2e4. \uc0c1\uc138\ud55c \ubd80\ubd84\uc740 coroutine context\uc5d0\uc11c \ub2e4\ub8e8\uaca0\uc9c0\ub9cc, \uc774\ub807\uac8c \ud568\uc73c\ub85c\uc368 \ucf54\ub8e8\ud2f4\uc744 \ucee8\ud2b8\ub864 \ud560 \uc218 \uc788\uac8c\ub41c\ub2e4. delay(10)\uc73c\ub85c \uc7a0\uc2dc \uae30\ub2e4\ub9b0 \ub2e4\uc74c, \uac01\uac01\uc758 \ucf54\ub8e8\ud2f4\uc744 cancel()\ub85c \uc911\uc9c0\uc2dc\ucf30\ub2e4. \uacb0\uacfc\ub97c \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>...\nprintName01 : 52 \nprintName02 : 52 \nprintName01 : 53 \nprintName02 : 53 \nprintName01 : 54 \n\nProcess finished with exit code 0<\/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\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">52<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName02<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">52<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">53<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName02<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">53<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">54<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Process finished <\/span><span style=\"color: #F47067\">with<\/span><span style=\"color: #ADBAC7\"> exit code <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc2e4\ud589\uc774 \ub418\ub358\uc911\uc5d0 cancel\ub418\uc11c \uc911\uc9c0\ub41c \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p> \uc0ac\uc2e4, \uc774\ub807\uac8c cancel\uc774 \uac00\ub2a5\ud55c \uc774\uc720\ub294 yield()\ub77c\ub294 suspend function\uc744 \uc0ac\uc6a9\ud588\uae30 \ub54c\ubb38\uc774\ub2e4. \ucf54\ub8e8\ud2f4\uc740 \uc790\uccb4\uc801\uc73c\ub85c cancel\uc744 \uc2dc\ud0a4\ub294 \uae30\ub2a5\uc774 \uc5c6\uace0, \ub2e8\uc9c0 Active \uc0c1\ud0dc\uc778\uc9c0, Cancel\uc0c1\ud0dc\uc778\uc9c0, \uc0c1\ud0dc\ub9cc \uc720\uc9c0\ud55c\ub2e4. yield() \ucf54\ub4dc\ub0b4\uc5d0\uc11c \uc0c1\ud0dc\ub97c \uccb4\ud06c\ud558\uace0 cancel \uc608\uc678(exception)\uc744 \ubc1c\uc0dd\uc2dc\ud0a4\ub294 \uac83\uc774\ub2e4. \uc815\ub9ac\ud558\uc790\uba74, stop and resume\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c suspend \ud568\uc218\ub97c \ub9cc\ub4e4 \ub54c, cancellation\uc774 \uac00\ub2a5\ud558\ub3c4\ub85d \ub9cc\ub4e4\uc5b4 \uc918\uc57c \ud55c\ub2e4\ub294 \uac83\uc774\ub2e4. yield()\ub97c \ube7c\uace0 \uc9c1\uc811 cancellation\uc744 \uccb4\ud06c\ud558\ub294 \ucf54\ub4dc\ub97c \ub9cc\ub4e4\uc5b4 \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    val job01 = launch(Dispatchers.Default) {\n        var i: Int = 1\n        while (currentCoroutineContext().isActive) {\n            println(\"printName01 : $i \")\n            i++\n        }\n    }\n\n    println(\"\\nend of main\")\n    delay(10)\n    job01.cancel()\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 style=\"color: #ADBAC7\">    val job01 <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> i<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/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\">        <\/span><span style=\"color: #F47067\">while<\/span><span style=\"color: #ADBAC7\"> (<\/span><span style=\"color: #DCBDFB\">currentCoroutineContext<\/span><span style=\"color: #ADBAC7\">().isActive) {<\/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;printName01 : $i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            i<\/span><span style=\"color: #F47067\">++<\/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\">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 style=\"color: #DCBDFB\">delay<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    job01.<\/span><span style=\"color: #DCBDFB\">cancel<\/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> \ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uba74, \uc6b0\uc120 \ucf54\ub8e8\ud2f4\uc744 Dispatchers.Default \uc4f0\ub808\ub4dc\ub85c \uc2e4\ud589\ud55c\ub2e4. \uac19\uc740 \uba54\uc778 \uc4f0\ub808\ub4dc\ub85c \ub3cc\ub9ac\uba74, yield()\ub098 delay()\uc5c6\uc774\ub294 \uc2e4\ud589\uad8c\uc744 \ub118\uaca8\uc8fc\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \ud14c\uc2a4\ud2b8\uac00 \ubd88\uac00\ub2a5\ud558\ub2e4. \ub2e4\uc74c\uc5d0 for\ubb38\uc744 while\ubb38\uc73c\ub85c \ubcc0\uacbd\ud588\ub2e4. \ucf54\ub8e8\ud2f4 \ub0b4\uc5d0\uc120 currentCoroutineContext()\uc5c6\uc774 isActive \ucc38\uc870\uac00 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc774\ud574\ub97c \ub3d5\uae30\uc704\ud574 \ub123\uc5b4\ubd24\ub2e4. \uc774\uc640\uac19\uc774 \ucf54\ub8e8\ud2f4\uc758 Active\uc0c1\ud0dc\ub97c \uccb4\ud06c\ud560 \uc218 \uc788\ub2e4. Active\uac00 \uc544\ub2c8\ub77c\uba74, \ubb34\ud55c\ubc18\ubcf5\uc744 \ub05d\ub0b4\uace0 \ucf54\ub8e8\ud2f4\uc740 \uc885\ub8cc\ub420 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<p> \ub610\ud558\ub098\uc758 \ubc29\ubc95\uc740 ensureActive()\ub97c \uc4f0\ub294 \uac83\uc774\ub2e4. \ub2e4\uc74c \ucf54\ub4dc\ub97c \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    val job01 = launch(Dispatchers.Default) {\n        for (i: Int in 1..10000) {\n            println(\"printName01 : $i \")\n            ensureActive()\n        }\n    }\n\n    println(\"\\nend of main\")\n    delay(1)\n    job01.cancel()\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 style=\"color: #ADBAC7\">    val job01 <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..10000<\/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;printName01 : $i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">ensureActive<\/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\">    <\/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 style=\"color: #DCBDFB\">delay<\/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\">    job01.<\/span><span style=\"color: #DCBDFB\">cancel<\/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>\ucf54\ub4dc\ub97c \ub2e4\uc2dc while\ub300\uc2e0 for\ubb38\uc744 \uc0ac\uc6a9\ud588\uace0, for\ubb38 \ub0b4\uc5d0\uc11c ensureActive()\ub97c \ud638\ucd9c\ud574\uc8fc\uace0 \uc788\ub2e4. <a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines\/ensure-active.html\">ensureActive()<\/a>\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 CancellationException \uc608\uc678\ub97c \ub358\uc838\uc8fc\ub294 \ud568\uc218\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(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> if (!isActive) {\n    throw CancellationException()\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\"> <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (<\/span><span style=\"color: #F47067\">!<\/span><span style=\"color: #ADBAC7\">isActive) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">throw<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">CancellationException<\/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>ensureActive()\uc758 \uc7a5\uc810\uc740 \uc608\uc678\ub97c \ub358\uc9c0\uae30 \ub54c\ubb38\uc5d0, \uc9c1\uc811 isActive\ub97c \uccb4\ud06c\ud558\uc9c0 \uc54a\uc544\ub3c4,  \ucf54\ub4dc \uc5b4\ub514\uc5d0\uc11c\ub4e0 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub2e4\ub294 \uc810\uc774\ub2e4. \uc774\ub97c \uc0ac\uc6a9\ud55c \ucd9c\ub825\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(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>...\nprintName01 : 2217 \nprintName01 : 2218 \nprintName01 : 2219 \n\nProcess finished with exit code 0<\/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\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">2217<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">2218<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #6CB6FF\">2219<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Process finished <\/span><span style=\"color: #F47067\">with<\/span><span style=\"color: #ADBAC7\"> exit code <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc2e4\ud589\uc911 cancellation\uc774 \uc798 \ubc1c\uc0dd\ud55c \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4. <a href=\"https:\/\/medium.com\/androiddevelopers\/cancellation-in-coroutines-aa6b90163629\">\ucf54\ub8e8\ud2f4 cancellation\uc5d0 \ub300\ud574 \ub354 \uae4a\uc740 \ub0b4\uc6a9\uc740 \ub2e4\uc74c \uae00\uc744 \ucc38\uace0<\/a>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Coroutine Context<\/h4>\n\n\n\n<p>  \ucf54\ub8e8\ud2f4\uc744 \uc2e4\ud589\ud558\ub294 <a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines\/launch.html\">launch()<\/a>\ub97c \uc0b4\ud3b4\ubcf4\uba74 \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(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 CoroutineScope.launch(\n    context: CoroutineContext = EmptyCoroutineContext, \n    start: CoroutineStart = CoroutineStart.DEFAULT, \n    block: suspend CoroutineScope.() -> Unit\n): Job<\/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 CoroutineScope.<\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    context: CoroutineContext <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> EmptyCoroutineContext, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    start: CoroutineStart <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> CoroutineStart.<\/span><span style=\"color: #6CB6FF\">DEFAULT<\/span><span style=\"color: #ADBAC7\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    block: suspend CoroutineScope.() <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> Unit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">): Job<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> \uccab\ubc88\uc9f8 \uc778\uc790\ub85c, CoroutineContext\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4. \uae30\ubcf8\uac12\uc73c\ub85c\ub294 \ube44\uc5b4\uc788\ub294 CoroutineContext\ub97c \uc0ac\uc6a9\ud558\uace0. \uc55e\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uc5ec\uae30\uc5d0\ub2e4\uac00 Dispatcher\ub97c \ub118\uaca8\uc8fc\uae30\ub3c4 \ud588\uc5c8\ub2e4. \uc774 \uc815\uccb4\ub294 \ubb34\uc5b8\uc77c\uae4c? <\/p>\n\n\n\n<p> \uac01 \ucf54\ub8e8\ud2f4\uc740 \uc5b4\ub5a4 Dispatcher\uc5d0\uc11c \uc2e4\ud589\ub418\ub294\uc9c0\ub4f1\uc758 \uace0\uc720\ud55c \uc815\ubcf4\ub4e4\uc774 \uc874\uc7ac\ud558\uace0, \ud544\uc694\ud55c\uacbd\uc6b0 \uadf8 \uc815\ubcf4\ub4e4\uc744 \uc54c \uc218 \uc788\uc5b4\uc57c \ud55c\ub2e4. \uc774\ub7ec\ud55c \ucf54\ub8e8\ud2f4 \uc694\uc18c(Element)\ub4e4\uc758 \uc9d1\ud569\uc774 Coroutine Context\uc774\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ub418\ub294 Coroutine Context\uc758 \uc694\uc18c\uc5d0\ub294 CoroutineName, CoroutineDispatcher, Job, CoroutineExceptionHandler \uc774 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines\/-coroutine-name\/\">CoroutineName <\/a>:  \uc0ac\uc6a9\uc790\uac00 \ub514\ubc84\uae45\ub4f1\uc5d0 \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \ud560\ub2f9\ud558\ub294 \ucf54\ub8e8\ud2f4 \uc774\ub984<\/li>\n\n\n\n<li><a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines\/-coroutine-dispatcher\/\">CoroutineDispatcher<\/a> : \uc5b4\ub5a4 \uc4f0\ub808\ub4dc\ub85c dispatch \ud574\uc11c \uc2e4\ud589\ud560\uc9c0 \uc815\ud558\ub294 \uac83.<\/li>\n\n\n\n<li><a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines\/-job\/\">Job <\/a>: \ucf54\ub8e8\ud2f4\uc758 \uc0c1\ud0dc\uc815\ubcf4\ub97c \ub2f4\uace0\uc788\uace0, \uc774\ub97c \ud1b5\ud574 \ucf54\ub8e8\ud2f4\uc758 cancel\uc774 \uac00\ub2a5\ud558\ub2e4.<\/li>\n\n\n\n<li><a href=\"https:\/\/kotlinlang.org\/api\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines\/-coroutine-exception-handler\/\">CoroutineExceptionHandler<\/a> : Catch\ub85c \uc7a1\uc544\ub0b4\uc9c0 \uc54a\uc740 Exception\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \ud578\ub4e4\ub7ec<\/li>\n<\/ul>\n\n\n\n<p><a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.coroutines\/-coroutine-context\/\">CoroutineContext<\/a>\uc758 \uc815\uccb4\ub294 \uc0ac\uc2e4 Key-Element\uc30d\uc744 \uc800\uc7a5\ud558\ub294 \uc778\ud130\ud398\uc774\uc2a4\uc774\ub2e4.  <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.coroutines\/-coroutine-context\/-element\/\">Element<\/a>\ub294 CoroutineContext\ub97c \uc0c1\uc18d\ubc1b\ub294 \uc778\ud130\ud398\uc774\uc2a4\uc774\uae30 \ub54c\ubb38\uc5d0, CoroutineName, CoroutineDispatcher, Job, CoroutineExceptionHandler \uac01\uac01\uc774 Element\uc774\uba74\uc11c \ubaa8\ub450 CoroutineContext\ub85c \ub2e4\ub8e8\uc9c8 \uc218\uac00 \uc788\ub2e4. \uadf8\ub798\uc11c launch()\uc5d0 CoroutineContext \uc778\uc790\uc5d0 Dispatcher\ub97c \ub118\uaca8\uc92c\ub358 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<p> \ud765\ubbf8\ub85c\uc6b4 \ubd80\ubd84\uc740 \uc778\ud130\ud398\uc774\uc2a4\uc5d0 plus, minusKey\uac00 \uc874\uc7ac\ud574\uc11c, \uac01 Element\ub4e4\uc744 \ub354\ud558\uae30 \ube7c\uae30 \uc870\ud569\uc73c\ub85c \ucd94\uac00\ud558\uace0 \ube84 \uc218\uac00 \uc788\ub2e4\ub294 \uc810\uc774\ub2e4. \uadf8\ub798\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\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>...\nval job01 = launch(Dispatchers.Default + CoroutineName(\"test coroutine\")) {\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\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">val job01 <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">CoroutineName<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;test coroutine&quot;<\/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>launch()\ub85c \uc2e4\ud589\uc2dc, job\uc740 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\uac00 \ub41c\ub2e4. \ucf54\ub8e8\ud2f4 \ub0b4\ubd80\uc5d0\uc11c Context\ub97c \uc5bb\uc5b4\uc640 \ucd9c\ub825\ud558\ub294 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc4f8 \uc218 \uc788\ub2e4. \uac01 \uc694\uc18c\ub294 Context\uc5d0 \ub9f5\ucc98\ub7fc Key-Element \uc870\ud569\uc73c\ub85c \uc800\uc7a5 \ub418\uc5b4 \uc788\uc73c\ubbc0\ub85c, Key\ub97c \uc778\ub371\uc2a4\ub85c \uc0ac\uc6a9\ud558\uc5ec \uc870\ud68c\uac00 \uac00\ub2a5\ud558\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>@OptIn(ExperimentalStdlibApi::class)\nfun main(args: Array&lt;String>): Unit = runBlocking {\n    val job01 = launch(Dispatchers.Default + CoroutineName(\"test coroutine\")) {\n        println(\"${currentCoroutineContext()&#91;Job&#93;}\")\n        println(\"${currentCoroutineContext()&#91;CoroutineName&#93;}\")\n        println(\"${currentCoroutineContext()&#91;CoroutineDispatcher&#93;}\")\n        for (i: Int in 1..10) {\n            println(\"printName01 : $i \")\n            ensureActive()\n        }\n    }\n\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\">@<\/span><span style=\"color: #DCBDFB\">OptIn<\/span><span style=\"color: #ADBAC7\">(ExperimentalStdlibApi::class)<\/span><\/span>\n<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 style=\"color: #ADBAC7\">    val job01 <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">launch<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">CoroutineName<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;test coroutine&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;${currentCoroutineContext()&#91;Job&#93;}&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;${currentCoroutineContext()&#91;CoroutineName&#93;}&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;${currentCoroutineContext()&#91;CoroutineDispatcher&#93;}&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..10<\/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;printName01 : $i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">ensureActive<\/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\">    <\/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>\ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uba74, currentCoroutineContext()\ub85c CoroutineContext\ub97c \uac00\uc838\uc624\uace0 \uc788\uc73c\uba70, map\uacfc \uac19\uc774 \ud0a4\ub97c \uc774\uc6a9\ud558\uc5ec \uac12\ub4e4\uc744 \ucd9c\ub825\ud558\uace0 \uc788\ub2e4. \ud0a4\uc911\uc5d0\uc11c CoroutineDispatcher\ub294 \uc544\uc9c1 \uc815\uc2dd\uc0ac\uc6a9 api\uac00 \uc544\ub2cc\uc9c0, @OptIn(ExperimentalStdlibApi::class \ub97c \uba54\uc778\ud568\uc218 \uc704\uc5d0 \ub2ec\uc544\uc918\uc57c \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4. \ucd9c\ub825 \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(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>end of main\nStandaloneCoroutine{Active}@4d98aafc\nCoroutineName(test coroutine)\nDispatchers.Default\nprintName01 : 1 \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\">end <\/span><span style=\"color: #F47067\">of<\/span><span style=\"color: #ADBAC7\"> main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">StandaloneCoroutine{Active}@4d98aafc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">CoroutineName<\/span><span style=\"color: #ADBAC7\">(test coroutine)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Dispatchers.Default<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">printName01<\/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: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uac01\uac01 \uc798 \ucd9c\ub825\ub418\ub294\uac78 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Coroutine Scope<\/h4>\n\n\n\n<p>CoroutineScope\ub294 \uc5b4\uca4c\uba74 \uac00\uc7a5 \uba3c\uc800 \ub2e4\ub918\uc5b4\uc57c \ud560 \ub0b4\uc6a9\uc77c \ub9cc\ud07c \uc911\uc694\ud55c\uac74\ub370, \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \ub354 \uba85\ud655\ud558\uac8c \ubcf4\uc774\ub294 \ubd80\ubd84\uc774\ub77c\uc11c \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\ub8ec\ub2e4. \ucf54\ub8e8\ud2f4\uc740 \ubb34\uc870\uac74 \ud2b9\uc815 Scope\ub97c \uac16\ub294\ub2e4. \ub2e4\ub974\uac8c \ub9d0\ud558\uba74, \ucf54\ub8e8\ud2f4\uc744 \uc0ac\uc6a9\ud558\ub294 \ub8e8\ud2f4\uc774 \uc885\ub8cc\ub418\uc11c \ub354\uc774\uc0c1 \ucf54\ub8e8\ud2f4\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\ub294\uc0c1\ud669\uc5d0 \ucf54\ub8e8\ud2f4\uc774 \ub3cc\uc544\uac00\ub294 \uc77c\uc774 \uc5c6\ub3c4\ub85d \ud574\ub1a8\ub2e4\ub294 \uac83\uc774\ub2e4. \ub3d9\uc791\uc740 \uac04\ub2e8\ud55c\ub370, \ucf54\ub8e8\ud2f4\uc758 Scope\ub97c \uc18c\uc720\ud558\ub294 \uac1d\uccb4\uac00 \uc885\ub8cc\ub418\uae30\uc804\uc5d0 \ucf54\ub8e8\ud2f4\uc758 cancel()\uc744 \ubd88\ub7ec\uc8fc\ub3c4\ub85d \ub9cc\ub4e0 \uac83\uc774\ub2e4. \ub2e4\uc74c\uc758 \uc608\uc81c\ub97c \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>class MyScopeClass {\n    val myScope = CoroutineScope(Dispatchers.Default)\n\n    fun destroy() {\n        myScope.cancel()\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: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyScopeClass<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val <\/span><span style=\"color: #F69D50\">myScope<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">CoroutineScope<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    fun <\/span><span style=\"color: #DCBDFB\">destroy<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        myScope.<\/span><span style=\"color: #DCBDFB\">cancel<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>  \uc704 \ucf54\ub4dc\ub97c \ubcf4\uba74, \ud074\ub798\uc2a4 \ub0b4\uc5d0\uc11c CoroutineScope()\ub97c \uc774\uc6a9\ud574 \uc0c8\ub85c\uc6b4 \ucee4\uc2a4\ud140 Coroutine Scope\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\uace0 \uc788\ub2e4. \uadf8\ub9ac\uace0 \ud074\ub798\uc2a4\uac00 \uc815\ub9ac\ub418\ub294 destroy()\uc5d0\uc11c cancel()\uc744 \ubd88\ub7ec\uc8fc\uc5b4 \ucf54\ub8e8\ud2f4\uc744 \uc885\ub8cc\uc2dc\ud0a8\ub2e4. cancel()\uc740 CoroutineScope\uc758 extension function\uc73c\ub85c \uc815\uc758 \ub418\uc5b4 \uc788\ub2e4. <\/p>\n\n\n\n<p>\uc704 \ucf54\ub4dc\ub97c \uc774\uc6a9\ud558\uc5ec \ud14c\uc2a4\ud2b8 \ucf54\ub4dc\ub97c \uc791\uc131\ud574\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    scopedPrintNums()\n    println(\"\\nend of main\")\n}\n\nclass MyScopeClass {\n    val myScope = CoroutineScope(Dispatchers.Default)\n\n    fun destroy() {\n        myScope.cancel()\n    }\n\n    fun printLoop() {\n        myScope.launch {\n            for (i: Int in 1..10000) {\n                println(\"$i \")\n                ensureActive()\n            }\n        }\n    }\n}\n\nsuspend fun scopedPrintNums() {\n    val scopeInstance = MyScopeClass()\n    scopeInstance.printLoop()\n    delay(10)\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\">scopedPrintNums<\/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: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyScopeClass<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val <\/span><span style=\"color: #F69D50\">myScope<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">CoroutineScope<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    fun <\/span><span style=\"color: #DCBDFB\">destroy<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        myScope.<\/span><span style=\"color: #DCBDFB\">cancel<\/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\">    fun <\/span><span style=\"color: #DCBDFB\">printLoop<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        myScope.launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (i: Int <\/span><span style=\"color: #F47067\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1..10000<\/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;$i &quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #DCBDFB\">ensureActive<\/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 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\">scopedPrintNums<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val scopeInstance <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">MyScopeClass<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    scopeInstance.<\/span><span style=\"color: #DCBDFB\">printLoop<\/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\">10<\/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>\uc704 \ucf54\ub4dc\uc758 \ud750\ub984\uc744 \uadf8\ub824\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"878\" height=\"578\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2023\/07\/scope.png\" alt=\"\" class=\"wp-image-1950\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2023\/07\/scope.png 878w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2023\/07\/scope-300x197.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2023\/07\/scope-768x506.png 768w\" sizes=\"auto, (max-width: 878px) 100vw, 878px\" \/><\/figure>\n\n\n\n<p>scopedPrintNums()\ud568\uc218\uac00 \ud638\ucd9c\ub418\uba74, MyScopeClass\uc758 \uc778\uc2a4\ud134\uc2a4\uc778 scopeInstance\uac00 \uc0dd\uc131\ub41c\ub2e4. \ucee4\uc2a4\ud140 \ucf54\ub8e8\ud2f4 \uc2a4\ucf54\ud504\uc778 myScope\ub294 scopeInstance\uc758 lifecycle\uacfc \ud568\uaed8\ud558\ub3c4\ub85d destroy()\uc5d0\uc11c cancel()\uc774 \ubd88\ub9ac\uace0 \uc788\ub2e4. printLoop()\uac00 \ubd88\ub9ac\uba74, myScope.launch\ub85c \ucf54\ub8e8\ud2f4\uc774 \uc2e4\ud589\ub418\uace0, myScope\uc5d0 \uc815\uc758\ub41c \ucf54\ub8e8\ud2f4 \ucee8\ud14d\uc2a4\ud2b8\ub300\ub85c, Dispatcher.Default\uc758 \uc4f0\ub808\ub4dc\uc5d0\uc11c for loop\uac00 \uc2e4\ud589\ub41c\ub2e4. scopedPrintNums()\ub294 delay(10)\uc73c\ub85c 10ms \ub300\uae30\ud6c4\uc5d0 \ud568\uc218\uac00 \uc885\ub8cc\ub41c\ub2e4. scopeInstance\ub294 \uc774 \ud568\uc218\ub0b4\uc5d0 \uc815\uc758\ub41c \uc778\uc2a4\ud134\uc2a4\ub85c \ud568\uaed8 \uc885\ub8cc\ub418\uace0 destroy\uac00 \ubd88\ub9ac\uba70 myScope.cancel()\uc774 \ubd88\ub9b0\ub2e4. myScope.cancel()\uc5d0 \uc758\ud574 \uc774 scope\ub85c \uc2e4\ud589\ub418\ub358 \ucf54\ub8e8\ud2f4\uc758 for loop\ub294 \uc885\ub8cc\ub41c\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Android\uc5d0\uc11c\uc758 CoroutineScope<\/h4>\n\n\n\n<p> \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc120 \uac01 \ucef4\ud3ec\ub10c\ud2b8\uac00 lifecycle\uc744 \uac16\uace0, \uc774\uc5d0 \ub530\ub978 CoroutineScope\ub97c \uc81c\uacf5\ud55c\ub2e4. \ubc14\ub85c LifecycleScope\uc640 viewModelScope\uc774\ub2e4. Activity\ub098 Fragment\ub4e4\uc740 \uac01\uac01 \uc790\uc2e0\uc758 LifeCycle\uc744 \uac16\uace0 \uc788\uc73c\uba70, \uc774\ub807\uac8c Lifecycle\uc744 \uac16\ub294 \uacbd\uc6b0 LifecycleScope\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. viewModel\uc758 \uacbd\uc6b0\ub294 Activity\ub098 Fragment\uac00 \uc885\ub8cc\ub418\ub3c4 \uc0b4\uc544\uc788\uae30 \ub54c\ubb38\uc5d0 \ubcc4\ub3c4\uc758 viewModelScope\ub97c \uac16\ub294\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>class MyViewModel: ViewModel() {\n    init {\n        viewModelScope.launch {\n            \/\/ Coroutine that will be canceled when the ViewModel is cleared.\n        }\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: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyViewModel<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F69D50\">ViewModel<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    init {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        viewModelScope.launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #768390\">\/\/ Coroutine that will be canceled when the ViewModel is cleared.<\/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 style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> ViewModel\uc5d0\uc11c\ub294 \ub2e8\uc21c\ud558\uac8c viewModelScope\ub97c \uc0ac\uc6a9\ud560 \uc218 \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>class MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        ...\n        \n        lifecycleScope.launch {  }\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: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MainActivity<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">AppCompatActivity<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> fun <\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">savedInstanceState<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #F47067\">?<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onCreate<\/span><span style=\"color: #ADBAC7\">(savedInstanceState)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        lifecycleScope.launch {  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Activity\uc5d0\uc11c\ub294 lifecycleScope\ub97c \uc0ac\uc6a9\ud558\uba74 \ub41c\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>class MyFragment: Fragment() {\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        viewLifecycleOwner.lifecycleScope.launch {\n            val params = TextViewCompat.getTextMetricsParams(textView)\n            val precomputedText = withContext(Dispatchers.Default) {\n                PrecomputedTextCompat.create(longTextContent, params)\n            }\n            TextViewCompat.setPrecomputedText(textView, precomputedText)\n        }\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: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyFragment<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F69D50\">Fragment<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> fun <\/span><span style=\"color: #DCBDFB\">onViewCreated<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">view<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">savedInstanceState<\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #F47067\">?<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onViewCreated<\/span><span style=\"color: #ADBAC7\">(view, savedInstanceState)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        viewLifecycleOwner.lifecycleScope.launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            val params <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> TextViewCompat.<\/span><span style=\"color: #DCBDFB\">getTextMetricsParams<\/span><span style=\"color: #ADBAC7\">(textView)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            val precomputedText <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">withContext<\/span><span style=\"color: #ADBAC7\">(Dispatchers.Default) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                PrecomputedTextCompat.<\/span><span style=\"color: #DCBDFB\">create<\/span><span style=\"color: #ADBAC7\">(longTextContent, params)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            TextViewCompat.<\/span><span style=\"color: #DCBDFB\">setPrecomputedText<\/span><span style=\"color: #ADBAC7\">(textView, precomputedText)<\/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 style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Fragment \uc5d0\uc11c\ub294 viewLifecycleOwner.lifecycleScope\ub97c \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4. Framgnet root \ubdf0\uc758 Lifecycle owner\ub85c\ubd80\ud130 lifecycleScope\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83.<\/p>\n\n\n\n<p> \uc2e4\uc81c\ub85c \uc0ac\uc6a9\ud558\ub2e4\ubcf4\uba74, Activity\ub098 Fragment\uac00 \uc0ac\uc6a9\uc911\uc5d0\ub9cc \ucf54\ub8e8\ud2f4\uc744 \ub3cc\ub9ac\uace0 \uc2f6\uc744 \uac83\uc774\ub2e4. UI \ub370\uc774\ud130\ub97c \ucf54\ub8e8\ud2f4\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8 \ud558\ub294\ub370, Activity\uac00 \ubcf4\uc5ec\uc9c0\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc624\ubc84\ud5e4\ub4dc\uc77c \ubfd0\uc774\ub2c8\uae4c. start()\/stop()\uc5d0\uc11c \uc0ac\uc6a9\uc790\uac00 \uc9c1\uc811 \ucf54\ub8e8\ud2f4\uc744 \uc2e4\ud589\ud558\uace0 cancel()\ud558\ub294\uac78 \ub123\uc5b4\uc904 \uc218 \uc788\uc9c0\ub9cc, LifecycleOwner\uc758 repeatOnLifecycle()\uc744 \uc774\uc6a9\ud558\uba74 \ub2e8\uc21c\ud558\uac8c \uad6c\ud604 \uac00\ub2a5\ud558\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>viewLifecycleOwner.lifecycleScope.launch {\n    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {\n        \/\/ Because collect is a suspend function, if you want to\n        \/\/ collect multiple flows in parallel, you need to do so in\n        \/\/ different coroutines.\n        launch {\n            flow1.collect { \/* Process the value. *\/ }\n        }\n\n        launch {\n            flow2.collect { \/* Process the value. *\/ }\n        }\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\">viewLifecycleOwner.lifecycleScope.launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    viewLifecycleOwner.<\/span><span style=\"color: #DCBDFB\">repeatOnLifecycle<\/span><span style=\"color: #ADBAC7\">(Lifecycle.State.<\/span><span style=\"color: #6CB6FF\">STARTED<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ Because collect is a suspend function, if you want to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ collect multiple flows in parallel, you need to do so in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/ different coroutines.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            flow1.collect { <\/span><span style=\"color: #768390\">\/* Process the value. *\/<\/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\">        launch {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            flow2.collect { <\/span><span style=\"color: #768390\">\/* Process the value. *\/<\/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 style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucf54\ub4dc\ub97c \ubcf4\uba74, repeatOnLifecycle()\uc5d0 \uc778\uc790\ub85c STARTED\ub97c \ub118\uaca8\uc8fc\uace0 \uc788\ub2e4. \uc774\ub807\uac8c \ud574\uc8fc\uba74, STARTED\uc640 \uc30d\uc744 \ub9fa\ub294 STOPPED \uc0c1\ud0dc\uac00 \ub418\uba74 \uc791\ub3d9\uc744 \uba48\ucd94\uace0, \ub2e4\uc2dc STARTED\uac00 \ub418\uba74 \uc2e4\ud589\ub41c\ub2e4. \uc8fc\uc758\ud560 \uc810\uc740, repeatOnLifecycle()\uc774 suspend \ud568\uc218\uc774\ubbc0\ub85c, \ucf54\ub8e8\ud2f4 \uc548\uc5d0\uc11c \uc2e4\ud589\ud574\uc57c \ud55c\ub2e4\ub294 \uc810\uc774\ub2e4. \uc704 \ucf54\ub4dc\uc5d0\uc11c\ub3c4 \ucf54\ub8e8\ud2f4\uc744 \ub9cc\ub4e4\uace0 \uadf8 \uc548\uc5d0\uc11c \ubd88\ub7ec\uc8fc\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Callback\uacfc Coroutine<\/h4>\n\n\n\n<p> \ucf54\ub8e8\ud2f4 \uc790\ub8cc\ub97c \ucc3e\uc544\ubcf4\uba74, \ub2e4\ub4e4 callback\ud615\ud0dc\uc758 \ubb38\uc81c\uc810\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud55c \ub300\uccb4 \ubc29\uc548\uc73c\ub85c \ub098\uc628\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uc4f0\ub808\ub4dc\ub97c \ub300\uccb4\ud558\ub294 \uad00\uc810\uc73c\ub85c \uc811\uadfc\ud588\ub294\ub370, \ub098\uc5d0\uac8c\ub294 \uc774\ub7f0\ubc29\uc2dd\uc774 \uc774\ud574\uac00 \ub354 \uc26c\uc6e0\uae30 \ub54c\ubb38\uc774\ub2e4. callback\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 long time job\uc774 \ud544\uc694\ud55c \uacbd\uc6b0, \uc608\ub97c\ub4e4\uba74 \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc811\uc18d\ud558\uae30\uc704\ud574 \ub300\uae30\ud558\uac70\ub098, DB\uc5d0 \uc4f0\ub294\uc791\uc5c5\ub4f1\uc5d0 \uc0ac\uc6a9\ud558\uac8c \ub41c\ub2e4. \ub124\ud2b8\uc6cc\ud06c \uc791\uc5c5\uc744 \ud558\ub824\uba74, \uc77c\ub2e8 \uc5f0\uacb0\uc774 \uc644\ub8cc \ub418\uc5b4\uc57c \uac00\ub2a5\ud558\ub2c8\uae4c, \uc5f0\uacb0\ub41c \ub4a4\uc5d0 \uc218\ud589\ud560 \ucf54\ub4dc\ub97c callback\uc73c\ub85c \ub118\uaca8\uc8fc\ub294 \ubc29\uc2dd\uc774\ub2e4. <\/p>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=BOHK_w09pVA\">Google I\/O 2019\uc758 Understand Kotlin Coroutines on Android \uc138\uc158<\/a> \uc608\uc81c\ub85c \uc608\ub97c\ub4e4\uc5b4\ubcf4\uc790. \ub124\ud2b8\uc6cc\ud06c\ub85c \uc720\uc800\uc815\ubcf4\ub97c \uac00\uc838\uc640 \ucd9c\ub825\ud558\ub294 \uacbd\uc6b0, \ucf5c\ubc31 \uc2a4\ud0c0\uc77c\uc740 \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(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 loadUser() {\n    api.fetchUser { user ->\n        show(user)\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\">loadUser<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    api.fetchUser { user <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">show<\/span><span style=\"color: #ADBAC7\">(user)<\/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> fetchUser()\uac00 \ubcc4\ub3c4\uc758 \uc4f0\ub808\ub4dc\ub85c \ub3cc\uba74\uc11c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uba74, \ub118\uaca8\uc900 \ub78c\ub2e4 \ud568\uc218 \ud615\ud0dc\uc758 \ucf5c\ubc31\uc5d0\uc11c show(user)\uac00 UI \uc4f0\ub808\ub4dc\uc5d0\uc11c \uc791\uc5c5\uc744 \uc2e4\ud589\ud55c\ub2e4. ( \ucf5c\ubc31\uc744 \ubd88\ub7ec\uc8fc\ub294\uac74 \uc4f0\ub808\ub4dc\uae30 \ub54c\ubb38\uc5d0, show(user) \ub3c4 \uc4f0\ub808\ub4dc\uc5d0\uc11c \uc2e4\ud589\ub41c\ub2e4. UI \uba54\uc778\uc4f0\ub808\ub4dc\ub85c \uc791\uc5c5\ud558\uae30 \uc704\ud574\uc120 show()\ub0b4\uc5d0\uc11c handler\ub4f1\uc744 \uc774\uc6a9\ud574\uc57c \ud55c\ub2e4.)<\/p>\n\n\n\n<p> \ucf54\ub8e8\ud2f4 \ubc29\uc2dd\uc744 \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>suspend fun loadUser() {\n    val user = api.fetchUser()\n    show(user)\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\">loadUser<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    val user <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> api.<\/span><span style=\"color: #DCBDFB\">fetchUser<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">show<\/span><span style=\"color: #ADBAC7\">(user)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> \uc77c\ub2e8, \ube14\ub7ed\ud0b9 \ubc29\uc2dd\uc758 \ucf54\ub4dc\uc640 \ub3d9\uc77c\ud574\uc11c \uc0ac\uc6a9\ud558\uae30 \ud3b8\ud574\uc84c\ub2e4. \uc2e4\uc81c\ub85c \ucf5c\ubc31\uc774 \uc5ec\ub7ec\uac1c \uc0ac\uc6a9\ub418\ub294 \uacbd\uc6b0, \ubb34\uc218\ud55c \ub4e4\uc5ec\uc4f0\uae30\ub97c \ub3d9\ubc18\ud55c \ucd5c\uc545\uc758 \ud615\ud0dc\ub97c \ubcf4\uc5ec\uc8fc\ub294\ub370, \uc774\ub97c callback hell\uc774\ub77c\uace0 \ud55c\ub2e4. \ucf54\ub8e8\ud2f4 \ud615\ud0dc\ub294 \uc774\ub97c \ud53c\ud560 \uc218 \uc788\ub2e4. \ub610\ud55c, \uc608\uc678\ucc98\ub9ac\ub3c4 \ube14\ub7ed\ud0b9 \ucf54\ub4dc\uc640 \ub3d9\uc77c\ud558\uac8c \ucc98\ub9ac\ud574\uc11c \ucf5c\ubc31 \ud615\ud0dc\ubcf4\ub2e4 \uc9c4\uc77c\ubcf4\ub41c \ubaa8\uc2b5\uc744 \ubcf4\uc5ec\uc900\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub9c8\ubb34\ub9ac \uc815\ub9ac<\/h3>\n\n\n\n<p> \ucf54\ub8e8\ud2f4\uc744 \ubaa8\ub450 \ub2e4\ub8e8\ub824\ub2c8, \ub108\ubb34 \ub0b4\uc6a9\uc774 \ub9ce\uc544\uc9c4\ub2e4. launch\uc640 \ub2e4\ub978 async \ub3c4 \uc788\uace0, Dispatcher\ub97c \uc190\uc27d\uac8c \ubc14\uafd4 \uc0ac\uc6a9\ud558\ub294 withContext\ub3c4 \uc788\uace0, \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub824\uba74 livedata\uc640 \uc5f0\uacc4\ud558\ub294 \ubc29\ubc95\uc774\ub098 Flow\ub97c \ub610 \uc54c\uc544\uc57c \ud558\uaca0\uace0&#8230; \uc77c\ub2e8, \ub0b4\uac8c \ud544\uc694\ud55c \ub0b4\uc6a9\ub9cc \uc815\ub9ac\ud574\uc11c \uc5ec\uae30\uc11c \ub9c8\ubb34\ub9ac \uc9d3\uaca0\ub2e4. <\/p>\n\n\n\n<p> \ucf54\ub8e8\ud2f4\uc740 \ud504\ub85c\uadf8\ub798\ubc0d\uc758 \uc0c8\ub85c\uc6b4 \ud328\ub7ec\ub2e4\uc784\uc5d0 \uac00\uae4c\uc6b4 \uba4b\uc9c4 \ub140\uc11d\uc774\ub77c \uc0dd\uac01\ud558\ub294\ub370, \uc18c\uac1c\ub41c\uac8c 2017\ub144 \uc601\uc0c1\uc778\uac70 \ubcf4\uba74 \ubc8c\uc368 \uc131\uc219\ud55c \ubd80\ubd84\uc774\uae30\ub3c4 \ud558\ub2e4. JAVA\uc5d0\uc11c\ub3c4 \uc720\uc0ac\ud55c \uad6c\ud604\uc774 \ub098\uc62c\uc815\ub3c4\ub2c8\uae4c. \ub098\uc57c \uaca8\uc6b0\uaca8\uc6b0 \uc548\ub4dc\ub85c\uc774\ub4dc \uac1c\ubc1c\ub9cc \ub4a4\ub2a6\uac8c \ub530\ub77c\uac00\uace0 \uc788\uae34\ud55c\ub370, \uc804\uccb4\uc801\uc73c\ub85c \ud328\ub7ec\ub2e4\uc784\uc774 \uac1d\uccb4\uc9c0\ud5a5\uc5d0\uc11c \ub370\uc774\ud130\uc758 \ud750\ub984\uc911\uc2ec\uc758 Reactive \ubc29\uc2dd\uc73c\ub85c \ubcc0\ud654\ud55c\ub2e4\uace0 \ub290\ub080\ub2e4. \ub9de\ub294 \ud45c\ud604\uc778\uc9c0 \ubaa8\ub974\uaca0\uc9c0\ub9cc \u314b\u314b \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc38\uace0\ud560\ub9cc\ud55c \uc790\ub8cc\ub97c \uba87\uac1c \ub4dc\ub86d\ud558\uba74\uc11c \ub05d\ub0b8\ub2e4.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kotlin\uc758 coroutine\uc740 <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/coroutines\/coroutines-guide.html\">\uacf5\uc2dd\ubb38\uc11c\ub97c \ucc38\uc870<\/a>. <\/li>\n\n\n\n<li><a href=\"https:\/\/developer.android.com\/kotlin\/coroutines\">\uc548\ub4dc\ub85c\uc774\ub4dc\uc758 \ucf54\ub8e8\ud2f4 \uac00\uc774\ub4dc <\/a><\/li>\n\n\n\n<li>coroutine \ub0b4\ubd80\uad6c\ud604\uc5d0 \ub300\ud55c \ucf54\uba58\ud2b8\ub294 <a href=\"https:\/\/stackoverflow.com\/questions\/53526556\/how-do-kotlin-coroutines-work-internally\">\uc2a4\ud0dd\uc624\ubc84\ud50c\ub85c\uc6b0<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=XEgibiHdJtQ\">\uc124\uba85 \uc601\uc0c1\uc740 MCE 2017 \uc601\uc0c1 \ucc38\uc870<\/a>. <\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>coroutine\uc744 \uc54c\uae30\uc704\ud574\uc120 asynchronous process\uc758 \uc5ed\uc0ac\ub97c \uac04\ub7b5\uc774 \uc54c\uc544\uc57c\ud560 \ud544\uc694\uac00 \uc788\ub2e4. async process, \uc989 \ube44\ub3d9\uae30 \ucc98\ub9ac\ub294 \uc608\uc804\ubd80\ud130 \ud544\uc694\ud55c \uacbd\uc6b0\ub4e4\uc774 \uc788\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ub124\ud2b8\uc6cc\ud0b9, DB \uc791\uc5c5\ub4f1\uc740 \uc751\ub2f5\uc5d0 \uc2dc\uac04\uc774 \uac78\ub9ac\uae30 \ub54c\ubb38\uc5d0, \uba54\uc778\uc4f0\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud558\uac8c\ub418\uba74 \uadf8\ub3d9\uc548 \ud504\ub85c\uadf8\ub7a8\uc774 \uba48\ucd94\uac8c\ub41c\ub2e4. \uadf8\ub798\uc11c \uc4f0\ub808\ub4dc\ub97c \uc774\uc6a9\ud55c \ucc98\ub9ac\ubc29\uc2dd\uc774 \uc77c\ubc18\uc801\uc774\ub2e4. \ubb38\uc81c\ub294 \uc4f0\ub808\ub4dc\ub77c\ub294 \ub188\uc774 \ub2e4\ub8e8\uae30 \ub108\ubb34 \uae4c\ub2e4\ub86d\ub2e4\ub294\ub370 \uc788\ub2e4. \uc77c\ub2e8, \ubcc4\ub3c4\uc758 context\ub97c \uac16\uae30 \ub54c\ubb38\uc5d0, \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\ub294 \uc77c\uc740 \ubd80\ud558\uac00 \ud06c\uac8c \uac78\ub9ac\ub294 [&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,25,38,328,327,20,326,41],"class_list":["post-672","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-android-2","tag-coroutine","tag-kotlin","tag-thread","tag-327","tag-android","tag-326","tag-kotlin-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/672","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=672"}],"version-history":[{"count":46,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/672\/revisions"}],"predecessor-version":[{"id":3383,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/672\/revisions\/3383"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=672"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}