목록Kotlin/코틀린 코루틴 (8)
안드로이드 개발자 노트
코루틴 부모-자식 관계의 특성은 다음과 같습니다. 자식은 부모로부터 컨텍스트를 상속받는다. 부모는 모든 자식이 작업을 마칠 때까지 기다린다. 부모 코루틴이 취소되면 자식 코루틴도 취소된다. 자식 코루틴에서 에러가 발생하면, 부모 코루틴 또한 에러로 소멸한다. Job이란 무엇인가? 잡(job)은 수명을 가지고 있으며, 취소 가능합니다. Active 상태에서는 잡이 실행되고 코루틴은 잡을 수행합니다. 지연 시작되는 코루틴을 제외한 대부분의 코루틴은 Active 상태로 시작하며, 지연 시작되는 코루틴만 New 상태에서 시작됩니다. New 상태인 코루틴이 Active 상태가 되려면 작업이 실행되어야 하며, 코루틴이 본체를 실행하면 Active 상태로 가게 됩니다. 실행이 완료되면 상태는 Completing으로 ..
코루틴 빌더의 정의를 보면 첫 번째 파라미터가 CoroutineContext인 것을 볼 수 있습니다. public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job { ... } 코루틴 빌더의 리시버인 CoroutineScope의 정의는 다음과 같습니다. public interface CoroutineScope { public val coroutineContext: CoroutineContext } 코루틴 스코프는 코루틴 컨텍스트를 감싸는 래퍼 형..
일반 함수가 중단 함수를 호출하는 것은 불가능합니다. 중단 함수를 연속으로 호출하면 그 시작점은 코루틴 빌더로, 일반 함수와 중단 가능한 세계를 연결해줍니다. 코루틴 빌더는 크게 세 가지가 있습니다. launch runBlocking async launch 빌더 laucn는 새로운 스레드를 시작하는 것과 비슷하며, 작동하는 방식은 데몬 스레드와 어느 정도 비슷하지만 훨씬 가볍습니다. launch 함수는 CoroutineScope 인터페이스의 확장 함수이며, CoroutineScope 인터페이스는 구조화된 동시성의 핵심입니다. 다음은 launch 함수를 사용한 예제입니다. fun main() { GlobalScope.launch { delay(1000L) println("World!!") } GlobalS..
코루틴은 두 가지로 구성되어 있습니다. 코틀린 언어에서 자체적으로 지원하는 부분(컴파일러의 지원과 코틀린 기본 라이브러리의 요소) 코틀린 코루틴 라이브러리(kotlinx.coroutines) 둘은 같은 것으로 취급되곤 하지만, 전혀 다릅니다. 언어 차원에서의 지원 kotlinx.coroutines 라이브러리 컴파일러가 지원하며 코틀린 기본 라이브러리에 포함 의존성을 별도로 추가해야 한다. kotlin.coroutines 패키지에 포함 kotlinx.coroutines 패키지에 포함 Continuation 또는 suspendCoroutines과 같은 몇몇 기본적인 것들과 suspend 키워드를 최소한으로 제공 launch, async, Deferred처럼 다양한 기능을 제공 직접 사용하기 어렵다. 직접 사..
이 장에서는 코루틴의 내부 구현에 집중하며, 코루틴의 동작 과정에 대해 설명하고자 합니다. 중단 함수는 함수가 시작할 때와 중단 함수가 호출되었을 때 상태를 가진다는 점에서 상태 머신(state machine)과 비슷하다. 컨티뉴에이션(continuation) 객체는 상태를 나타내는 숫자와 로컬 데이터를 가지고 있다. 함수의 컨티뉴에이션 객체가 이 함수를 부르는 다른 함수의 컨티뉴에이션 객체를 장식(decorate)한다. 그 결과, 모든 컨티뉴에이션 객체는 실행을 재개하거나 재개된 함수를 완료할 때 사용되는 콜 스텍으로 사용된다. 컨티뉴에이션 전달 방식 컨티뉴에이션은 함수에서 함수로 인자를 통해 전달되며, 관례상 마지막 파라미터로 전달됩니다. suspend fun getUser(): User? suspe..
중단 함수(suspend function)는 코틀린 코루틴의 핵심이며, 코틀린 코루틴의 다른 모든 개념의 기초가 되는 요소입니다.코루틴은 중단되었을 때 Contiunation 객체를 반환합니다.Continuation을 이용하면 멈췄던 곳에서 다시 코루틴을 실행할 수 있습니다.스레드는 저장이 불가능하고 멈추는 것만 가능하지만, 코루틴은 중단했을 때 어떠한 자원도 사용하지 않습니다.코루틴은 다른 스레드에서 시작할 수 있고, Continuation 객체는 (이론상) 직렬화와 역직렬화가 가능하며 다시 실행될 수 있습니다. 재개 중단 가능한 main 함수를 통해 작업이 재개되는 원리를 살펴보겠습니다.suspend fun main() { println("Before") println("After")}/..
코틀린의 시퀀스는 컬렉션이랑 비슷한 개념이지만, 필요할 때마다 값을 하나씩 계산하는 지연(lazy) 처리를 합니다. 시퀀스의 특징은 다음과 같습니다. 요구되는 연산을 최소한으로 수행한다. 무한 시퀀스가 가능하다. 메모리 사용이 효율적이다. 이러한 특징 때문에 값을 순차적으로 계산하여 필요할 때 반환하는 빌더를 정의하는 것이 좋습니다. 시퀀스의 람다 표현식 내부에는 yield 함수를 호출하여 시퀀스의 다음 값을 생성합니다. val seq = sequence { yield(1) yield(2) yield(3) } fun main() { for (num in seq) { print(num) } // 123 } sequence는 수신 객체 지정 람다 함수이며, 람다 내부에서 수신 객체인 this는 Sequenc..
코틀린 코루틴은 멀티플랫폼에서 작동시킬 수 있기 때문에 코틀린을 사용하는 모든 플랫폼(JVM, JS, iOS 또는 다른 모듈들)을 넘나들며 사용할 수 있습니다. 프론트엔드 단에서 애플리케이션 로직을 구현할 때 가장 흔하게 사용하는 방법은 다음과 같습니다. 하나 또는 다양한 소스(API, 뷰 구성요소, 데이터베이스, 설정, 다른 애플리케이션)로부터 데이터를 얻어온다. 데이터를 처리한다. 가공된 데이터로 무엇인가를 한다(뷰를 통해 보여 주기, 데이터베이스에 저장하기, API로 전송하기 등) fun onCreate() { val news = getNewsFromApi() // 데이터를 얻어온다. val sortedNews = news .sortedByDescending { it.publishedAt } // ..