Kotlin lang

[kotiln] 코틀린 코루틴에 대한 개념 정리 (3)

Razelo 2024. 4. 22. 22:23

지난번 포스팅에서 코루틴 빌더 함수와 Job객체에 대해 알아보았다. 

 

이번 포스팅에서는 async와 Deferred<T>에 대해서 알아보자. 

 

이전에 배운 launch 코루틴 빌더 함수는 코루틴으로부터 결과값을 받을 수 없었다. 

다만 Job객체를 받을 뿐이었다. 

 

그런데 코루틴으로부터 작업에 대한 결과값을 받을 필요가 있을 수 있다. 

이때 사용하는데 async와 Deferred<T>응답 객체이다. 

async(Dispatchers.IO) { ... }와 같이 사용할 경우 Deferred<T>를 리턴받고, 해당 Deferred<T>타입의 변수에 대해 await()메서드를 사용하면 결과를 받을 수 있다. await()을 사용하는 이유는, 코루틴이 언제 완료될지는 모르기 때문에 Deferred<T>가 미래의 값이라는 의미를 갖고 있기 때문이다. 그래서 await()를 사용해서 완료되면 결과 리턴값을 받아오는 것이다. 

 

여러 코루틴의 응답을 취합해서 가져오고 싶다면 awaitAll을 사용하면 된다. 

 

withContext란 무엇인가?

withContext함수는 새로운 코루틴을 만들지 않는다. 대신 사용하던 코루틴에서 그대로 작업을 이어서 할 수 있게 해준다. CoroutineContext만 바꿔가면서 같은 코루틴을 계속 써서 작업하는 것이다. 

그래서 병렬로 처리되지 않기 때문에 주의해야한다. 

만약 병렬로 처리하고 싶으면 async await을 사용하면 된다. 

 

사실 withContext를 왜 써야하는지 아직 잘 모르겠다... 

 

CoroutineContext는 뭘까? 

코루틴의 실행환경을 설정하고 관리한다. 

CoroutineName, CoroutineDispatcher, Job, CoroutineExceptionHandler로 조합 가능하다. 

이 네 가지를 조합해서 만들 수도 있고, minusKey를 통해 넷 중 몇가지를 뺀 새로운 CoroutineContext를 정의할 수도 있다. 

참고로 같은 객체를 더하면 마지막에 더한 것만 기록된다. 

또한 키 값 쌍으로 관리되는 흥미로운 구조이다. 

 

코루틴에서 꽤 중요한 개념같지만, 이걸 어디에 활용할 수 있을지는 아직 잘 체감되지 않는다. 

반응형