Kotlin에서 코루틴을 사용할 때 가장 기본적이면서도 중요한 두 가지 개념이 있습니다. 바로 runBlocking과 CoroutineScope입니다. 이 글에서는 이 두 가지의 차이점과 각각의 사용 방법에 대해 알아보겠습니다.
runBlocking
runBlocking은 현재 스레드를 차단(block)하고, 블록 내의 모든 코루틴이 완료될 때까지 기다립니다. 주로 테스트나 간단한 예제에서 사용되며, 메인 함수에서 코루틴을 동기적으로 실행할 때 유용합니다.
특징
- 차단(blocking): runBlocking 블록 내의 모든 코드가 완료될 때까지 현재 스레드를 차단합니다.
- 동기적(synchronous): 블록 내의 코드가 완료될 때까지 다음 코드로 진행하지 않습니다.
- 주로 테스트용: 주로 테스트 코드나 예제 코드에서 사용됩니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello,")
// "World!"가 출력될 때까지 runBlocking은 메인 스레드를 차단합니다.
}
CoroutineScope
CoroutineScope는 비차단(non-blocking) 방식으로 코루틴을 실행할 수 있는 컨텍스트를 제공합니다. CoroutineScope는 일반적으로 애플리케이션 내에서 코루틴을 관리하고, 특정 라이프사이클(예: ViewModel, Activity)에 따라 코루틴의 생명주기를 제어하는 데 사용됩니다.
특징
- 비차단(non-blocking): CoroutineScope 내의 코루틴은 비차단 방식으로 실행되며, 스코프의 컨텍스트에 따라 코루틴을 관리합니다.
- 유연성: 다양한 코루틴 빌더(launch, async 등)를 사용하여 비동기 작업을 처리할 수 있습니다.
- 라이프사이클 관리: 스코프는 특정 객체(ViewModel, Activity 등)의 라이프사이클에 따라 코루틴을 취소하거나 정리할 수 있습니다.
import kotlinx.coroutines.*
fun main() {
val scope = CoroutineScope(Dispatchers.Default)
scope.launch {
delay(1000L)
println("World!")
}
println("Hello,")
Thread.sleep(2000L) // 메인 스레드가 종료되지 않도록 잠시 대기
}
주요 차이점
차단 여부
- runBlocking: 현재 스레드를 차단합니다. 블록 내의 모든 작업이 완료될 때까지 기다립니다.
- CoroutineScope: 비차단 방식으로 코루틴을 실행합니다. 코루틴은 백그라운드에서 실행되며, 스레드를 차단하지 않습니다.
사용 목적
- runBlocking: 주로 테스트나 간단한 콘솔 애플리케이션에서 동기적으로 코루틴을 실행할 때 사용됩니다.
- CoroutineScope: 실제 애플리케이션에서 비동기 작업을 처리하고, 객체의 라이프사이클에 따라 코루틴을 관리할 때 사용됩니다.
라이프사이클 관리
- runBlocking: 블록이 끝날 때까지 모든 코루틴이 완료되기를 기다립니다.
- CoroutineScope: 스코프가 종료되면 해당 스코프 내의 모든 코루틴이 취소됩니다. 예를 들어, Android에서 ViewModel의 viewModelScope는 ViewModel이 클린업될 때 자동으로 취소됩니다.
결론
- runBlocking: 주로 동기적 실행이 필요한 간단한 테스트나 예제에서 사용됩니다. 현재 스레드를 차단하므로 실제 애플리케이션에서는 잘 사용되지 않습니다.
- CoroutineScope: 비차단 방식으로 코루틴을 실행하며, 실제 애플리케이션에서 비동기 작업을 처리하고, 라이프사이클 관리가 필요한 경우에 사용됩니다.
실제 애플리케이션 개발에서는 CoroutineScope를 사용하여 비동기 작업을 관리하는 것이 좋습니다. 이를 통해 비차단 방식으로 코루틴을 실행하고, 애플리케이션의 다른 부분과 자연스럽게 통합할 수 있습니다.
'Kotlin' 카테고리의 다른 글
JDK의 다양한 종류와 그 역사적 배경 (0) | 2024.05.26 |
---|---|
Kotlin 기본 개념 정리 (0) | 2024.05.26 |