# ๐Ÿš€Coroutine launch vs async

์œ ๋ฏผ๊ตญยท2025๋…„ 2์›” 17์ผ

๐Ÿš€ launch vs async ์ฐจ์ด ์ •๋ฆฌ (Kotlin Coroutines)

launch์™€ async๋Š” ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ๋ฐ˜ํ™˜๊ฐ’๊ณผ ์‚ฌ์šฉ ๋ชฉ์ ์ด ๋‹ค๋ฆ„


โœ… launch

  • Job์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ
  • UI ์—…๋ฐ์ดํŠธ, ๋กœ๊ทธ ์ €์žฅ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹คํ–‰๊ณผ ๊ฐ™์€ ๋‹จ์ˆœ ์‹คํ–‰ ์ž‘์—…์— ์ ํ•ฉ
val job = CoroutineScope(Dispatchers.IO).launch {
    println("launch: ์‹คํ–‰๋จ")
}

๐Ÿ”น launch์˜ ํŠน์ง•

  • Job์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ job.cancel()๋กœ ์ทจ์†Œ ๊ฐ€๋Šฅ
  • job.join()์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ ๊ฐ€๋Šฅ
job.join()  // ์‹คํ–‰ ์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐ
job.cancel() // ์‹คํ–‰ ์ค‘๋‹จ

โœ… async - ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ (Deferred)

  • Deferred๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, await()์„ ํ˜ธ์ถœํ•ด์•ผ ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ
  • API ํ˜ธ์ถœ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋“ฑ ๊ฒฐ๊ณผ ๊ฐ’์ด ํ•„์š”ํ•œ ์ž‘์—…์— ์ ํ•ฉ
  val deferred = CoroutineScope(Dispatchers.IO).async {
    "async: ์‹คํ–‰ ๊ฒฐ๊ณผ"
}

val result = deferred.await() // ๊ฒฐ๊ณผ ๋Œ€๊ธฐ
println(result) // "async: ์‹คํ–‰ ๊ฒฐ๊ณผ"

๐Ÿ”น async์˜ ํŠน์ง•

  • Deferred๋ฅผ ๋ฐ˜ํ™˜ โ†’ await()์„ ํ˜ธ์ถœํ•ด์•ผ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ณ‘๋ ฌ ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋™์‹œ์— ๋ชจ์„ ๋•Œ ์œ ์šฉ

โœ… launch vs async ๋น„๊ต ์˜ˆ์ œ

  suspend fun main() {
    val scope = CoroutineScope(Dispatchers.Default)

    // launch๋Š” ๊ฒฐ๊ณผ๊ฐ’์ด ์—†์Œ
    val job = scope.launch {
        delay(1000)
        println("launch ์‹คํ–‰ ์™„๋ฃŒ")
    }

    // async๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ (Deferred)
    val deferred = scope.async {
        delay(1000)
        "async ์‹คํ–‰ ์™„๋ฃŒ"
    }

    job.join() // launch ์‹คํ–‰ ์™„๋ฃŒ ๋Œ€๊ธฐ
    println(deferred.await()) // async ์‹คํ–‰ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
}

โžก launch๋Š” ์‹คํ–‰๋งŒ ํ•˜๊ณ  ๋๋‚˜์ง€๋งŒ, async๋Š” await()์„ ํ˜ธ์ถœํ•ด์•ผ ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ!

profile
์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ˜Š

0๊ฐœ์˜ ๋Œ“๊ธ€