![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Myliv/btsLJ6gqi6X/NIHbtdhdnGlBfaDYg1EEfK/img.png)
지난 포스팅에서 구조화된 동시성의 특성에 대해 배웠다.자식 코루틴은 부모 코루틴으로부터 컨텍스트를 상속받는다.부모 코루틴은 모든 자식 코루틴이 작업을 마칠 때까지 기다린다.부모 코루틴이 취소되면 자식 코루틴도 취소된다.자식 코루틴에서 에러가 발생하면, 부모 코루틴도 에러로 소멸된다.구조화된 동시성의 특성은 Job 컨텍스트와 관련이 있다.Job은 코루틴을 취소하고, 상태를 파악하는 등 다양하게 사용될 수 있다. Job이란 무엇인가?잡은 수명을 가지고 있고 취소 가능하다.Job은 인터페이스지만 구체적인 사용법과 상태를 가지고 있기 때문에 추상 클래스처럼 다룰 수도 있다. 잡의 수명은 상태로 나타낸다. 위 그림은 잡의 상태와 상태 변화를 나타낸 도식도이다.ActiveActive 상태에서는 잡이 실행되고 코루..
fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = Coroutinestart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Job { ...}코루틴 빌더 함수의 시그니처 첫 번째 파라미터가 CoroutineContext라는 사실을 알 수 있다.빌더 함수의 리시버뿐만 아니라 마지막 인자의 리시버도 CoroutineScope 타입이다. interface CoroutineScope { val coroutineContext: CoroutineContext}CoroutineScope는 CoroutineConte..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b0dTSW/btsLJBHFhc1/5fvfj5SmNgro10juGZ2B5k/img.png)
중단 함수는 Continuation 객체를 다른 중단 함수로 전달한다.따라서 중단 함수는 일반 함수를 호출할 수 있지만, 일반 함수는 중단 함수를 호출할 수 없다.모든 중단 함수는 다른 중단 함수에 의해 호출되어야 한다. 이때 중단 함수를 시작하는 지점이 코루틴 빌더다.코루틴 빌더는 일반 함수와 중단 함수를 연결시키는 다리가 된다.kotlinx.coroutines 라이브러리가 제공하는 필수적인 코루틴 빌더 세 가지를 탐색해 보자.launchrunBlockingasync launch 빌더thread 함수를 호출하여 새로운 스레드를 시작하는 것과 비슷하다.코루틴을 시작하면 별개의 작업으로 실행된다.fun main() { GlobalScope.launch { delay(1000L) ..
코틀린 언어에서 자체적으로 지원하는 부분(컴파일러의 지원과 코틀린 기본 라이브러리의 요소)코틀린 코루틴 라이브러리(kotlinx.coroutines)코루틴은 두 가지로 구성되어 있다. 코틀린 언어 차원에서는 자유도를 보장하기 위해 코루틴을 최소한으로 지원하고 있다.다른 프로그래밍 언어에서 동시성을 구현한 스타일을 이식 하기 위해 사용할 수 있지만, 직접 다루기 쉽지는 않다.그 예로 suspendCoroutine()이나 Continuation 등이 있다.애플리케이션 개발자들보다는 라이브러리 개발자들에게 적합하다. 언어 차원에서 지원하는 것과 별개로 kotlinx.coroutines 라이브러리가 있다.이 라이브러리를 사용하려면 프로젝트에 별도로 의존성을 추가해야 한다.라이브러리는 코틀린 언어 차원에서 코루..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/s4xZU/btsLJMBMOFl/wEoPw8v1hxoHCHXAqNgoO0/img.png)
Continuation 전달 방식Continuation은 함수에서 함수로 인자를 통해 전달된다. Continuation은 마지막 파라미터로 전달된다.suspend fun getUser(): User?suspend fun setUser(user: User)suspend fun checkAvailability(flight: Flight): Boolean위 중단 함수의 실제 함수 시그니처는 아래와 같다.fun getUser(continuation: Continuation): Any?fun setUser(user: User, continuation: Continuation): Anyfun checkAvailability( flight: Flight, continuation: Continuation,)..
중단 함수는 코틀린 코루틴의 핵심이다.코루틴을 중단한다는 건 실행을 중간에 멈추는 것을 의미한다.코루틴은 중단되었을 때 Continuation 객체를 반환한다. Continuation을 이용하면 멈췄던 곳에서 다시 코루틴을 실행할 수 있다.코루틴과 반대로 스레드는 저장이 불가능하고 멈추는 것만 가능하다.코루틴과 스레드는 확연히 다르다. 코루틴이 훨씬 강력한 도구다. 중단했을 때 코루틴은 어떤 자원도 사용하지 않는다.코루틴은 다른 스레드에서 시작할 수 있고, Continuation 객체는 직렬화와 역직렬화가 가능하며 다시 실행될 수 있다. 재개중단 함수는 말 그대로 코루틴을 중단할 수 있는 함수다.즉, 중단 함수가 반드시 코루틴이나 다른 중단 함수에 의해 호출되어야 한다. suspend fun mai..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/doBZp8/btsLINgjuvM/hsEJyOIA2KXjV3uDxKBaK0/img.png)
왜 중단이 필요한지, 중단이 어떤 것인지 알아보기 위해 시퀀스의 작동 방식과 시퀀스 빌더를 알아보자. 시퀀스의 특징 코틀린에서는 제너레이터 대신 시퀀스를 생성 할 때 사용하는 시퀀스 빌더를 제공한다.코틀린의 시퀀스는 List나 Set과 같은 컬렉션이랑 비슷한 개념이지만, 필요할 때마다 값을 하나씩 계산하는 지연(lazy) 처리를 한다.요구되는 연산을 최소한으로 수행한다.무한정이 될 수 있다. (-> while(true))메모리 사용이 효율적이다.sequence()라는 함수를 이용해 값을 순차적으로 계산하고 필요할 때 반환하는 빌더를 정의한다.시퀀스의 람다 표현식 내부에서는 yield() 함수를 호출하여 시퀀스의 다음 값을 생성한다.val seq = sequence { yield(l) yiel..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bEB2Ly/btsLIhoyoNs/p6plk2i6BJXXnLMNBVElE1/img.png)
코틀린 장점멀티플랫폼에서 작동시킬 수 있기 때문에 코틀린을 사용하는 모든 플랫폼에서 사용할 수 있다.기존 코드 구조를 광범위하게 뜯어고치지 않고 코루틴을 도입할 수 있다. 안드로이드에서의 코루틴 사용흔한 애플리케이션 로직은 다음과 같다.하나 이상의 소스(API, 뷰 구성요소, 데이터베이스, 설정, 다른 애플리케이션)로부터 데이터를 얻어온다. 데이터를 처리한다.가공된 데이터로 무엇인가를 한다. (화면에 보여주기, 데이터베이스에 저장, API로 전송) 기존의 구현 방식과 코루틴을 사용한 예제를 비교하여 두 방법이 어떻게 다른지 알아보자.예제 상황 - API로 뉴스를 가져와서 정렬한 후, 화면에 띄운다. 1) 가장 간단한 방법fun onCreate() { val news = getNewsFromApi()..