Coroutine
์ฝํ๋ฆฐ์ ์ฝ๋ฃจํด(Coroutine)์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ฝ๋ฃจํด์ ๋์ ์๋ฆฌ๋ฅผ ๊น์ด ์๊ฒ ์ดํดํ๊ธฐ ์ํด์๋ ์ปดํ์ผ ๊ณผ์ ์์์ ๋ณํ, JVM์์์ ์คํ ๋ฐฉ์, ์คํ ํ๋ ์ ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ด์์ฒด์ ์ CPU ์์ค์์์ ์๋ ๋ฐฉ์์ ์์ธํ ์ดํด๋ณผ ํ์๊ฐ ์์ต๋๋ค.
์ฝ๋ฃจํด์ ์ปดํ์ผ ๊ณผ์ ๊ณผ CPS ๋ณํ
์ฝ๋ฃจํด์ ์ปดํ์ผ ์์ Continuation-Passing Style(CPS)๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ ํจ์์ ํธ์ถ์ ์ผ์ข ์ ์ํ ๊ธฐ๊ณ(state machine)๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋๋ค.
suspend
ํจ์์ ๋ณํ
suspend
ํจ์์ ๋ณํsuspend
ํค์๋๊ฐ ๋ถ์ ํจ์๋ ์ปดํ์ผ ์์ ์ถ๊ฐ์ ์ธ ํ๋ผ๋ฏธํฐ๋ก Continuation
๊ฐ์ฒด๋ฅผ ๋ฐ๋ ํํ๋ก ๋ณํ๋ฉ๋๋ค. ์ด Continuation
๊ฐ์ฒด๋ ์ฝ๋ฃจํด์ ํ์ฌ ์ํ๋ฅผ ์ ์งํ๊ณ ์ฌ๊ฐํ ์ ์๋๋ก ๋์์ค๋๋ค.
์์ compute
ํจ์๋ ์ปดํ์ผ ์์ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ฉ๋๋ค.
์ฌ๊ธฐ์ Any
ํ์
์ ์ฝ๋ฃจํด์ด ์ผ์ ์ค๋จ๋ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ํ ์ผ๋ฐ์ ์ธ ๋ฐํ ํ์
์
๋๋ค.
์ํ ๊ธฐ๊ณ(State Machine)๋ก์ ๋ณํ
์ฝ๋ฃจํด์ ์ผ์ ์ค๋จ ์ง์ ๋ง๋ค ์ํ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ํ ๊ธฐ๊ณ๋ก ๋ณํ๋ฉ๋๋ค.
๊ฐ suspend
์ง์ ์ ์ํ ๋ฒํธ๋ก ํ์๋๋ฉฐ, ์ฝ๋ฃจํด์ด ์ฌ๊ฐ๋ ๋ ํด๋น ์ํ๋ถํฐ ์คํ์ ์ด์ด๊ฐ๋๋ค.
์ปดํ์ผ๋ฌ๋ ์์ ์ฝ๋๋ฅผ ์ํ ๊ธฐ๊ณ๋ก ๋ณํํ์ฌ ๊ฐ suspend
ํจ์ ํธ์ถ์ ์ํ๋ก ๊ด๋ฆฌํฉ๋๋ค.
์ํ ๊ฐ์ฒด์ ์์ฑ
์ฝ๋ฃจํด์ ์คํ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๋ ๋ด๋ถ์ ์ผ๋ก ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
์ด ๊ฐ์ฒด๋ ์ง์ญ ๋ณ์, ํ์ฌ ์คํ ์์น, Continuation
๋ฑ ์ฝ๋ฃจํด์ ์คํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
Continuation ์ธํฐํ์ด์ค์ ์ฝ๋ฃจํด ์ปจํ
์คํธ
Continuation
์ธํฐํ์ด์ค๋ ์ฝ๋ฃจํด์ ์ฌ๊ฐ๋ฅผ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
context
: ์ฝ๋ฃจํด์ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ํ๋ด๋ฉฐ, ๋์คํจ์ฒ, ์ก(Job), ์ด๋ฆ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.resumeWith
: ์ฝ๋ฃจํด์ ์ฌ๊ฐํ๊ธฐ ์ํ ๋ฉ์๋๋ก, ๊ฒฐ๊ณผ ๋๋ ์์ธ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํฉ๋๋ค.
JVM์์์ ์ฝ๋ฃจํด ์คํ
์ฝ๋ฃจํด์ JVM ์์์ ์ผ๋ฐ ํจ์ ํธ์ถ๊ณผ ์ ์ฌํ๊ฒ ๋์ํ์ง๋ง, ์ผ์ ์ค๋จ ์ง์ ์์ ์คํ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ ์ถ๊ฐ์ ์ธ ๋ก์ง์ด ํฌํจ๋ฉ๋๋ค.
์คํ ํ๋ ์ ๋์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ์ ํธ์ถ ์คํ์ ์คํ ํ๋ ์์ ์์ฑํ์ง๋ง, ์ฝ๋ฃจํด์ ์ผ์ ์ค๋จ๊ณผ ์ฌ๊ฐ๋ฅผ ์ํด ์คํ ์ํ๋ฅผ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ฝ๋ฃจํด์ด ์ค๋ ๋์ ์ข ์๋์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
์ปดํ์ผ๋ฌ๋ ์ด ํจ์๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ณํํฉ๋๋ค.
์์ ์ฝ๋๋ ์ฝ๋ฃจํด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ํ ๊ธฐ๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค. label
๋ณ์๋ ํ์ฌ ์คํ ์์น๋ฅผ ๋ํ๋ด๋ฉฐ, invokeSuspend
๋ฉ์๋๋ ์ฝ๋ฃจํด์ด ์ฌ๊ฐ๋ ๋ ํธ์ถ๋ฉ๋๋ค.
์ด์์ฒด์ ์ CPU ์์ค์์์ ๋์
์ฝ๋ฃจํด์ **์ฌ์ฉ์ ๊ณต๊ฐ(user-space)**์์ ๋์ํ๋ฏ๋ก, ์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ๋ CPU์ ์ปจํ ์คํธ ์ค์์นญ์ ์ง์ ์ ์ธ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ค๋ ๋์ ์ฝ๋ฃจํด์ ์ฐจ์ด์
์ค๋ ๋: ์ด์์ฒด์ ๊ฐ ๊ด๋ฆฌํ๋ ์คํ ๋จ์๋ก, ๊ฐ ์ค๋ ๋๋ ๋ ๋ฆฝ์ ์ธ ํธ์ถ ์คํ๊ณผ ์คํ ํ๋ ์์ ๊ฐ์ง๋๋ค. ์ค๋ ๋ ๊ฐ์ ์ปจํ ์คํธ ์ค์์นญ์ ๋น์ฉ์ด ๋์ต๋๋ค.
์ฝ๋ฃจํด: ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๊ด๋ฆฌ๋๋ ๊ฒฝ๋ ์คํ ๋จ์๋ก, ์ค๋ ๋ ๋ด์์ ๋์ํฉ๋๋ค. ์ฝ๋ฃจํด ๊ฐ์ ์ปจํ ์คํธ ์ค์์นญ์ ์ํ ๊ฐ์ฒด์ ์ ํ๋ง ํ์ํ๋ฏ๋ก ์ค๋ฒํค๋๊ฐ ์ ์ต๋๋ค.
๋์คํจ์ฒ์ ์ค๋ ๋ ํ
์ฝ๋ฃจํด์ ์คํ์ CoroutineDispatcher
์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ๋์คํจ์ฒ๋ ์ฝ๋ฃจํด์ ์ด๋ ์ค๋ ๋์์ ์คํํ ์ง ๊ฒฐ์ ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ํ์ ์ฌ์ฉํฉ๋๋ค.
Dispatchers.Default
: ๊ณต์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋ ํ์ ์ฌ์ฉํฉ๋๋ค.Dispatchers.IO
: I/O ์์ ์ ์ต์ ํ๋ ์ค๋ ๋ ํ์ ์ฌ์ฉํฉ๋๋ค.Dispatchers.Main
: ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋ฉ๋๋ค.
์ฝ๋ฃจํด์ ์ผ์ ์ค๋จ๊ณผ ์ฌ๊ฐ ๊ณผ์
์ฝ๋ฃจํด์ ์ผ์ ์ค๋จ๊ณผ ์ฌ๊ฐ๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
์ผ์ ์ค๋จ ์ง์ ๋๋ฌ:
suspend
ํจ์๋ ์ผ์ ์ค๋จ ํจ์ ํธ์ถ ์ ์ฝ๋ฃจํด์ ํ์ฌ ์ํ๋ฅผ ์ ์ฅํ๊ณCOROUTINE_SUSPENDED
๋ฅผ ๋ฐํํฉ๋๋ค.์ํ ์ ์ฅ: ์ฝ๋ฃจํด์ ์ง์ญ ๋ณ์์ ์คํ ์์น ๋ฑ์ด ์ํ ๊ฐ์ฒด์ ์ ์ฅ๋ฉ๋๋ค.
์ฌ๊ฐ ์์ : ์ผ์ ์ค๋จ๋ ์์ ์ด ์๋ฃ๋๋ฉด,
Continuation.resumeWith
๋ฅผ ํตํด ์ฝ๋ฃจํด์ด ์ฌ๊ฐ๋ฉ๋๋ค.์ํ ๋ณต์: ์ ์ฅ๋ ์ํ๋ฅผ ๋ฐํ์ผ๋ก ์ฝ๋ฃจํด์ ์คํ์ด ์ด์ด์ง๋๋ค.
์ฝ๋ฃจํด์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
์ฝ๋ฃจํด์ ์ํ ๊ฐ์ฒด๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฏ๋ก, ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ์ฝ๋ฃจํด์ด ์๋ฃ๋๊ฑฐ๋ ์ทจ์๋๋ฉด ๊ด๋ จ๋ ๋ฉ๋ชจ๋ฆฌ๋ ์๋์ผ๋ก ํ์๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง
์ฝ๋ฃจํด์ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ฝ๋ฃจํด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ ์ ํ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ํนํ, ์ฝ๋ฃจํด ๋ด๋ถ์์ ์ฐธ์กฐํ๋ ์์(์: ๋คํธ์ํฌ ์ฐ๊ฒฐ, ํ์ผ ๋ฑ)์ ํ์์ ๋ฐ๋ผ ๋ช ์์ ์ผ๋ก ํด์ ํด์ผ ํฉ๋๋ค.
์ฝ๋ฃจํด๊ณผ ์คํ ํ๋ ์
์ฝ๋ฃจํด์ ์ผ์ ์ค๋จ ์ ์คํ ํ๋ ์์ ์ ์งํ์ง ์๊ณ ํ์ ์ ์ฅ๋ ์ํ ๊ฐ์ฒด๋ฅผ ํตํด ์คํ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ ์ฝ๋ฃจํด์ด ์ค๋ ๋์ ์ข ์๋์ง ์๊ณ , ๋ง์ ์์ ์ฝ๋ฃจํด์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
์ค์ ์ฝ๋ ์์: ์ํ ๊ธฐ๊ณ๋ก์ ๋ณํ
๋ค์์ suspend
ํจ์๊ฐ ์ํ ๊ธฐ๊ณ๋ก ๋ณํ๋๋ ๊ณผ์ ์ ๋ณด์ฌ์ฃผ๋ ์์์
๋๋ค.
์ปดํ์ผ๋ฌ์ ์ํด ๋ณํ๋ ์ฝ๋:
์ฌ๊ธฐ์ label
์ ํ์ฌ ์คํ ์์น๋ฅผ ๋ํ๋ด๋ฉฐ, ์ฝ๋ฃจํด์ด ์ฌ๊ฐ๋ ๋ ํด๋น ์์น๋ถํฐ ์คํ์ ์ด์ด๊ฐ๋๋ค.
์ฝ๋ฃจํด์ ์ฑ๋ฅ ์ด์
์ฝ๋ฃจํด์ ์ค๋ ๋์ ๋นํด ๋ค์๊ณผ ๊ฐ์ ์ฑ๋ฅ์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ์ค๋ ๋๋ณด๋ค ํจ์ฌ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ง์ ์ฝ๋ฃจํด์ ์์ฑํ ์ ์์ต๋๋ค.
๋น ๋ฅธ ์ปจํ ์คํธ ์ค์์นญ: ์ฝ๋ฃจํด ๊ฐ์ ์ ํ์ ํ์ ์ ์ฅ๋ ์ํ ๊ฐ์ฒด๋ง ๊ต์ฒดํ๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
๋น๋๊ธฐ ์์ ์ ๊ฐ๊ฒฐํ ํํ: ๋ณต์กํ ๋น๋๊ธฐ ๋ก์ง์ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ํํํ ์ ์์ด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ด ํฅ์๋ฉ๋๋ค.
์ฝ๋ฃจํด๊ณผ JVM ๋ฐ์ดํธ์ฝ๋
์ฝ๋ฃจํด์ด ์ปดํ์ผ๋๋ฉด JVM ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํ๋๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ๊ณผ๋ ๋ค๋ฅธ ํํ๋ฅผ ๊ฐ์ง๋๋ค. ์ฝ๋ฃจํด์ ์ผ์ ์ค๋จ ์ง์ ์ invokeSuspend
๋ฉ์๋ ๋ด์ ๋ถ๊ธฐ๋ฌธ์ผ๋ก ํํ๋๋ฉฐ, ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ณ์๋ค์ด ์ถ๊ฐ๋ฉ๋๋ค.
๋ฐ์ดํธ์ฝ๋ ๋ถ์
์ปดํ์ผ๋ ์ฝ๋ฃจํด์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ณด๋ฉด L$0
, L$1
๋ฑ์ ๋ณ์๊ฐ ๋ฑ์ฅํฉ๋๋ค. ์ด๋ ์ฝ๋ฃจํด์ ์ง์ญ ๋ณ์์ ์คํ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ํ๋์
๋๋ค.
์ฝ๋ฃจํด์ ํ๊ณ์ ๊ณ ๋ ค ์ฌํญ
๋๋ฒ๊น ์ ๋ณต์ก์ฑ: ์ฝ๋ฃจํด์ ๋น๋๊ธฐ ์คํ๊ณผ ์ํ ๊ธฐ๊ณ๋ก์ ๋ณํ์ผ๋ก ์ธํด ๋๋ฒ๊น ์ด ๋ณต์กํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ์ํ: ์ฝ๋ฃจํด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ ์ ํ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ค๋ ๋ ์ ํ ๋น์ฉ: ์ฝ๋ฃจํด์ด ๋ค๋ฅธ ๋์คํจ์ฒ๋ก ์ ํ๋๋ฉด ์ค๋ ๋ ์ค์์นญ์ด ๋ฐ์ํ์ฌ ์ค๋ฒํค๋๊ฐ ์ฆ๊ฐํ ์ ์์ต๋๋ค.
Last updated
Was this helpful?