지난 callbackFlow에 이어서 callback를 coroutine 형태로 받을 수 있는 suspendCoroutine과 suspendCancellableCoroutine에 대해 알아보려고 합니다. 1. suspendCoroutine public suspend inline fun suspendCoroutine( crossinline block: (Continuation) -> Unit): T { } 먼저 suspendCoroutine에 대해 알아보도록 하겠습니다. 내부 코드와 함께 적힌 설명을 살펴보면, block 람다 함수는 Continuation 객체를 인자로 받으며, 비동기 작업이 완료되면 결과를 이 Continutaion 객체를 통해 반환합니다. Continuation 객체는 현재 코루틴 상..
라이브러리나 sdk에서 callback 형태로 받는 API를 Flow로 받고 싶을 땐 어떻게 해야 할까요?! callbackFlow, suspencoroutine 등을 이용하여 Flow로 받을 수 있습니다. 이번에는 callbackFlow에 대해 공부해보려고 합니다. 1. callbackFlow란 public fun callbackFlow(@BuilderInference block: suspend ProducerScope.() -> Unit) : Flow = CallbackFlowBuilder(block) callbackFlow는 callback을 Flow로 변환할 수 있는 Flow Builder입니다. 공식 문서에 따르면, ProducerScope를 통해 빌더 블록의 코드에 전달된 SendChannel..
Flow는 스스로 라이프사이클을 알지 못하기 때문에 CoroutineScope에 따라 생명주기에 따라 맞추어 사용하며 불필요한 메모리나 리소스가 낭비되지 않도록 하는 것이 중요합니다! 이번에는 LifecycleOwner.launchWhenStarted, Lifecycle.repeatOnLifecycle 등이 어떻게 다른지 알아보고 어떻게 불필요한 리소스 낭비를 방지해야 할지 알아보려고 합니다. lifecycleScope.launch private val _stateFlow = MutableStateFlow(0) val stateFlow get() = _stateFlow private fun testCount() { viewModelScope.launch(Dispatchers.IO) { repeat(10)..
최근 MVI를 공부하면서 여러 예제 프로젝트를 보면서 공부하던 중 Channel을 이용하여 상태값을 주고 받는 것을 알게 되었습니다. 이참에 Channel에 대해서도 알아보고자 합니다! 1. Channel 이란 Channel은 두개의 Coroutine 사이를 연결한 파이프이며, 단방향보다는 여러 방향에서 데이터를 주고 받는 형식으로 코루틴끼리 데이터를 전달하기 위한 것입니다. Channel은 BlockingQueue와 유사하지만, 약간의 차이점이 존재합니다. BlockingQueue은 put(), take()를 사용하여 차단해서 전송하는 방법이고 Channel은 send(), receive()를 사용하여 일시중단(suspend)으로 전송하는 방식입니다. 또한, Channel은 더 이상 사용하지 않을 때 ..
Kotlin에는 확장 함수(Extension Function)가 존재합니다. 확장 함수를 사용하면 여러 장단점이 존재하며 Android 개발을 할 때도 종종 사용되곤 합니다! 오늘은 확장 함수에 대해 정리해보도록 하겠습니다. 먼저 확장 함수가 무엇인지에 대해 알아보도록 하겠습니다. 확장 함수(Extension Function)이란? 코틀린은 클래스에 상속하거나 디자인 패턴을 사용하지 않고 새로운 기능으로 클래스를 확장할 수 있는 기능을 제공하는데 이것이 확장(extension)이라는 선언을 통해 이루어지게 됩니다. 이때 추가적인 메소드를 구현하면 이를 확장 함수 라고 하고 추가적인 프로퍼티를 구현하면 확장 프로퍼티라고 합니다. 마치 기본 클래스에 정의된 함수인 것처럼 새로운 기능을 추가하는 기능! 언제 ..
지난번에 면접에서 해당 질문을 받았는데 제대로 답하지 못했습니다... 다시 정리하며 기억하기 위해 enum클래스와 sealed클래스의 차이점에 대해 알아보려고 합니다. Enum class vs Sealed class 👉🏻둘다 타입을 제한적으로 사용하고자 할 때 많이 사용하게 됨. - `Enum`에서는 특정 값을 single instance로서 하나의 객체만 제한적으로 사용할 수 있으며, 생성자의 형태도 동일해야만 한다. - `Sealed`에서는 state을 포함하고 있는 여러개의 instance를 가질 수 있고, 생성자도 각각의 특징에 따라서 다르게 가져갈 수 있다. ⇒ 정적인 아닌 다양한 state를 사용할 수 있다. 🎈Sealed Class - 자기 자신이 추상 클래스이고, 자신을 상속받는 여러 서브..
Dispatcher에 Coroutine을 붙이는 작업을 하기 위해서는 async와 launch 두 가지 메소드를 이용할 수 있습니다. 그렇다면 launch와 async에 차이점과 언제 사용해야하는지 알아보려고 합니다! launch란 launch를 통해 코루틴 블록을 만드는 것을 코루틴 빌더 생성이라고 하며, launch는 현재 스레드를 차단하지 않고 새로운 코루틴을 실행할 수 있으며 특정 결과값 없이 Job 객체를 반환합니다. fun main() { val job = GlobalScope.launch { delay(1000L) println("coroutine launch") } println("call in main") println("job is Active: ${job.isActive}, Compl..