λ³Έ κ²μκΈμ #1 ~ #3μ λκΈ°μ± λ° λΉλκΈ°μ±μ μ€λͺ
νκΈ° μν΄μ μ€λ λμ κ°λ
μ λν΄ κ³ μμ μ΄κ³ λ
Όλ¦¬μ μΈ λΉμ½μ μ¬μ©νλ€. μ΄ κΈμ 보λ λΆμ κΌ #4μ μ£Όμν μ κΉμ§ λ΄μ£Όμ
μΌ νλ€.
#1 λκΈ° μ½λ vs λΉλκΈ° μ½λ
#1-1 ꡬλΆνκΈ°
μ½λ£¨ν΄μ μ λλ‘ μ¬μ©νκΈ° μν΄μ λ¨Όμ , 'λκΈ° μ½λ'μ 'λΉλκΈ° μ½λ(= μ½λ£¨ν΄ μ½λ)'λ₯Ό λͺ
ννκ² κ΅¬λΆν μ€ μμμΌ νλ€. λμ ꡬλΆνλ κΈ°μ€μ μ½κ² λ§νμλ©΄ μμ
μ΄ μμ°¨μ μΌλ‘ μ€νλλ μ§μ μ¬λΆλ€. μμ°¨μ μ΄λΌλ κ²μ, μ΄μ μμ
μ΄ μλ£λ λκΉμ§ λ€μ μμ
μ΄ μ€νλμ§ μμμ μλ―Ένλ€. λΉλκΈ° μ½λλ λκΈ° μ½λκ° μλ μ½λλ€.
#1-2 λΉλκΈ° μ½λμ μμ
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
suspend fun main() {
println("Start")
val myJob = CoroutineScope(Dispatchers.IO).launch {
println("Coroutine code start")
delay(2000)
println("Coroutine code end")
}
var meaninglessNumber = 0
for (i in 1..100000000) {
meaninglessNumber += i
}
println("End")
myJob.join()
}
/* μΆλ ₯ κ²°κ³Ό
Start
Coroutine code start
End
Coroutine code end
*/μ μ½λμ 'λΉλκΈ° μ½λ'κ° μ‘΄μ¬ν¨μ λΆλͺ
νλ€. μ½λκ° μ¨μ§ μμμ μΆλ ₯ κ²°κ³Όκ° λΉλ‘νμ§ μκΈ° λλ¬Έμ΄λ€. μ¦, μμ°¨μ μ΄μ§ μκΈ° λλ¬Έμ΄λ€.
#2 μ€λ λμ λ³λ ¬ ꡬ쑰
#2-1 νμ°μ λΉ(ι)μμ°¨μ±

μ΄ μμ λμλμμ, μλ μ€λ λμ μλ A + B μΆλ ₯μ λΆκ°λ₯νλ€. ν΄λΉ μμ μμ Aμ κΈ΄ μμ
μκ° λλ¬Έμ κ·Έ κ°μ΄ λμ§ λͺ¨λ₯΄κΈ° λλ¬Έμ΄λ€. μ΄μ κ°μ΄ λ³λ ¬ ꡬ쑰λ₯Ό ꡬμ±νλ©΄, μμ°¨κ° λ μ λ°μ μλ€. λ¬Όλ‘ λ§λ²μ²λΌ λͺ¨λ νμ΄λ°μ΄ λ±λ± λ§μ λ¨μ΄μ§ μλ μκ² μ§λ§, 그건 λμ 100κ°λ₯Ό λμ Έμ μ λΆ μλ©΄μ΄ λμ¬ μλ μμ§ μλλ λ¬Όμκ³Ό λ€λ¦μλ€. μ¦, μμ°¨λ (νμ°μ μΌλ‘) λ°μν μ λ°μ μλ€. κ·Έλ¦¬κ³ μμ°¨λ₯Ό 극볡νλ €λ©΄, μμ§ μλ£λμ§ μμ μ€λ λλ₯Ό κΈ°λ€λ €μΌ νλ€. λ©μΆ°(Suspend)μΌ νλ€λ λ§μ΄λ€.
#2-2 Suspendλ₯Ό μΆκ°ν λμλ

#2-1μ μμ ν΄ Suspendνλ μμ
μ μΆκ°νλ€.
#2-3 λΉλκΈ° μ½λμμ Suspendκ° μλ κ²½μ°

