본문 바로가기

Coroutine

[코루틴-Flow] StateFlow (상태플로우) StateFlow (상태플로우)상태플로우는 Hot flow이며 공유플로우의 개념을 확장replay가 1인 공유플로우와 비슷하게 동작접근 가능한 값 하나(value)를 가지고 있다초기값은 생성자로 전달안드로이드에서 LiveData를 대체하는 최신 방식public interface StateFlow : SharedFlow { // 현재 value public val value: T}public fun MutableStateFlow(value: T): MutableStateFlow = StateFlowImpl(value ?: NULL)// StateFlow, MutableSharedFlow 구현public interface MutableStateFlow : StateFlow, Mutable.. 더보기
[코루틴-Flow] SharedFlow (공유플로우) SharedFlow여러 구독자에게 값을 브로드캐스팅하는 데 사용되는 Hot Flow 일반적인 Flow는 Cold Data라 요청 시 값이 계산되지만SharedFlow는 여러 수신자가 동시에 값을 수집할 수 있다// Read-onlypublic interface SharedFlow : Flow { // 현재 replay 버퍼에 저장된 값들의 스냅샷 public val replayCache: List // 절대 완료되지 않는다, 취소되거나 예외가 발생하지 않는 한 영원히 실행 override suspend fun collect(collector: FlowCollector): Nothing}  MutableSharedFlowBroadcast Channel과 비슷replay는 마지막으로 전.. 더보기
[코루틴] Flow 생성 Flow를 시작하는 방법flowOf 사용public fun flowOf(vararg elements: T): Flow = flow { for (element in elements) { emit(element) }}suspend fun main() { flowOf(1, 2, 3, 4, 5) .collect { print(it) }}// 12345  emptyFlow 사용값이 없는 플로우public fun emptyFlow(): Flow = EmptyFlowprivate object EmptyFlow : Flow { override suspend fun collect(collector: FlowCollector) = Unit}suspend fun main().. 더보기
[코루틴] Flow란 - (1) Flow(플로우)코루틴을 기반으로 동작하는 코틀린의 비동기 스트림을 다루기 위한 API순차적으로 값을 방출Cold Stream으로 collect 함수 호출 시 데이터 발행  Flow 인터페이스/*** 값을 순차적으로 내보내고 정상적으로 또는 예외와 함께 완료되는 비동기 데이터 스트림*/public interface Flow { // Flow의 값을 수집하는 함수 // 일시중단 함수로 코루틴 내에서 실행되어야 한다 public suspend fun collect(collector: FlowCollector)}   List vs Sequence vs FlowList모든 원소의 계산이 완료된 Collection작은 데이터 크기에 적합// 한 번에 모든 값을 만드는 Listfun allUser.. 더보기
[코루틴] 핫 데이터와 콜드 데이터 크게 2가지 데이터 소스핫 스트림 데이터 (Hot Stream Data)콜드 스트림 데이터 (Cold Stream Data)  핫 스트림 데이터 (Hot Stream Data)구독자의 유무와 상관없이 데이터 발행즉, 데이터의 소비가 없어도 데이터를 생성List, Set, Channel 등 Channel기본적으로 채널은 Hot Stream// 구독자가 없는 Channel을 사용한 예시// 1. Channel (Hot)suspend fun main(): Unit = coroutineScope { val rendezvousChannel = Channel() launch { // Buffer = 0이고 trySend라 큐에 저장되지 않고 바로 실패 반환, non-blocking .. 더보기
[코루틴] select select 함수가장 먼저 완료되는 코루틴의 결과를 기다리는 함수  지연되는 값 선택suspend fun main(): Unit = coroutineScope { println(askMultipleForData())}val scope = CoroutineScope(SupervisorJob())suspend fun askMultipleForData(): String { val data1 = scope.async { requestData1() } val data2 = scope.async { requestData2() } return select { data1.onAwait { it } data2.onAwait { it } }}suspend fun requ.. 더보기
[코루틴] 코루틴의 동작 방식 코루틴 동작 방식코루틴은 일시 중단이 가능하고 필요한 시점에 다시 실행을 재개할 수 있는 기능을 가진다일시 중단과 재개를 위해 코루틴의 실행 정보 저장이 필요 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}").. 더보기