목록분류 전체보기 (99)
안드로이드 개발자 노트
11.2. CoroutineStart의 다양한 옵션들 살펴보기 코루틴 빌더 함수의 start 인자로 받는 CoroutineStart에 대해 다뤄본다.public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Job CoroutineStart.DEFAULTCoroutineStart.ATOMICCoroutineStart.UNDISPATCHED 11.2.1. CoroutineStart.DEFAULT CoroutineStart.DEFAULT는 ..
11.1. 공유 상태를 사용하는 코루틴의 문제와 데이터 동기화 11.1.1. 가변 변수를 사용할 때의 문제점 멀티 스레드 환경에서 가변 변수에 동시에 접근해 값을 변경하면 데이터 동기화 문제가 발생할 수 있다.var count = 0fun main() = runBlocking { withContext(Dispatchers.Default) { repeat(10_000) { launch { count += 1 } } } println("count = ${count}")}/*// 결과1:count = 9062 // 매번 다른 값이 나온다.// 결과2:count = 9019 // 매번 다른 값이 나온다.// 결과3:count = 8644 // 매번 다른 값이 나온다..
10.1. 서브루틴과 코루틴 10.1.1. 루틴과 서브루틴 루틴은 특정한 일을 하기 위한 일련의 처리 과정이며, 함수 또는 메서드라고 부른다.서브루틴은 함수의 하위에서 실행되는 함수를 말하며, 루틴에서 서브루틴이 호출되면 서브루틴이 완료될 때까지 루틴이 아무런 작업을 할 수 없다. 10.1.2. 서브루틴과 코루틴의 차이 한 번 실행되면 실행이 완료될 때까지 스레드를 사용하는 서브루틴과 다르게 코루틴은 스레드 사용 권한을 양보하며 함께 실행된다.10.2. 코루틴의 스레드 양보 스레드를 양보하는 주체는 코루틴으로, CoroutineDispatcher는 코루틴이 스레드를 양보하도록 강제하지 못한다.코루틴에서 스레드 양보를 위한 함수가 호출되지 않는다면 코루틴은 실행 완료될 때까지 스레드를 점유한다.10.2.1..
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 객체에..