본문 바로가기

Kotlin

(14)
Effective Kotlin, 좋았던 부분들. 동기 요 며칠 간 마르친 모스칼라의 저서 을 집중적으로 읽었습니다. 언어에 대한 이해도를 높이고 싶었기 때문입니다. 언어에 대한 이해도가 높아지면 보다 가독성이 높고 간결한 코드를 작성할 수 있게 되니까요. 물론 정리를 하지 않은 것은 아닙니다. 책을 읽으면서 옵시디언에 별도로 정리를 해뒀는데, 사실 다시 보게 되지는 않더라고요. 그래서 이번 기회에, 정말 중요하다 싶었던 내용들에 대해서 다시 한 번 정리하기 위해 포스팅합니다. 어떤 책이었나? 개인적으로는 좋은 내용들이 굉장히 많았습니다. '이런 것도 된다고?' 싶을 정도로 신기한 부분도 있었고, 평소에 꽤 당연하게 여기는 부분들에도 깊은 수준의 이해를 위한 설명이 포함되어 있기도 했습니다. 다만, 코틀린을 처음 접하는 이들에게 추천할만한 서적은 아닌 ..
Coroutines 파헤치기 동기 최근 꽤나 많은 Retrofit 통신 코드를 작성하게 되어, 자연스럽게 Coroutines 코드를 함께 작성하고 있습니다. 그 과정 중에 궁금했던 부분들이 많았습니다. 최근에 Flow 의 취소에 관련된 포스트와 Retrofit 의 통신 방법에 관한 포스트를 작성하면서 참고했던 레퍼런스에도 Coroutines 키워드를 심심찮게 만날 수 있었는데, 와중에도 궁금한 점들이 계속해서 생겨났습니다. 구조에 대해 깊게 알게 되면, 실제로 코드를 작성할 때에도 해당 기술의 어떠한 포인트에 유의하며 작성해야 하는지 알 수 있게 됩니다. 그러한 의미에서, Coroutines 에 대해 자세히 알아보고자 합니다. Kotlin Coroutines 사실, 이미 Coroutines 에 관한 여러 포스트를 작성했습니다. 아래..
Flow Cancellation (feat. Exception Handling) Flow Flow 는 순차적으로 값을 보내고 성공 또는 예외와 함께 완료되는 비동기 데이터 스트림입니다. Flow 에 대해서는 이전에 포스팅한 글이 있으니, Flow 에 대한 이해가 부족하시다면 다음 글을 참고해주세요. Flow 제대로 알기 안드로이드 개발을 진지하게 하고 계시다면, 앱 아키텍처에 대해 잘 알고 계시리라 생각합니다. 특히 MVVM 의 개념적 설명에 대해서는 정말 여기 저기서 많이 보셨을 겁니다. 저는 처음 MVVM 을 데 blothhundr.tistory.com Flow 는 데이터를 방출, 가공, 수집할 수 있도록 합니다. 수집은 필히 CoroutineScope 내에서 이루어져야 하는데, 이는 Flow 가 비동기 데이터를 처리하기 위해 설계 및 구현되었기 때문입니다. '방출한 데이터를 가..
Coroutine Details 지극히 개인적인 생각들 Kotlin 을 독학하고 사용한 지 1년이 조금 넘는 기간 동안, 수없이 많은 코루틴 코드를 작성해왔습니다. 처음에는 단순히 비동기 처리를 위한 수단으로만 사용하였고, 코루틴이 뭔지도 잘 모르고 사용했습니다. 코루틴의 가장 큰 장점인 동기식 코드 작성법 자체를 사용하지 않았으며, Flow 의 존재도 몰라 비동기 함수 실행 결과 데이터를 고차함수로 넘겨주곤 했습니다. 그래도 현재는 조금 익숙해져서 모듈화에도 적용하고, Flow 도 사용하면서 이런저런 방식으로 사용하고 있는데요. 그럼에도 불구하고 자세히 학습하지 않아 긴가민가한 부분들도 있고, 당연한 것임에도 뭐가 뭔지 잘 모르는 것들도 많습니다. 오늘은 해당 부분들에 대해 학습한 뒤 기록해 봅니다. 1. Job 처음은 가볍게 Job..
Kotlin Closure Closure Closure (Close over) 기능을 최초로 제공한 언어는 1958년, John McCarthy 에 의해 개발된 언어 Lisp 입니다. Closure 를 포함한 수많은 현대적 프로그래밍 개념과 아이디어를 선보인 언어죠. Lisp 에서는 함수 정의 시, 외부 변수를 캡처하고 사용할 수 있었기 때문에, Closure 의 개념이 최초로 등장한 것으로 여겨집니다. 오늘은 Kotlin 의 Closure 를 알아봤습니다. For what? Closure 는 임의의 함수 내에서 외부 가변 변수를 캡처하고, 그 변수에 액세스 및 재할당할 수 있도록 하는 기능을 제공합니다. 개념 자체가 다소 복잡한데요. Closure 내에서 Capture 되었을 때 해당 변수가 Modified 되기 위해 Refer..
Generics 와 Reified 키워드 본 포스팅은 CustomResponseHandler 를 구현하다 알게 된 사실에 대해 기록한 것입니다. API 통신을 통해 받아 온 결과가 성공일 수도 있고 실패일 수도 있는데, 기존의 프로젝트 구조에서는 총 두 번의 분기처리가 필요했습니다. Generics 를 이용하여 소정의 목표 (하나의 객체가 성공 및 실패 두 가지 경우의 결과를 모두 필드로 가짐, 발생하는 Exception 을 CoroutineExceptionHandler 에서 처리하게 하여 한 번의 분기처리만이 필요하도록 구현함.) 를 달성할 수 있었습니다. 그 과정 중 reified 를 사용하게 되었고, 이에 관해 복기하며 개념을 다지고자 합니다. Generics 저는 개인적으로 Generics 야말로 정적 타입 지정 언어의 꽃이라 생각합니다..
by 를 사용한 Kotlin 의 Delegation Pattern 안드로이드 개발을 하다보면 iOS 에서의 코드를 봐야하는 경우가 종종 있습니다. iOS 에서의 개발은 화면간의 데이터 공유 및 액션을 위해 Delegation Pattern 을 사용합니다. 제가 알고 있는 코틀린에서의 Delegation 은 늦은 초기화를 위한 by lazy 와 by viewModels() 정도가 거의 전부였기에 코틀린의 Delegation 을 알아보고 싶었습니다.. 먼저, 상속과 조합. Delegation Pattern 에 대해 파악하는 과정 중 유난히 많이 접한 것은 is-A 와 has-A 관계입니다. is-A 관계 is-A 는 상속을 의미합니다. 예를 들자면 Developer is Job, Tiger is Animal 정도가 있겠습니다. 클래스가 임의의 클래스를 상속하게 되면, 클래..
확장 함수 간단 정리 코틀린은 클래스 상속이나 데코레이터 패턴 등을 사용하지 않고도 클래스나 인터페이스를 확장하는 기능을 제공합니다. 이를 확장 함수라 이릅니다. 사용법이 간단해서 여기 저기 써먹기 좋습니다. 기본적인 사용법은 다음과 같습니다. fun Int.multiplier(parameter: Int) : Int { return this * parameter } 정수값에 multiplier(n) 메서드를 호출하면 해당 정수값 x n 해주는 함수입니다. fun main() { 12.multiplier(3) } // Console System.out: 36 제가 직접 사용중인 예제는 아래와 같습니다. private fun ArrayList?.addIfExists(text: String) { this.let { it?.add(..