Notice
Recent Posts
Recent Comments
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

훌륭한 개발자가 되기 위하여

CoroutineContext란 본문

안드로이드

CoroutineContext란

jay20033 2025. 1. 10. 17:55

CoroutineContext

👉 Coroutine 실행 환경을 설정하는 객체

CoroutineContext의 구성요소

  1. CoroutineName : 코루틴의 이름 설정에 사용되는 객체
  2. CoroutineDispatcher : 코루틴을 스레드에 보내서 실행하는 객체
  3. Job : 코루틴의 추상체로 코루틴을 조작하는데 사용되는 객체
  4. CoroutineExceptionHandler : 코루틴에서 발생된 예외를 처리

구성요소 관리방법

  • CoroutineContext 객체는 구성요소에 대한 키-값 쌍으로 관리한다.
  • 각 구성요소는 고유한 키를 가지며, 키에 대한 중복된 값은 허용되지 않는다.
CoroutineName 키 CoroutineName 객체
CoroutineDispatcher 키 CoroutineDispatcher 객체
Job 키 Job 객체
CoroutineExceptionHandler 키 CoroutineExceptionHandler 객체

 

  • CoroutineContext 객체에 구성 요소를 추가하기 위해서는 더하기 연산자(+) 를 사용하면 된다.
  • 같은 구성요소가 둘 이상 더해지면, 나중에 추가된 구성요소가 이전 값을 덮어씌운다.
fun main() = runBlocking<Unit> {
    val coroutineContext = newSingleThreadContext("Thread1") + CoroutineName("ExampleCoroutine")
    launch(context = coroutineContext) {
        println("[${Thread.currentThread().name}] 실행")
    }
}
// 실행결과
[Thread1 @ExampleCoroutine#2] 실행
  • Job 객체는 기본적으로 launch 같은 코루틴 빌더 함수를 통해 자동으로 생성되지만, Job()을 호출해 생성할 수도 있다.
val myJob = Job()
val coroutineContext = Dispatchers.Default + myJob

CoroutineContext 구성 요소의 키

  • CoroutineContext 구성 요소의 키는 CoroutineContext.Key 인터페이스를 구현해 만들어진다.
  • CoroutineContext 구성 요소는 보통 CoroutineContext.Key를 자신의 내부에 싱글톤 객체로 구현된다.
  • 구성 요소에 접근하기 위해서 get함수의 인자로 Key를 넘기거나 대괄호[] 를 사용하면 된다.
  • CoroutineName, Job, CoroutineDispatcher, CoroutineExceptionHandler는 동반 객체로 Key를 가져서 .Key 를 쓰지 않고도 구성요소에 접근 가능
fun main() = runBlocking<Unit> {
    val coroutineContext = CoroutineName("MyCoroutine") + Dispatchers.IO
    val nameFromContext = coroutineContext[CoroutineName.Key]
    // val nameFromContext = coroutineContext[CoroutineName]
    println(nameFromContext)
}
// 실행 결과
CoroutineName(MyCoroutine)

CoroutineContext 구성 요소 제거하기

  • CoroutineContext 객체에서 특정 구성 요소를 제거하기 위해서는 minusKey 함수를 호출하고 구성 요소의 키를 넘기면 된다.
  • minusKey 함수를 호출한 CoroutineContext 객체는 그대로 유지되고 구성 요소가 제거된 새로운 CoroutineContext 객체가 반환된다.
val deletedCoroutineContext = coroutineContext.minusKey(CoroutineName)

'안드로이드' 카테고리의 다른 글

코루틴 예외 처리  (0) 2025.01.12
구조화된 동시성  (0) 2025.01.11
코루틴으로부터 결과 수신 받기  (0) 2025.01.08
코루틴 제어  (0) 2025.01.07
스레드 기반 작업의 한계, Coroutine Dispatcher  (0) 2025.01.06