전체 글 24

Kotlin Coroutine 동작을 이해해보기 - Continuation 멈추고 보기

서론 이전 편과 이어서, Continuation이 만들어지는 파일을 보겠습니다. 이전 편에서, Continuation을 상속받는 Impl을 컴파일러가 만들어주고, 라벨 정보와 함께 그에 따른 결과를 가지고 있을 것이라고 추측했는데요, 디버깅을 통해 실제로 그러한지 살펴 보겠습니다. 본론 실제로 디버깅을 한 후 콜스택을 보면 볼 수 있는데요, 다음과 같이 중단점을 걸고 콜스택을 보면 아래와 같습니다. 이제 밑에부터 보면, android os 단의 콜스택은 무시하고, 코루틴 콜스택을 보면 continuation 객체에 라벨 정보와 함께 result final field 안에 정보가 담겨있습니다. 예상했던 대로군요. 이 continuation을 가지고 다시 resumeWith로 가보겠습니다. 이전에 말했던 것..

Kotlin 2023.11.05

Kotlin Coroutine 동작을 이해해보기 - CPS, Continuation 이란?

서론 이번 포스트를 이해하기 위해서는 어렵지만 알아야하는 개념들이 몇가지 있습니다 ㅠㅠ 어려워도 쉽게 풀어서 작성해볼테니 잘따라오시길 바랍니다. 코루틴 내부에서는 CPS를 사용합니다. 이는 Continuation Passing Style을 줄인 말로, 아래 예시를 보면 더 이해하기 쉽습니다. 간단한 CPS 와 Continuation fun postItem(item: Item) { val token = requestToken() val post = createPost(token, item) processPost(post) } 위와 같은 코드가 있다고 하고, (1) requestToken(), (2) createPost(), (3) processPost 모두 suspend point라고 가정하고, postI..

Kotlin 2023.10.24

Kotlin Coroutine 동작을 이해해보기 - Coroutine 이란?

Android 개발을 시작 했을 때, 저는 rxJava를 이용해 서버 통신 등 비동기 프로그래밍을 수행했었습니다. 그런데, 이제는 명백히 flow와 Coroutine이 대세가 된 것을 느낄 수 있습니다 (공식 문서, 컨퍼런스 등등). 이처럼 안드로이드 개발과 Kotlin이 떨어질 수 없게 되면서 Coroutine 또한 당연하게 사용법을 알아야만 했습니다. 그런데, 정작 Coroutine의 Android에서 사용법 (viewModelScope, lifecycleScope.launch 와 같이...)만 알 뿐, Coroutine의 원리는 무엇인지에 대해 깊이 고민해 볼 시간을 가지지 않았습니다. 이에 반성하여, 자세하게 코루틴이 어떻게 동작하는지도 공부해보았습니다. ---------- 장점? 먼저 Corou..

Kotlin 2023.10.11

Kotlin Coroutine 동작을 이해해보기 - JVM에 대해서...

