# CoroutineContext
Coroutine(코루틴)을 어떻게 처리할 것인지에 대한 여러가지 정보(Element)를 포함 -> Element의 집합
CoroutineContext는 Interface로, 코루틴에 대한 설정 요소(Element)를 등록하고 Scope의 속성이 된다.
말이 너무 어렵다..
-> CoroutineContext는 Coroutine이 실행되는 환경이라고 생각하면 된다.
CoroutineContext 인터페이스 내부에는 4가지의 메소드가 존재
- public operator fun <E : Element> get(key: Key<E>): E?
get() - 연산자(operator) 함수의 의미로, 매개변수로 주어진 key에 해당하는 Context 요소를 반환하는 함수 - public fun <R> fold(initial: R, operation: (R, Element) -> R): R
fold() - 초기값(initial Value)을 시작으로 제공된 병합 함수(operation)를 이용해서 대상 컨텍스트 요소들을 병합한 후 결과를 반환하는 함수 - public operator fun plus(context: CoroutineContext): CoroutineContext = ...impl...
plus() - 현재(기존) Context와 파라미터로 주어진 context가 갖는 요소(Element)들을 모두 포함하는 새로운 Context를 반환 - public fun minusKey(key: Key<*>): CoroutineContext
minusKey() - 현재(기존) Context에서 주어진 key를 갖는 요소(Element)를 제외한 새로운 Context를 반환
# Key / Element란?
여기서 Key에 해당하는 요소(Element)란, CoroutineContext를 구성하는 요소를 뜻하는데
CoroutineId, CoroutineName, Dispatchers, CoroutineInterceptor, CoroutineExceptionHandler 등 의미
key -> Element 타입을 제네릭으로 갖고, key를 기반으로 Context에 Element를 등록하는 역할
Element -> CoroutineContext를 상속, key를 멤버속성으로 포함한다
Element는 CoroutnieContext를 상속한다는 점을 알아두면 CoroutineScope를 이해하는데 도움이 된다.
# CoroutineContext 구현체
CoroutineContext는 인터페이스로 이를 구현한 구현체는 기본적으로 3가지의 종류가 존재
- EmptyCoroutineContext - Singleton(싱글톤), Default Context
Context를 명시하지 않을 경우 기본적으로 적용되는 GlobalScope에 사용된 Context로, GlobalScope == launch { }는 같은 싱글톤 EmptyContext를 사용하는 의미이다. - CombinedContext - 두개 이상의 컨텍스트가 명시되면 Context간 연결을 위한 컨테이너 역할의 Context,
명시란? - launch(Dispatchers.Main + job) 이렇게 코루틴 생성시 프로퍼티를 설정한다는 의미 - Element - Context의 각 요소(Element)들도 CoroutineContext를 구현한다고 위에서 언급한 의미
launch() 함수 내부 CoroutineContext를 추가하는 건데 Element는 Context의 구현체로, 즉 Element가 개별적인 Context이다
Element끼리 + 연산자로 설정을 하는데 +는 Context메서드 중 하나인 plus()함수로 Element들을 합쳐 새로운 Context를 반환하는것으로 보면 된다.
Element + Element + ...는 결국 plus()함수의 연속으로 하나로 병합된 Context를 만들어낸다.
위에서 주황색 테두리는 Context구현체 중 하나인 CombinedContext로서 Context들 간을 묶어주는 하나의 CoroutineContext가 되는 개념
# CoroutineScope
CoroutineScope는 코루틴 블럭(영역)을 생성하는 역할
하나의 CoroutineContext 멤버속성만 갖는 인터페이스
코루틴 빌더들은 CoroutineScope의 확장함수로, 이 CoroutineScope의 함수로 호출되는데,
* 코루틴 빌더들? - 코루틴 빌더(launch / actor) + 스코프 빌더(async / produce)
CoroutineContext를 명시해주지 않으면 기본적으로 EmptyContext로 할당 된다.
그 의미는 GlobalScope랑 같다는 의미이면서 Activity가 아닌, Application의 생명주기에 종속된다는 의미이다.
Activity에 종속적으로 사용하려면 Activity에 Scope를 초기화 설정을 해줘야 한다.
명시하지 않은 CoroutineScope와 GlobalContext가 같은 Context라는 걸 보여주기 위한
GlobalScope 구조와 EmptyCoroutineContext 구조
GlobalScope.launch{}로 실행한 코루틴은 Application이 종료할 때 까지 죽지않는 다는 점이 중요한 포인트
참조 :
'안드로이드 > Android 비동기 처리' 카테고리의 다른 글
[Android] Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3 (1) | 2024.03.20 |
---|---|
비동기 처리(process&thread) (0) | 2022.06.07 |
Coroutine suspend function (0) | 2022.04.19 |
코루틴 Coroutine (0) | 2022.04.16 |
비동기 처리 - 블로킹과 논블로킹 (0) | 2022.04.13 |