목록Kotlin (81)
안드로이드 개발자 노트
9.1. 일시 중단 함수와 코루틴9.1.1. 일시 중단 함수란 무엇인가? 일시 중단 함수는 suspend fun 키워드로 선언되는 함수로 주로 코루틴의 비동기 작업과 관련된 코드들을 구조화 하고 재사용할 수 있는 코드의 집합으로 만드는데 사용된다.fun main() = runBlocking { delayAndPrintHelloWorld() delayAndPrintHelloWorld()}suspend fun delayAndPrintHelloWorld() { delay(1000L) println("Hello World")}9.1.2. 일시 중단 함수는 코루틴이 아니다 일시 중단 함수는 코루틴 내부에서 실행되는 코드의 집합일 뿐, 코루틴이 아니다.fun main() = runBlocking { val..
8.1. 코루틴의 예외 전파 8.1.1. 코루틴에서 예외가 전파되는 방식 코루틴에서 예외가 발생하면, 그 코루틴은 취소되고 예외가 부모 코루틴으로 전달된다.부모 코루틴에서도 예외가 처리되지 않으면 루트 코루틴까지 예외가 전파될 수 있다. 예외 전파를 제대로 막지 못해 루트 코루틴이 취소되면 구조화된 코루틴이 모두 취소될 수 있다. 8.1.2. 예제로 알아보는 예외 전파fun main() = runBlocking { launch(CoroutineName("Coroutine1")) { launch(CoroutineName("Coroutine3")) { throw Exception("예외 발생") } delay(100L) println("[${Thread.currentThrea..
구조화된 코루틴의 대표적인 특징은 다음과 같다. 부모 코루틴의 실행 환경이 자식 코루틴에게 상속된다.작업을 제어하는 데 사용된다.부모 코루틴이 취소되면 자식 코루틴도 취소된다.부모 코루틴은 자식 코루틴이 완료될 때까지 대기한다.CoroutineScope를 사용해 코루틴이 실행되는 범위를 제한할 수 있다.fun main() = runBlocking { launch { // 부모 코루틴 launch { // 자식 코루틴 println("자식 코루틴 실행") } }} 7.1. 실행 환경 상속 7.1.1. 부모 코루틴의 실행 환경 상속 부모 코루틴이 자식 코루틴을 생성하면 부모 코루틴이 CoroutineContext가 자식 코루틴에게 전달된다.fun main() = runBlocking..
CoroutineContext는 코루틴을 실행하는실행 환경을 설정하고 관리하는 인터페이스로 CoroutineContext 객체는 CoroutineDispatcher. CoroutineName, Job 등의 객체를 조합해 코루틴의 실행 환경을 설정하는 등 핵심적인 역할을 한다. 6.1. CoroutineContext의 구성요소 CoroutineContext 객체는 CoroutineName, CoroutineDispatcher, Job, CoroutineExceptionHandler의 네 가지 구성 요소를 가진다. CoroutineName: 코루틴의 이름을 설정한다.CoroutineDispatcher: 코루틴을 스레드에 할당해 실행한다.Job: 코루틴의 추상체로 코루틴을 조작하는 데 사용된다.Corouti..
코루틴 라이브러리는 비동기 작업으로부터 결과를 수신해야 하는 경우를 위해 async 코루틴 빌더를 통해 결괏값을 수신받을 수 있도록 한다. 5.1. async 사용해 결괏값 수신하기 5.1.1. async 사용해 Deferred 만들기public fun CoroutineScope.async( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> T): Deferredasync 함수는 CoroutineDispatcher를 설정할 수 있는 context 인자와 지연 시작할 수 있는 start 인자 그리고 ..
코루틴 빌더는 코루틴을 생성하는 데 사용되는 함수이다. 모든 코루틴 빌더 함수는 코루틴을 만들고 코루틴을 추상화한 Job 객체를 생성한다.Job 객체는 코루틴의 상태를 추적하고 제어하는데 사용된다.코루틴은 일시 중단할 수 있는 작업으로 실행 도중 일시 중단된 후 나중에 이어서 실행될 수 있다.Job 객체는 코루틴을 제어할 수 있는 함수와 상태 값을 외부에 노출한다. 4.1. join을 사용한 코루틴 순차 처리 Job 객체는 join 함수를 제공해 먼저 처리돼야 하는 코루틴의 실행이 완료될 때까지 호출부의 코루틴을 일시 중단하도록 만들 수 있다. 4.1.1. 순차 처리가 안 될 경우의 문제 네트워크 요청 시 인증 토큰이 필요한 상황에서, 네트워크 요청은 인증 토큰 업데이트가 완료된 후에 실행돼야 한다.f..
Dispather는 '보내다'라는 뜻의 dispatch에 -er이 붙어 '무언가를 보내는 주체'라는 뜻이다.따라서 여기에 코루틴이 더해진 CoroutineDispatcher는 코루틴을 보내는 주체가 된다. CoroutineDispater는.. 코루틴을 스레드로 보내 실행시키는 역할을 한다.코루틴을 스레드로 보내는 데 사용할 수 있는 스레드나 스레드풀을 가진다.코루틴을 실행 요청한 스레드에서 코루틴이 실행되도록 만들 수 있다.코루틴의 실행을 관리하는 주체이다. 3.1.1 CoroutineDispatcher의 동작 살펴보기 위와 같이 2개의 스레드로 구성된 스레드풀을 사용할 수 있는 CoroutineDispater 객체가 있다고 가정했을때, 순서는 다음과 같다. CoroutineDispatcher 객체에..
코루틴 부모-자식 관계의 특성은 다음과 같습니다. 자식은 부모로부터 컨텍스트를 상속받는다. 부모는 모든 자식이 작업을 마칠 때까지 기다린다. 부모 코루틴이 취소되면 자식 코루틴도 취소된다. 자식 코루틴에서 에러가 발생하면, 부모 코루틴 또한 에러로 소멸한다. 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..