본문 바로가기

Kotlin

[코루틴] 코루틴의 동작 방식 코루틴 동작 방식코루틴은 일시 중단이 가능하고 필요한 시점에 다시 실행을 재개할 수 있는 기능을 가진다일시 중단과 재개를 위해 코루틴의 실행 정보 저장이 필요 Continuation Passing Style (CPS)continuation(이어서 실행해야 하는 작업)을 전달하는 스타일의 방식함수는 결과를 직접 반환하는 대신, 결과를 처리할 다음 단계(continuation)를 인자로 받고실행이 완료되면 continuation을 호출하여 다음 단계 시작// CPS 스타일fun CpsFunction(arg, (result) -> { /* next 작업 */ }) // 일반 함수fun generalFunction(arg) // compile 시 cps 스타일로 변경되는 suspendsuspend fun doS.. 더보기
[코루틴] 무제한 디스패처 (Unconfined Dispatcher) 무제한 디스패처 (Unconfined Dispatcher)코루틴을 실행시킨 스레드에서 즉시 실행하도록 만드는 디스패처호출된 스레드가 무엇인지 상관없어 실행 스레드가 제한되지 않아 무제한 디스패처fun main() = runBlocking { launch(Dispatchers.Unconfined) { println("launch 실행 스레드 : ${Thread.currentThread().name}") }}// 결과launch 실행 스레드 : main  특징코루틴을 생성한 스레드에서 즉시 실행fun main() = runBlocking(Dispatchers.IO) { println("runBlocking 실행 스레드 : ${Thread.currentThread().name}").. 더보기
[코루틴] CoroutineStart CoroutineStart코루틴의 실행 옵션 DEFAULT, ATOMIC, LAZY, UNDISPATCHEDpublic enum class CoroutineStart { // context에 따라 코루틴 실행을 즉시 예약 DEFAULT, // 필요할 경우 lazy하게 코루틴 시작 LAZY, // context에 따라 실행할 코루틴을 원자적으로 예약 // Default와 유사하지만 코루틴은 실행을 시작하기 전에 취소될 수 없다 ATOMIC, // 현재 스레드에서 첫 번째 중단 지점까지 코루틴을 즉시 실행 UNDISPATCHED; ...} 사용 방법코루틴 빌더 함수 인자로 전달public fun CoroutineScope.launch( con.. 더보기
[코루틴] 코루틴의 스레드 동작 코루틴은스레드 사용이 필요 없어지면 스레드 양보스레드를 양보하는 주체 CoroutineDispatcher는스레드에 코루틴을 할당 코루틴이 스레드를 양보하려면 스레드 양보 함수를 호출해야 한다그러지 않으면 완료될 때까지 스레드를 점유 코루틴에서 스레드를 양보하는 방법delayjoin, awaityield delay 일시 중단 함수fun main() = runBlocking { val startTime = System.currentTimeMillis() repeat(10) { repeatTime -> launch { // delay로 1초 동안 메인 스레드 사용하도록 양보 delay(1000L) // Thread.sleep(1.. 더보기
[코루틴] 코루틴(Coroutine)과 서브루틴(Subroutine) Routine (루틴)특정한 일을 하기 위한 일련의 명령(함수) Subroutine (서브루틴)함수 내에서 실행되는 다른 함수 루틴과 서브루틴fun main() = runBlocking { mainRoutine() // main의 서브루틴}fun mainRoutine() { mainSubRoutine1() // mainRoutine의 서브루틴 mainSubRoutine2() // mainRoutine의 서브루틴}fun mainSubRoutine1() { ... }fun mainSubRoutine2() { ... } 서브루틴 특징한 번 호출되면 끝까지 실행 서브루틴 실행 시 스레드가 사용되어 서브루틴 종료시까지 루틴은 다른 작업 X Coroutine (코루틴)함께(Co) 실행되는 루틴.. 더보기
[코루틴] 일시 중단 함수 - suspend 일시 중단 함수1. suspend fun 키워드로 선언되고 함수 내에 일시 중단 지점을 포함하는 함수2. 일시 중단 지점이 포함된 코드를 재사용이 가능한 단위로 추출3. 코루틴 내부에서 실행되는 코드의 집합일 뿐 코루틴이 아니다 fun main() = runBlocking { delay(1000L) println("Hello World") delay(1000L) println("Hello World")}// 결과Hello WorldHello World 일시 중단 함수를 사용해 위 코드를 수정suspend fun delayAndPrint() { delay(1000L) println("Hello World")}fun main() = runBlocking { val sta.. 더보기
[코루틴] 구조화된 동시성 구조화된 동시성 (Structured Concurrency)비동기 작업을 구조화함으로써 프로그래밍을 안정적이고 예측할 수 있게 만드는 원칙  코루틴의 구조화된 동시성 특성Parent - Child 관계fun main() = runBlocking { launch { // 부모 코루틴 launch { } // 자식 코루틴 }}부모 코루틴의 실행 환경(Context)가 자식 코루틴에게 상속Job을 제어하는데 사용부모 코루틴이 취소되면 자식 코루틴도 취소부모 코루틴은 자식 코루틴이 완료될 때까지 대기CoroutineScope을 사용해 코루틴이 실행되는 범위 제한 가능   1. 실행 환경 상속기본적으로 부모 코루틴이 자식 코루틴을 생성하면 Parent CoroutineContext ->.. 더보기
[코루틴] CoroutineContext CoroutineContext란?public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Jobpublic fun CoroutineScope.async( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> T): Deferred 코.. 더보기