Kotlin 코루틴 (Kotlin Coroutines)
Kotlin 코루틴은 비동기 프로그래밍을 단순하고 효율적으로 처리하기 위한 도구입니다. 코루틴을 사용하면 비동기 코드가 마치 동기 코드처럼 읽히기 때문에 코드 가독성이 향상되고 유지보수가 쉬워집니다. 코루틴은 suspend
함수와 CoroutineScope
를 사용하여 비동기 작업을 관리합니다.
코루틴 기본 (Coroutine Basics)
코루틴을 사용하려면 kotlinx-coroutines-core
라이브러리를 추가해야 합니다. Gradle을 사용하는 경우 build.gradle
파일에 다음을 추가합니다:
dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0" }
코루틴의 기본 요소는 suspend
함수입니다. suspend
함수는 일시 중단할 수 있으며 다른 suspend
함수 또는 코루틴 빌더 내에서만 호출될 수 있습니다.
기본 코루틴 예제:
import kotlinx.coroutines.* fun main() = runBlocking { launch { delay(1000L) println("코루틴!") } println("안녕하세요,") delay(2000L) // main 함수가 끝나지 않도록 지연 }
위 코드에서 runBlocking
은 현재 스레드를 차단하여 코루틴이 완료될 때까지 기다립니다. launch
는 새로운 코루틴을 시작하며, delay
는 코루틴을 일시 중단시킵니다.
코루틴 빌더 (Coroutine Builders)
코루틴을 시작하기 위해 여러 가지 코루틴 빌더가 있습니다. 가장 일반적인 빌더는 launch
와 async
입니다.
launch와 async 예제:
import kotlinx.coroutines.* fun main() = runBlocking { val job = launch { delay(1000L) println("launch 코루틴 완료") } val deferred = async { delay(1000L) "async 코루틴 결과" } println("async 결과: ${deferred.await()}") job.join() }
launch
는 Job
객체를 반환하며, async
는 Deferred
객체를 반환하여 결과를 await
메서드로 받을 수 있습니다.
코루틴 스코프와 컨텍스트 (Coroutine Scope and Context)
코루틴은 특정 스코프 내에서 실행됩니다. CoroutineScope
는 코루틴을 시작하는 데 사용됩니다. 일반적으로 GlobalScope
, runBlocking
, coroutineScope
등을 사용합니다.
코루틴 스코프 예제:
import kotlinx.coroutines.* fun main() = runBlocking { launch { println("GlobalScope.launch 시작") delay(1000L) println("GlobalScope.launch 종료") } coroutineScope { launch { println("coroutineScope.launch 시작") delay(500L) println("coroutineScope.launch 종료") } } println("runBlocking 종료") }
위 코드에서 runBlocking
과 coroutineScope
는 코루틴이 완료될 때까지 현재 스레드를 차단하지만, GlobalScope
는 차단하지 않습니다.
코루틴 취소 (Cancelling Coroutines)
코루틴은 취소가 가능하며, 취소하려면 Job
객체의 cancel
메서드를 호출합니다. 코루틴 내에서 주기적으로 취소 상태를 확인하는 것이 좋습니다.
코루틴 취소 예제:
import kotlinx.coroutines.* fun main() = runBlocking { val job = launch { repeat(1000) { i -> println("작업 $i 수행 중...") delay(500L) } } delay(1300L) // 약간 기다린 후 println("작업 취소 요청") job.cancelAndJoin() println("작업 취소됨") }
위 코드에서 job.cancelAndJoin()
을 호출하여 코루틴을 취소하고 완료될 때까지 기다립니다.
시간 초과 (Timeout)
코루틴은 특정 시간이 지나면 자동으로 취소되도록 설정할 수 있습니다. withTimeout
과 withTimeoutOrNull
을 사용하여 시간 초과를 관리합니다.
시간 초과 예제:
import kotlinx.coroutines.* fun main() = runBlocking { try { withTimeout(1300L) { repeat(1000) { i -> println("작업 $i 수행 중...") delay(500L) } } } catch (e: TimeoutCancellationException) { println("작업 시간 초과") } }
위 코드에서 withTimeout
을 사용하여 1300ms 후에 코루틴을 자동으로 취소합니다.
비동기 작업 (Asynchronous Tasks)
Kotlin 코루틴을 사용하면 비동기 작업을 간단하게 수행할 수 있습니다. 예를 들어, 여러 비동기 작업을 동시에 실행하고 결과를 기다릴 수 있습니다.
비동기 작업 예제:
import kotlinx.coroutines.* suspend fun performTask(taskName: String, delayTime: Long): String { delay(delayTime) return "$taskName 완료" } fun main() = runBlocking { val task1 = async { performTask("작업 1", 1000L) } val task2 = async { performTask("작업 2", 2000L) } println(task1.await()) println(task2.await()) }
위 코드에서 async
를 사용하여 두 비동기 작업을 동시에 실행하고, 각각의 결과를 await
으로 기다립니다.
코루틴은 Kotlin에서 비동기 프로그래밍을 쉽게 다룰 수 있는 강력한 도구입니다. 위에서 설명한 예제들을 통해 코루틴의 기본 사용법과 다양한 기능을 이해할 수 있습니다. 코루틴을 활용하면 효율적이고 가독성 높은 비동기 코드를 작성할 수 있습니다.