μ€λ λ λ³λ ¬ ꡬ쑰μμ Suspendλ λΆλͺ
νμ°μ μ΄μ§λ§, νμλ μλλ€. μλ₯Ό λ€μ΄, Aμ B (λ λ€ νμν μΆλ ₯ μμ
λ±μ νλ κ² μλλΌ) κ°κ° κ³μ°λ§ νκ³ λ§λ κ²½μ°κ° κ·Έλ λ€. μμ°¨λ₯Ό λ§μΆ°μ ν μμ
μ΄ μλ€. μ΄λ° κ²½μ°μλ κ΅³μ΄ Suspendνμ§ μλλ€. μ¦, Suspendλ λ³λ ¬ ꡬ쑰μμ 'νμ'νμ§λ§, 'νμ'λ μλλΌλ μ΄μΌκΈ°λ€.
#3 λκΈ° μ½λμ 'μμ' vs λΉλκΈ° μ½λμ 'μμ
λκΈ° μ½λ μμμ νλμ μ€λ λμμ μμ
μ΄ μ€νλλ©°, μ΄μ μμ
μ΄ μλ£λ λκΉμ§ λ€μ μμ
μ΄ μ€νλμ§ μλ νκ²½μ΄λ€. μ°λ¦¬κ° μΌμμ μΌλ‘ μ ν΄μ¨ μ½λμ μΌλ°μ μΈ μμμ΄ κ·Έλ λ€. λ°λλ‘ λΉλκΈ° μ½λ μμμ μμ
λ€μ΄ μμ°¨μ± μμ΄ λ³λ ¬μ μΌλ‘ μ€νλ μ μλ νκ²½μ λ§νλ€. Coroutineμ λΉλκΈ° μ½λλ₯Ό ꡬνν λ μ° λꡬμ§λ§, Coroutineμ΄λΌκ³ λ°λμ λΉλκΈ° μ½λμΈ κ²μ μλλ€ (μ°Έμ‘°).
'λκΈ° μ½λ'μ μμμ 'λΉλκΈ° μ½λ'λ₯Ό μ¬μ©ν μ μλ€. μ΄μ§Έμ? 'λΉλκΈ° μ½λ'λ μ½λλ₯Ό μ€ν(Run)νλ μ£Όμ²΄μΈ μμ€ν
(Kotlinμ κ²½μ°μ Kotlin λ°νμ)μ 'κΈ°λ'νκ² λ§λ€κΈ° λλ¬Έμ΄λ€. μμ
μ΄ λΉλκΈ°μ μΌλ‘ μ€νλλ€λ μκΈ°λ μμ€ν
μ΄ μΈμ κ·Έ μ½λμ κ²°κ³Όλ₯Ό λ°μλ³Ό μ μλ μ§λ₯Ό μ μ μλ€λ μ΄μΌκΈ°λ€. μ¦, 'λΉλκΈ° μ½λ'λ μμ€ν
μκ² κ°μ μ¦κ°μ μΌλ‘ λ΄μ£Όμ§ μλλ€. λ°λΌμ μμ€ν
μ μΈμ κ° μμ
μ΄ μλ£(launch)λκ±°λ κ°μ μ λ¬(async, produce)ν΄μ€ κ±°λΌκ³ 'κΈ°λ'λ§ ν μ μλ€. 'κΈ°λ'λ 'κΈ°λ€λ¦Ό'μ΄λ€. κΈ°λ€λ¦Όμ 'κ°νμ μΈ λ©μΆ€'μ΄λ€. κ°νμ μΌλ‘ λ©μΆλ μ½λλ₯Ό μ΄λ»κ² (μλ¬κ° λμ§ μλ ν) μ λ λ©μΆμ§ μμμ 보μ₯νλ 'λκΈ° μ½λ μμ'μ λ μ μκ² λκ°?
λ°λ©΄, 'λΉλκΈ° μ½λ'μ μμμ 'λκΈ° μ½λ'λ₯Ό μ¬μ©ν μ μλ€. λΉλκΈ° μ½λμ μμμ΄λΌκ³ λ°λμ λΉλκΈ° μ½λλ§ μμ νμκ° μλ€. 'κ°νμ λ©μΆ°μ§μ΄ νμ©λλ κ³³'μ΄μ§, 'λ°λμ λ©μΆ°μΌνλ κ³³'μ΄ μλκΈ° λλ¬Έμ΄λ€.
#1-2μ μμ μ½λλ₯Ό 보면, λΉλκΈ° μ½λλ CoroutineScopeλΌλ ν¬μ₯μ§μ λλ¬μΈμ¬ λ°μ μλ λκΈ° μ½λμ μμκ³Ό κ·Έ μμμ΄ λΆλͺ
ν ꡬλΆλ¨μ λ³Ό μ μλ€.
#4 μ£Όμν μ (μ½λ£¨ν΄μ 물리μ μ€λ λκ° μλλ€)
#1 ~ #3μμλ λκΈ°μ± λ° λΉλκΈ°μ±μ μ€λͺ
νκΈ° μν΄μ λ§μΉ, νλμ μ½λ£¨ν΄ = νλμ (물리μ ) μ€λ λμΈ κ²μ²λΌ μ€λͺ
νλ€. νμ§λ§, μ΄λ μ΄ν΄λ₯Ό μν κ³ μμ μ΄κ³ λ
Όλ¦¬μ μΈ λΉμ½μ΄λ€. μ¦ νλ¦° μ€λͺ
μ΄λ€. μ€λ λ(Thread)λ μ΄μ체μ κ° κ΄λ¦¬νλ κ²μ΄λ©° κ° μ€λ λλ 물리μ μΈ CPUμ ν λΉλλ€. λ°λ©΄, μ½λ£¨ν΄μ μ½νλ¦°μ΄λΌλ νλ‘κ·Έλλ° μΈμ΄ λ¨μμμ κ΄λ¦¬λλ μΌμ’
μ λ
Όλ¦¬μ μ€λ λλ€.
μ½λ£¨ν΄μ λ
Όλ¦¬μ μ€λ λμ΄κΈ°μ, νλμ 물리μ μ€λ λ μμμ μ¬λ¬ κ°μ μ½λ£¨ν΄μ΄ μνλ μλ μλ€. μλ₯Ό λ€μ΄, AλΌλ μ€λ λμμ μ½λ£¨ν΄ aμ μ½λ£¨ν΄ bκ° μνλλ μν©μ΄λΌκ³ κ°μ ν΄λ³΄κ² λ€. aμ bλ μλ‘ μ μ λ©μΆ(Suspend)λ©΄μ λ€λ₯Έ μ½λ£¨ν΄μ΄ μ€νλ μ μκ² μμ(A)μ μ보νλ μμ΄λ€. μ΄ μ보λ₯Ό ν΅ν΄, κ°μ μ€λ λμμ μ¬λ¬ μ½λ£¨ν΄μ΄ λ²κ°μ κ°λ©° μ€νλ¨μΌλ‘μ¨ λ³λ ¬μ μΈ λμ μ€νμ²λΌ 보μ΄λ κ²μ μ½λ£¨ν΄μ λμμ±(Concurrency)μ΄λΌκ³ νλ€. μ΄λ 물리μ μ€λ λμ μ§μ§ λμ μ€νμΈ λ³λ ¬μ±(Parallelism)κ³Ό λλΉλλ€.
νλμ μ½λ£¨ν΄μ νλμ μ€λ λμ νλμ© ν λΉνλ κ²λ νμνλ€λ©΄ ꡬνν μ μλ€. μ€λ λκ° A, B, C μ΄ 3κ°κ° μμ λ νλ‘κ·Έλλ¨Έκ° CoroutineDispatcherλ₯Ό μ΄μ©ν΄ A, B, C κ°κ°μ νλμ μ½λ£¨ν΄μ ν λΉνλ©΄ λλ€ (μ΄λ¬λ©΄ μ½λ£¨ν΄μ Concurrencyκ° μλλΌ Parallelismμ ꡬννκ² λλ€). μ½λ£¨ν΄μ κΈ°λ³Έμ μΌλ‘λ λ
Όλ¦¬μ μ€λ λμ΄μ§λ§, νμν κ²½μ° μ€μ 물리μ μ€λ λκΉμ§ λͺ
μν΄ μ¬μ©ν μ μλ μ μ°ν λκ΅¬μΈ μ
μ΄λ€.
#5 μμ½
λ³λ ¬ ꡬ쑰λ νμ°μ μΌλ‘ ιμμ°¨μ (ιλκΈ°μ )μ΄κ³ , λ°λΌμ Suspendλ₯Ό μꡬν μ μλ€.
'κΉ¨μ κ°λ π > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Kotlin] Coroutines - CoroutineScope, CoroutineContext (1) | 2024.02.10 |
|---|---|
| [Kotlin] Coroutines - Suspend vs Block (0) | 2024.02.09 |
| [Kotlin] Coroutines - κΈ°μ΄ (1) | 2024.02.07 |
| [Kotlin] λλ€(Lambda) ννμ (1) | 2024.02.01 |
| [Kotlin] ν¨μ νμ (Fuction types) ννμ (0) | 2024.01.31 |