지난 9월 12일, droid knight 2023에 다녀왔었고, 그곳에서 김준비님의 Coroutine Deep Dive 에 대한 강연을 듣고나서, 아직도 Coroutine에 대해서 잘 알지 못하고 있었다고 생각해서, 다시 공부해야봐야겠다는 생각을 했습니다. 강연을 듣다보니, 왜 Coroutine이 경량화된 쓰레드를 사용하는 것 처럼 동작하는지에 대해서도 설명이 나왔는데, 오랜만에 JVM 구조나 동작을 떠올려보려고 했더니, 기억이 나지 않아서 다시금 공부하여 정리하는 기회를 가져보려고 합니다. 이를 통해 kotlin에서 coroutine이 왜, 어떻게 light-weight thread 처럼 동작하는지 이해해보고, 다음 포스트에서 코루틴에 대해서 정리를 이어나가보도록 해보겠습니다. (사실상 part on..

Kotlin 2023.09.25

Lifecycle.State와 repeatOnLifecycle에 대해서

오늘은 Lifecycle State에 대해서 알아보겠습니다. 안드로이드의 Lifceycle에 대해서는 많이 들어보셨겠지만, Lifecycle State는 생소할 수도 있습니다. 왜나하면, 저희는 모르게도 많이 사용되기도 하고, 쓰지만서도 제대로 알지 못하고 사용하기 때문입니다. 먼저 Lifecycle State는 어디서 쓰일까요? 기본적으로 livedata나 flow를 사용할 때 아래와 같은 코드를 아무 생각 없이 사용하시진 않나요 ? a.observe(viewLifecycleOwner) { // do something } viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { movieList.coll..

Android 2023.09.14

Android DeepLink 공백

오늘 내용은 엄청 짧습니다~ Jetpack Compose Navigation 예제중에 DeepLink 예제를 따라하던 도중, 딥링크를 통해 single_account 페이지를 딥링크를 이용해 들어가는데, Checking 이라는 화면은 adb shell am start -d "rally://single_account/Checking" -a android.intent.action.VIEW 와같이 들어가게됩니다. 그런데, Checking이 아닌, Car Savings와 같이 공백이 있는 딥링크는 어떻게 들어갈까요? 정답은~ adb shell am start -d "rally://single_account/Car%20Savings" -a android.intent.action.VIEW 와같이 공백을 %20으로 ..

Android 2022.12.10

Android github actions CI 적용기

진짜 제곧내입니다... github action을 이용한 CI 적용해본 것에 대한 정리 및 WIP로 더 쓸모 있는 것들을 찾아봐야겠다 생각해 정리해봤습니다. CI란? CI/CD 자주 들어보셨겠지만, 여기서는 CI에 대해서만 다룹니다. CI는 무엇일까요~ 위키백과에는 아래와 같이 나와있습니다. 이중 우리는 "지속적인 통합"의 뜻으로 CI를 사용합니다. 어떤 것을 지속적으로 통합할까요? 바로 우리의 소스 코드입니다. 개인 프로젝트에도 적용이 될 수 있지만, 동아리 프로젝트, 회사 규모에서는 하나의 브랜치에 여러 사람들의 코드를 합치게 됩니다. 그런데 이런 코드를 합치는 작업, 즉 코드 통합의 단계에 있어서 반복적인 빌드와 테스트를 사람이 아닌 기계가 자동으로 해준다면.... 얼마나 편할까요? kotlin, ..

Android 2022.12.06

javadoc을 이용해서 협업을 더 쉽게 해보자

사실 코틀린을 쓰는 우리는 Javadoc이 아니라, KDoc이긴 하지만... 어그로를 위해서 javadoc으로 제목을 정했습니다. 어차피 똑같잖아.... 먼저 KDoc, Javadoc을 쓰는 이유는 무엇일까요? 누군가와 협업하기 위해, 수정사항에 대해서 히스토리를 남겨두기 위해 등등 결론적으로 보면 나의 코드를 남에게 조금더 쉽게 이해시켜주기 위해 작성하는 일종의 문서라고 생각하면 됩니다. 라이브러리를 받아 내부를 보다보면 클래스나 함수에 영어와 함께 설명이 쓰여져 있는 것을 볼 수 있습니다. 아래와 같이요! 다만 위의 사진은 java 클래스에서 쓰여진 javadoc이기 때문에 저희가 볼 KDoc이랑은 조금 다른점 알아두시면 좋습니다. 먼저 예시로 피타팻씨는 playMusic이라는 함수를 만들었습니다. ..

Android 2022.11.07

Android API 33대응! onBackPressed()는 deprecated 된다

onBackPressed() is deprecated 안드로이드 13(API Level 33)부터 onBackPressed()가 deprecated 된다는 사실 알고 계셨나요? targetSdk와 compileSdk를 33으로 올리면 아래와 같이 확인하실 수 있습니다. 우리의 뒤로가기를 책임져주었던 onBackPressed() 왜 deprecated가 되는지 알아보고, 어떻게 변경해볼지도 알아봅시다. why deprecated 먼저 deprecated된 이유에 대해서 알아볼텐데요, 안드로이드 10(API Level 29)부터 제스처 탐색 기능을 지원하는데요, 이는 iOS와 동일하게 왼쪽에서 오른쪽으로 스와이프시에 뒤로가기를 실행해주는 기능입니다. 그런데 이러한 기능은 recyclerview에서 horiz..

Android 2022.10.23

Sealed class + StateFlow

서론 최근들어 저는 LiveData를 사용하지 않고, StateFlow를 이용해 UI Data State holder를 처리하는 편입니다. 그런데, 이러한 방식을 이용해 로딩, 에러, 데이터 성공을 모두 표현하기 위해서는 3개의 변수를 가지고 각각의 State에 따라 collect하고 있는 View들의 Visible처리를 바꿔주는 방식으로 사용하곤 했었습니다. 그러나 회사 코드와 여러 예제들을 보니 하나의 변수를 통해, Sealed class를 이용해 위의 세가지 기능을 한번에 처리해줄 수 있다는 것을 알게됐고, 이제부터 사용방법과 이점을 알아보도록 하겠습니다. private val _movieList = MutableStateFlow(emptyList()) val movieList = _movieLis..

Android 2022.10.09