본문 바로가기

코틀린

(17)
[Kotlin/Coroutine] Kotlin Coroutines 101 : 코루틴을 쉽게 이해해보자! 최근에 여유가 생기면서 코틀린부터 코루틴, flow 등 공부하고 싶던 부분들에 대해 다시 들여다보기 시작했다. 공부를 하면서 눈에 쏙 들어왔던 건 Android Developer 채널에 올라온 아래의 영상이었다. Kotlin Coroutines 101 - Android Conference Talks 일전에 Kotlin in action에서 코루틴에 대해 살펴보기는 했지만, 이 영상을 본 뒤론 이 영상만큼 코루틴의 장점과 사용 방법 등에 대해 잘 알려주는 영상은 앞으로도 없지 않을까 싶다! (개발 영상치고 8만회의 뷰를 기록한 것이 하나의 반증이 되지 않을까?) 해당 영상을 기반으로 코루틴의 장점과 의의, 사용 예 등에 대해 다시 한번 정리하고자 한다. 1. 코루틴은 무엇이며, 무엇을 해결해 주는 걸까? ..
[Kotlin] 컬렉션의 lazy 연산을 짚어보자 (Sequence) 코틀린에서는 다양한 형태로 시퀀셜하게 결과값을 이어나가는 코딩이 가능하다. 문제는 컬렉션을 베이스로 시퀀셜하게 코드 블럭을 잇는 경우, 이에 대한 결과값들이 연산 이후마다 만들어지기 때문에 (우리는 최종적인 값만을 필요로 함에도 불구하고) 메모리적으로 비효율 적이라 할 수 있다. (특정 컬렉션에 사용하는 조건이 다양하고 많을 수록 받는 영향은 클 것이다) 이를 위해 코틀린은 Sequence를 제공하고 있는데, 컬렉션에 이를 사용하는 경우 호출 원본 리스트에서 이어진 시퀀셜한 모든 연산을 뒤로 이를 toList 등으로 추출하기 이전까지 어떠한 임시 컬렉션 변수를 생성하지 않는다는 것이다! 방법은 간단한데, 보통 사용하던 컬렉션 API 사용에 앞서 원본 리스트에 asSequence()를 호출하고 사용하는 것..
[Kotlin] 컬렉션 함수형 API로 컬렉션 쉽게 갖고 놀기 개발을 하다 보면 리스트형 변수와 필연적으로 마주하게 되는데, 단순히 이런 컬렉션 객체를 사용하는 것에서 넘어 특정한 조건에 따라 필터링을 한 목록을 얻는다던지, 검색한 모든 결과값에서 원하는 결과가 있는지 확인한다던지 하는 요구사항을 필요로 한 적이 있을 것이다. 코틀린을 사용할 때, 이러한 요구사항을 손쉽게 충족해주는 API를 정리해보고자 한다! 컬렉션 함수형 API 우선 Kotlin in Action에서 소개하는 함수 중 필수적인 함수로 소개하는 filter와 map에 대해 살펴보자. filter filter를 사용하는 경우, 호출하는 대상 컬렉션으로부터 필요한 조건을 filter 코드 블럭에 선언하면 조건에 맞는 List로 이를 반환하게 된다. val targetList = listOf("윤철수"..
[Kotlin] Default Argument와 Named Argument 활용하기 개발을 하게 되면서 일상적으로 마주하는 상황 중에 변수들을 넘겨주기 위한 클래스나 메소드를 설계하고, 이를 활용해야 할 때가 있다. 코틀린은 이런 상황에서 개발자가 그저 설정이 필요 없는 변수들을 넘겨줄 것 없이 손쉽게 개발 할 수 있도록 Default Argument를 제공하고 있다. 1. Default Argument - 정의한 Function 혹은 class의 매개변수를 아래와 같이 설정한다. // 아이스크림을 만드는 function이 있다면? // amount는 만드는 갯수, option은 맛이라고 할 때. fun makeIcecream(amount: Int = 1, option : String = "바닐라"): IceCream { return IceCream(amount, option) } //..
[안드로이드] Kotlin sealed class로 여러 클래스들을 보다 분명하게, 유연하게 활용하기 기존에 MVP 아키텍처 패턴으로 짜여진 프로젝트를 빌드업하면서 몇가지 애로사항이 생겼다. Presenter에서 로직을 수행 후 뷰를 업데이트하기 위한 코드를 최대한 작은 단위로 한정해서, 서로 제약사항이 생기지 않도록 구현하고 있었는데, 문제는 여기서 각 뷰 단위를 업데이트하기 위한 코드가 배로 많아지고, UI가 어떤 코드를 거쳐 업데이트 되는지 한 눈에 파악하기가 어려웠다. 수행하고자 하는 코드를 파라미터의 종류에 따라 구분지을 수는 없을까? 그리고 이를 하나의 함수로 통일시켜 사용할 수 있을까? 특정 함수에 사용하고자 하는 클래스들을 제한해 사용할 수 있을까? 이런 물음들을 Kotlin의 sealed class를 활용해 상당부분 해결할 수 있었다. 1. Sealed Class란 무엇인가? Sealed..
[안드로이드] Material Design의 Chips를 사용해보자 Google은 Material Design과 함께 별도로 안드로이드에서 바로 사용 가능한 Component들을 제공하고 있다. 이 중 필터링 설정이나 작은 텍스트를 보여주는데 유용한 Chips를 사용해봤다. Material Design에서는 다음과 같은 네 종류의 Chip들을 정의하고 있다. Entry Chip Filter Chip Choice Chip Action Chip Entry Chip은 복잡한 정보를 간략하게 보여 줄 때 사용하도록 권장하고 있고, chip 아이콘과 닫기 아이콘을 별도로 설정이 가능하다. 추가적으로 체크 상태(선택된 상태)를 지정이 가능하다. Fliter Chip은 검색 결과나 내용등에 필터를 걸 때 사용하도록 권장하는 chip이다. 추가적으로 체크 상태(선택된 상태)를 지정이 ..
[안드로이드 | 코틀린 ] 뷰가 겹치는 상황에서 터치 우선순위 관리하기 보통 이런저런 상호작용이 들어가는 UI/UX 를 개발하다 보면 겹치는 뷰로 인해 골머리가 썩게 되기 마련이다. 이번 경우에는 BottomSheetBehavor가 적용된 Layout과 부모뷰인 SwipeRefreshLayout간의 간섭으로 인해 생기는 이슈였는데, 펼쳐진 자식뷰가 Swipe 가능한 부모뷰를 전부 덮게 되면서, 스와이프로 내릴 수 있는 자식 뷰를 내리지 못하고 부모뷰를 통째로 스와이프 해버리게 되어 결론적으로 펼쳐지고 나서는 접을 수가 없는 상황이 생겨버렸다. 터치 이벤트의 우선순위를 조정이 가능하단 것은 인지하고 있었는데, 이를 어떻게 지정해주어야 하는가? 검색끝에 깔끔한 해결책을 찾을 수 있었다. 우선순위를 두고자 하는 뷰에 onTouchListener를 넣어 특정 조건에서 부모 뷰에 r..
[안드로이드/MpAndroidChart] MpAndroidChart에서 Marker 커스텀하기 그래프의 바를 터치할 때 해당 데이터를 보여주는 Marker를 구현중에 있었는데, 공식 문서에 안내되어 있는 getOffset()을 Override하는 방식으로는 위치조정을 하는 것이 어려웠다. 구글링을 더 해보니 getXOffset, getYOffset을 override해 사용하는 경우가 많았으나, Kotlin 환경때문인지 몰라도 override 메소드가 보이지 않았다. 최종적으로 MarkerView의 draw 메소드를 override하여 보여주고자 하는 위치를 조정해 보여주는 걸로 구현을 마칠 수 있었다. * MPAndroidChart 3.1.0 버전에서 진행 * BarChart 사용 * Kotlin 베이스 1. BarChart 구성 완료 BarEntry, BarDataSet, Ba..