본문 바로가기
[Effective Kotlin] Item2 : Minimize the scope of variables 이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서 Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다. # member 변수 대신 local 변수로 정의하거나, 최대한 사용 블록 안으로 변수를 제한하는 등으로 scope 제한을 할 수 있다. # scope 를 제한할수록 프로그램을 이해하고 관리하기 쉽다. # val, var 상관없이, 변수는 정의될 때 init 되는 것이 좋다. # 복수개의 property 를 정의할 때는 destructuring declaration 이 유용하다. fun updateWeather(degrees: Int){ val desc: String val col.. 2022. 2. 16.
[Effective Kotlin] Item1 : Limit mutability 이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서 Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다. # State 관리는 다음의 이유들로 힘들다. State 수가 많을수록 코드의 이해와 디버그가 힘들다. State 들이 상호 연관된 경우는 더더욱 어렵다. Mutable state 는 멀티스레드 환경에서 적절한 동기화를 필요로 한다. Mutable 은 테스트하기도 어렵다. (가능한 state 수가 더 많다고 볼 수 있다.) # Mutability 는 단점이 많아서, state mutation 을 아예 허용하지 않는 언어들도 있다. 순수한 functional programming 인.. 2022. 2. 15.
[android] AudioFocus 관리하기 - 2개 이상의 앱이 audio 를 하나의 stream 으로 동시에 재생할 수 있다. 시스템은 이들을 믹스한다. 이는 유저에게 소음이 될 수 있다. 이를 예방하기 위해서 "Audio Focus" 라는 개념을 도입했고, 하나의 앱만 audio focus 를 가질 수 있다. - 앱이 audio output 을 하려면, audio focus 를 요청해야 한다. focus 를 획득하면 소리를 재생할 수 있다. audio focus 를 획득한 후에 재생을 끝마칠 때까지 focus 를 유지하지 못 할 수 있다. 다른 앱이 focus 를 요청하여 취득하는 경우가 그 경우이다. Focus 를 잃으면 재생을 중단하거나, 볼륨을 줄이는 작업 등을 통해 유저가 새로운 audio 를 잘 들을 수 있게 협조해야 한다. - An.. 2022. 2. 14.
[kotlin] CoroutineContext 에 대한 이해 - Kotlin coroutine 의 핵심은 CoroutieContext interface 이다. 모든 launch, async 같은 coroutine builder 는 첫번째 param 으로 CoroutineContext 를 받는다. 이 coroutine builder 들은 CoroutineScope interface 의 extension function 으로 정의되어 있으며, abstract read-only property 로 coroutineContext 를 가지고 있다. - fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT,.. 2022. 2. 3.
[coroutine] Back-pressure 대응하기 - Back pressure 는 한국어로 "배압" 이라고 하며, Flow 의 세계에서는 emit 되는 속도보다 collect 되는 속도가 느린 현상을 이야기한다. (돼왕: input 이 쌓여 buffer 가 필요한 상황) 이에 대한 해결방법은 여러가지가 있겠다. - 아래와 같은 기본 로직이 있다고 하자. 이 로직은 emit 은 1초 단위로 되는데, collect 는 3초 이상을 소비한다. 즉 back pressure 가 발생하는 것이다. var start = 0L fun currTime() = System.currentTimeMillis() fun emitter(): Flow = (1..5) .asFlow() .onStart{ start = currTime() } .onEach{ delay(1000) p.. 2022. 2. 2.
[coroutine] withContext vs async - withContext 와 async 를 언제 어떻게 쓰면 좋을까? - 동일한 구문을 돌리는 경우 withContext 가 async 보다 약 2배의 성능이 좋았다는 테스트 결과가 있다. https://stackoverflow.com/questions/50230466/kotlin-withcontext-vs-async-await for(1..1_0000_0000){ withContext(context){ // do sth } } vs for(1..1_0000_0000){ async(context){ // do sth }.await() } 메모리 사용량은 큰 차이가 없다고 한다. - 직접 성능 측정해 보았다. launch { val duration = measureTimeMillis { for (i in .. 2022. 2. 1.
[Android] Kotlin and Flow usage # Flow 는 'emit' 으로 data 를 발행하고, 'collect' 로 data 를 받아본다. # DataStore, Retrofit, Room, WorkManager 등에서 Flow 를 지원하고 있다. # flow builder 로 flow 를 쉽게 만들 수 있으며 이 녀석은 suspend block 을 받는다. # collect 역시 suspend block 을 받는다. # final operator 가 지정되기 전까지 flow 는 emit 하지 않으며, downstream 순서대로 로직이 수행된다. # Android UI 에서 collect 를 사용하기 위해서는 아래와 같은 방법이 사용된다. Flow.asLiveData():LiveData // 아래 2개를 추천함 Lifecycle.repea.. 2022. 1. 31.
[Coroutine] Exception handling in coroutine # coroutine builder 에 exception 이 발생하면 parent 를 cancel 하고, parent 가 cancel 되면 모든 children 을 cancel 시킨다. (exception propagation) Stop breaking my coroutines # Exception propagation 은 job 을 기반으로 작동하기 때문에 try-catch 로 잡히지 않는다. SupervisorJob # SupervisorJob 은 한 child 의 exception 이 parent 와 다른 children 을 cancel 시키지 않는다. # 일반적인 실수는 parent coroutine 에 SupervisorJob 을 전달하는 것이다. 예를 들면 launch 에 SupervisorJ.. 2022. 1. 30.
[Coroutine] Coroutine scope functions Approaches before coroutine scope functions # GlobalScope 은 EmptyCoroutineContext 를 사용하므로 다음과 같은 단점을 갖는다. 취소하기 어렵다. -> memory leak, cpu res 낭비 Parent 의 scope 속성을 상속하지 않는다. -> unit test 가 어렵다. # GlobalScope 을 사용하지 않기 위해 CoroutineScope 을 전달하는 경우가 있는데, 이는 또 다른 단점을 야기할 수 있다. 전달받은 scope 를 계속 다른 곳으로 전달하여 사용할 수 있으며, 이 경우 한 곳에서 발생한 exception 이 원하지 않는 다른 job 들을 모두 취소시킬 수 있다. (SupervisorJob 을 사용하지 않았다면) E.. 2022. 1. 29.
반응형