훌륭한 개발자가 되기 위하여
CoroutineContext란 본문
CoroutineContext
👉 Coroutine 실행 환경을 설정하는 객체
CoroutineContext의 구성요소
- CoroutineName : 코루틴의 이름 설정에 사용되는 객체
- CoroutineDispatcher : 코루틴을 스레드에 보내서 실행하는 객체
- Job : 코루틴의 추상체로 코루틴을 조작하는데 사용되는 객체
- 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 |