본문 바로가기

분류 전체보기

(99)
Coroutine Details 지극히 개인적인 생각들 Kotlin 을 독학하고 사용한 지 1년이 조금 넘는 기간 동안, 수없이 많은 코루틴 코드를 작성해왔습니다. 처음에는 단순히 비동기 처리를 위한 수단으로만 사용하였고, 코루틴이 뭔지도 잘 모르고 사용했습니다. 코루틴의 가장 큰 장점인 동기식 코드 작성법 자체를 사용하지 않았으며, Flow 의 존재도 몰라 비동기 함수 실행 결과 데이터를 고차함수로 넘겨주곤 했습니다. 그래도 현재는 조금 익숙해져서 모듈화에도 적용하고, Flow 도 사용하면서 이런저런 방식으로 사용하고 있는데요. 그럼에도 불구하고 자세히 학습하지 않아 긴가민가한 부분들도 있고, 당연한 것임에도 뭐가 뭔지 잘 모르는 것들도 많습니다. 오늘은 해당 부분들에 대해 학습한 뒤 기록해 봅니다. 1. Job 처음은 가볍게 Job..
StateMachine 과 Stackless Coroutine Coroutine Coroutine(코루틴) 은 비선점형 멀티태스킹 솔루션입니다. 동시성 프로그래밍을 구현하기 위한 기법으로, Kotlin 은 언어차원에서 제공합니다. 코루틴에 관한 설명은 다음 포스트에 자세히 기록해두었습니다. 그린 스레드와의 비교는 덤이구요! 코루틴과 그린 스레드 Coroutine 코루틴은 작업 수행을 일시 정지 및 재개될 수 있도록 하는 프로그래밍 구성요소입니다. 코루틴은 서브루틴을 일반화합니다. 협력 작업, 예외, 이벤트 루프, 반복자, 무한 목록 및 파이프 blothhundr.tistory.com 코루틴 작동 원리 위는 코루틴의 작동 원리를 가장 간결하게 표현하는 이미지입니다. Routine 은 일반적으로 하나의 태스크, 함수를 의미하고, 접두사 Co- 는 '협력' 또는 '함께'..
올파우스 - 350+ 의 커밋이 있는 프로젝트를 스톱한 이야기 AllPouse 향수를 전문적으로 취급하는 샵을 House 라고 표현한다는 기획자분의 말에 의해 결정된 명칭인 . 저와 팀원들이 만들던 퍼스널 퍼퓸 매칭 앱의 이름입니다. 꽤 긴 시간동안 작업을 진행하다가, 결국엔 스톱하게 되었습니다. 오늘은 이 이야기를 해보려고 합니다. 어떤 앱인가? 유저가 보유한 향수와 좋아하는 향과 이미지를 획득하여 어울리는 향수를 매칭해주는 앱입니다. 커뮤니티 위주의 앱인데, 조향사 커뮤니티를 통해 시장의 지분을 가져가려는 전략을 취했습니다. 이 외에도 향수에 대한 리뷰 기능과 제품 설명 기능도 포함되었습니다. 스플래시 화면입니다. 화면에 사용된 로고는 앱 아이콘으로 기능하기도 하였습니다. 직접 아이디어를 구상하여 제작한 아이콘입니다. 온보딩 화면입니다. 좌측 하단의 인디케이터는..
2023 찰스의 안드로이드 컨퍼런스 첫 컨퍼런스 회고 2023년 05월 21일, 역삼역 근처의 마루 180 에서 진행되었던 2023 찰스의 안드로이드 컨퍼런스에 다녀왔습니다. 인생 첫 컨퍼런스였는데, 꽤 좋은 경험이었습니다. 1. 잠깐! content description이 null이라규!? 타이틀 자체는 Jetpack Compose Image Composable 의 속성은 contentDescription 관련 세션으로 보이지만, 실제 내용은 단순히 그것에만 국한되지는 않고, 접근성이라는 대주제에 대한 어프로치였습니다. 특히 장애를 가진 유저의 접근성을 집중 조명하셨는데, 대부분의 개발자가 딱히 신경쓰지 않는 포인트라고 생각합니다. Image 관련 예제만 조금 찾아보아도, contentDescpription 을 null 로 설정하는 예제..
[Jetpack Compose] List 아이템의 필드 변경이 Recomposition 을 트리거 해야 할 때 어떤 이슈가 있었나? List 내 원소의 필드를 직접 수정하여 UI 를 업데이트 하려 하였으나, 생각하는 대로 되지 않았습니다. 당연히, 해당 List의 객체가 이전의 객체와 같으므로 UI 업데이트가 진행되지 않았으리라 판단하고, 해당 List에 대해 toMutableList() 메서드를 사용하여 새로운 객체로 반환했습니다. RecyclerView 와 RecyclerView.Adapter 를 사용할 때에 이러한 문제를 해결할 수 있었으니까요. 분명히 List 객체도 변경해주었고 State 객체를 업데이트 해주었음에도 불구하고, UI 가 업데이트되지 않고 있습니다. 어떻게 해결하였나? List의 toMutableList() 메서드는 List를 새로운 객체로 반환하지만, List 아이템의 객체들까지 새로운 ..
Kotlin Closure Closure Closure (Close over) 기능을 최초로 제공한 언어는 1958년, John McCarthy 에 의해 개발된 언어 Lisp 입니다. Closure 를 포함한 수많은 현대적 프로그래밍 개념과 아이디어를 선보인 언어죠. Lisp 에서는 함수 정의 시, 외부 변수를 캡처하고 사용할 수 있었기 때문에, Closure 의 개념이 최초로 등장한 것으로 여겨집니다. 오늘은 Kotlin 의 Closure 를 알아봤습니다. For what? Closure 는 임의의 함수 내에서 외부 가변 변수를 캡처하고, 그 변수에 액세스 및 재할당할 수 있도록 하는 기능을 제공합니다. 개념 자체가 다소 복잡한데요. Closure 내에서 Capture 되었을 때 해당 변수가 Modified 되기 위해 Refer..
[Jetpack Compose] LazyColumn, LazyRow 의 항목 삭제가 정상적으로 이루어지지 않는 이슈 개발 도중, 제목과 같은 이슈가 발생했습니다. 아래는 이해를 돕기 위한 영상입니다. 야키토리, 휘낭시에, 스시, 생고기 네 장의 사진을 불러왔고, 그 중 두 개의 사진을 삭제합니다. LazyList 의 itemsIndexed() 메서드를 사용했고, 리스트에서의 삭제를 위해 index 를 인자로 넘깁니다. 첫번째로는 스시를 삭제하고, 두번째로는 휘낭시에를 삭제합니다. 그렇다면, 남아있어야 할 사진은 야키토리와 생고기이지만, 실제로 삭제 후 화면에 남은 사진은 야키토리와 휘낭시에 입니다. 즉, 의도와 다르게 엉뚱한 이미지가 삭제되는 것(처럼 보이는 상황)입니다. 위와 같은 상황을 겪고 계신다면, 당연히 디버깅을 진행하셨으리라 생각합니다. 디버깅 해보신 분들은 아시겠지만, 리스트에서는 정상적으로 의도한 사진이..
Generics 와 Reified 키워드 본 포스팅은 CustomResponseHandler 를 구현하다 알게 된 사실에 대해 기록한 것입니다. API 통신을 통해 받아 온 결과가 성공일 수도 있고 실패일 수도 있는데, 기존의 프로젝트 구조에서는 총 두 번의 분기처리가 필요했습니다. Generics 를 이용하여 소정의 목표 (하나의 객체가 성공 및 실패 두 가지 경우의 결과를 모두 필드로 가짐, 발생하는 Exception 을 CoroutineExceptionHandler 에서 처리하게 하여 한 번의 분기처리만이 필요하도록 구현함.) 를 달성할 수 있었습니다. 그 과정 중 reified 를 사용하게 되었고, 이에 관해 복기하며 개념을 다지고자 합니다. Generics 저는 개인적으로 Generics 야말로 정적 타입 지정 언어의 꽃이라 생각합니다..