본문 바로가기

전체 글

[코루틴-Flow] 생명주기 함수, empty, catch, flowOn, launchIn Flow는요청이 한쪽 방향으로 흐르고 요청에 의해 생성된 값이 다른 방향으로 흐르는 파이프 Flow의 확장함수를 통해 특정 이벤트를 감지할 수 있다 대표적인 Flow의 생명주기 함수는onEach, onStart, onCompletion 등이 있다. onEachFlow의 값을 하나씩 받기 위해 사용upstream flow의 각 값이 downstream으로 emit되기 전에 지정된 작업을 수행하는 연산자public fun Flow.onEach(action: suspend (T) -> Unit): Flow = transform { value -> action(value) return@transform emit(value)} 사용 예시suspend fun main0() { flowOf(1, 2.. 더보기
[코루틴] 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 원리 실제 Flow 구현 코드제네릭 타입 TFlowCollector 리시버 suspend 람다 파라미터Flow 반환safeFlow 생성 public fun flow( @BuilderInference block: suspend FlowCollector.() -> Unit): Flow = SafeFlow(block)private class SafeFlow( private val block: suspend FlowCollector.() -> Unit) : AbstractFlow() { override suspend fun collectSafely(collector: FlowCollector) { collector.block() }} SafeFlow 클래스AbstractFlow 상.. 더보기
[코루틴] 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.. 더보기
[코루틴] Channel (채널) Channel (채널)Channel은 송신자(SendChannel을 통해)와 수신자(ReceiveChannel을 통해) 간의 논블로킹 통신을 위한 기본 요소Channel은 Java의 BlockingQueue와 유사하지만 블로킹 연산 대신 일시 중단 연산을 사용하며 닫을 수 있다는 차이가 있다public interface Channel : SendChannel, ReceiveChannel { public companion object Factory { // 무제한 용량의 버퍼를 가진 채널. send가 중단되지 않음 public const val UNLIMITED: Int = Int.MAX_VALUE // 랑데부 채널(버퍼가 없는 채널 - 용량 0) .. 더보기
[코루틴] 코루틴의 동작 방식 코루틴 동작 방식코루틴은 일시 중단이 가능하고 필요한 시점에 다시 실행을 재개할 수 있는 기능을 가진다일시 중단과 재개를 위해 코루틴의 실행 정보 저장이 필요 Continuation Passing Style (CPS)continuation(이어서 실행해야 하는 작업)을 전달하는 스타일의 방식함수는 결과를 직접 반환하는 대신, 결과를 처리할 다음 단계(continuation)를 인자로 받고실행이 완료되면 continuation을 호출하여 다음 단계 시작// CPS 스타일fun CpsFunction(arg, (result) -> { /* next 작업 */ }) // 일반 함수fun generalFunction(arg) // compile 시 cps 스타일로 변경되는 suspendsuspend fun doS.. 더보기