Kotlin/Coroutine

(Coroutine) 5. Scope

jaesungLeee 2022. 11. 1. 17:49

1. GlobalScope

GlobalScope는 어디에도 속하지 않는 Scope이다.

이전 포스팅에서 살펴보았던 예제들에서 사용되던 Scope는 다른 코루틴에 의해 만들어지고 그에 따라 계층적인 성격을 가지고 있었다.

지금 살펴볼 GlobalScope는 원래부터 존재하는 전역적인 Scope이다.

따라서, 계층적으로 관리되지 않는다.

 

suspend fun printRandom() {
    delay(500L)
    println(Random.nextInt(0, 500))
}

@OptIn(DelicateCoroutinesApi::class)
fun main() {
    val job = GlobalScope.launch(Dispatchers.IO) {
        launch { printRandom() }
    }
    Thread.sleep(1000L)
}

>> 164

 

GlobalScope를 사용하면 간편하게 코루틴을 생성하고 쓸 수 있다는 장점이 있지만, 어떤 Scope에도 속하지 않고 계층적으로 관리되지 않기 때문에 관리가 어렵다는 단점이 있다.

따라서, 잘 사용하지 않는 Scope이다.

 

2. CoroutineScope

권장하지 않는 Scope인 GlobalScope를 대체하여 CoroutineScope를 사용하는 것이 좋다.

CoroutineScope는 파라미터로 CoroutineContext를 받는다.

우리는 이전 포스팅을 통해 CoroutineContext에 여러가지 엘리먼트를 결합하여 Context를 구성할 수 있는 것을 확인했다.

아래 예시에서는 Dispatcher로만 엘리먼트를 구성하여 CoroutineContext를 만들고 있다.

여기에 예를 들어 CoroutineName과 같은 엘리먼트를 추가할 수도 있을 것이다.

얼마든지 확장시킬 수 있다.

 

아래 예시는 scope 변수를 통해 계층적으로 형성된 코루틴을 관리할 수 있다.

suspend fun printRandomWithCoroutineScope() {
    delay(500L)
    println(Random.nextInt(0, 500))
}

fun main() {
    val scope = CoroutineScope(Dispatchers.Default)
    val job = scope.launch(Dispatchers.IO) {
        launch { printRandomWithCoroutineScope() }
    }
    Thread.sleep(1000L)
}

 

3. Scope for Android OS

일반적으로, 모바일 운영체제에서는 Lifecycle 즉, 생명주기 관리가 핵심이라고 볼 수 있다.

이 생명주기에 맞게 코루틴을 원활하게 관리할 수 있도록 Android OS에서 사용할 수 있는 Scope가 존재한다.

 

생명주기 관리를 잘 못할 경우 Memory Leak이 발생할 수 있기 때문에 Activity에서는 Activity의 생명주기에 맞춰진 Scope를 사용해야 할 것이며, ViewModel에서는 ViewModel 생명주기에 맞춰진 Scope를 사용해야 한다.

 

4. LifecycleScope

(추가 예정)

 

5. ViewModelScope

(추가 예정)

 

Reference

https://kotlinlang.org/docs/coroutines-overview.html