워커 쓰레드를 관리하는 Dispatcher 는 CoroutineContext 객체야


또 코루틴은 기본적으로 Context 가 지정되지 않으면 부모의 Context를 지정하게 돼


그래서 아래와 같은 코드를 실행시켜보면



parent 만 출력되는걸 볼 수 있지


왜 이런일이 일어난가는 launch 함수의 구현을 보면 되는데



launch 함수의 구현은 context 를 지정하지 않으면 EmptyCoroutineContext 를 넣어주게 되어있고


그 아래에서 새로운 코루틴을 만들고 있지





newCoroutineContext 함수의 구현부를 보면 CoroutineScope 의 확장함수로 만들어져있고

coroutineScope + 파라미터로 받은 context 를 이용해 CoroutineContext 객체의 plus 연산으로 새 CoroutineContext를 생성하는것을 알 수 있음


(CoroutineScope 는 한개의 coroutineContext 를 가지는 인터페이스)






CoroutineContext 의 plus 구현 부분을 보면 이제 왜 .CoroutineContext를 지정 안해줬을 때 부모의 코루틴을 그대로 사용하는지 알 수 있는데


if (context === EmptyCoroutineContext) this << 이부분으로 인해 그냥 launch 쓰면 EmptyCoroutineContext 가 들어가고


그걸 + 연산하면 그냥 부모의 context 를 리턴시키게 되는거지


그래서 아까 launch 블록 안에 launch 블록에서 "SingleDispatchers-worker-parent" 만 출력하게 된거야


근데 여기서 궁금한건 context 가 EmptyCoroutineContext 가 아닐 때가 궁금한거지


아까 Dispatchers 는 CoroutineContext 라고 했고 그럼 형변환으로 아래처럼



parent Dispatchers 와 child Dispatchers 를 plus 연산을 할 수 있어


근데 공식 문서에 의하면

CoroutineContext 의 plus 연산에서 동일한 Key를 가진 요소는 제외된다고 써있는데


코드를 실행시켜보면


parent 는 삭제되고 child 는 합쳐졌단 말이지


그럼 여기서 예상해보기로는


SingleDispathcers-worker-child 는 Key가 같아서 Drop 되거나, Key가 달라서 합쳐지거나


둘중 하나만 일어나야하는데


왜 parent랑 더했을 때 합체가 아닌 child 로 변경이 일어난건지 모르겠음





CoroutineDispatcher 가 가지고 있는 Key 가 어떻게 동작하는지를 알아야 할 것 같은데


코틀린이 워낙 확장함수가 많아서 어디서 관여하고 있는건지 공부하기 힘드네