[Kotlin] inline 함수와 reified
·
Kotlin
inline 함수 인라인 (inline) 키워드는 자바에서는 제공하지않는 코틀린 전용 키워드입니다. 코틀린을 이용하여 개발하다보면, 함수의 파라미터로 고차함수를 넘겨 사용하는 경우가 많습니다. 하지만 코틀린 공식문서에서는 고차함수를 사용하면 메모리 할당 및 가상 호출을 통해 런타임 오버헤드를 발생시켜 특정 런타임 패널티가 부과된다고 소개하고 있습니다. 인라인 함수를 이용하면, 내부적으로 함수의 내용을 함수가 호출되는 위치에 복사하여 런타임 오버헤드를 줄일 수 있습니다. 그렇다면 내부적으로 함수의 내용을 호출하는 위치에 복사한다는 것은 어떤 의미일까요? 아래와 같이 고차함수를 파라미터로 받는 함수가 있습니다. fun executeJob(job: () -> Unit) { println("execute new..
[안드로이드 / Kotlin] FusedLocationProviderClient
·
Android
안드로이드에서는 기본적으로 LocationManager 를 이용하여 위치 정보를 가져올 수 있습니다. LocationManager 는 Context.getSystemService() 메소드를 이용하여 구현할 수 있고, GPS, Wi-Fi, Network 를 통해 직접 요청할 수 있습니다. 하지만 개발자가 상황에 맞게 직접 구현해야 하므로 비교적 구현이 복잡할 수 있습니다. Google Play 서비스에서 제공하는 Location API 를 이용하면, 위의 방법들을 알아서 융합적으로 고려하여 요청하기 때문에 기기의 배터리 사용을 최적화할 수 있습니다. FusedLocationProviderClient 는 해당 API 에서 사용되는 객체이며, 지금부터 이에 대한 간단한 사용법에 대해 알아보겠습니다. 의존성 ..
[안드로이드 / Kotlin] Coroutine Flow debounce를 이용한 검색 구현
·
Android
안드로이드 앱을 개발하다보면 EditText를 이용한 검색 기능을 많이 구현합니다. 하지만 EditText에서 입력값의 변화를 감지할 때마다 API 호출을 하게되면 많은 비용을 소비하게 됩니다. 예를 들어 빠르게 값을 입력하고 지웠다면, 불필요한 입력에도 API를 호출하여 매우 비효율적이라 할 수 있습니다. 그러므로 일정 시간 간격을 주고, 유저의 입력이 끝났다고 판단될 때 API 호출하여 좀 더 효율적으로 구현해야 합니다. 이때 사용하는 것이 debounce 기법입니다. debounce란? debounce는 스크롤 또는 값의 입력과 같이 이벤트가 과도하게 많은 API를 호출할 경우 지정한 시간 동안 호출의 제약을 걸어 과부하를 방지하는 기술입니다. 예를 들어 지정한 시간을 1초라고 할 때, 이 1초 동..
[안드로이드 / Kotlin] RecyclerView 최상단 최하단 스크롤감지
·
Android
안드로이드 개발하다보면 RecyclerView의 사용은 거의 반강제?일정도로 자주 사용되고 있습니다. 최근에는 퀄리티 높은 많은 앱들이 생겨나면서 자연스레 UI/UX도 iOS만큼이나 향상되었습니다. 특히 앱내 상태바나 액션바(툴바) 애니메이션을 통해 그 사실을 쉽게 느낄 수 있습니다. 제가 이 말씀을 드리게 된 이유는 향상된 안드로이드의 UI/UX와 RecyclerView 스크롤은 밀접한 관련이 있는 경우가 많기 때문입니다. 그래서 오늘 제가 소개 시켜드릴 내용은 간단하지만 꽤나 유용하게 사용하실 수 있다고 생각합니다😊 내용은 RecyclerView 의 최상단 및 최하단의 스크롤 감지 방법입니다. 간단하게 정리하면 아래와 같습니다. RecyclerView.OnScrollListener() 사용하기 상황에..
[안드로이드 / Kotlin] Snackbar에 커스텀 폰트 적용하기
·
Android
안녕하세요! 오늘은 안드로이드에서 메시지를 띄워주는 방법 중 하나인 Snackbar에 커스텀 폰트를 적용하는 방법에 대해 간단하게 설명 해드리고자 합니다😊 일반적으로 Snackbar를 이용할 때, 아래와 같은 코드를 사용합니다. Snackbar.make(view, message, duration).show() 하지만 앱을 개발하다보면 자체 커스텀 폰트를 적용하는 경우가 많은데, 위 코드를 이용해 스낵바를 사용하게되면 시스템 폰트를 따라가도록 되어있습니다. 그래서 스낵바에 커스텀 폰트를 적용할 방법이 없을까하는 생각에 구글을 찾아본 결과,,, StackOverFlow에서 좋은 코드를 찾았습니다! 예전에 찾은 코드들은 Snackbar style 내 TextView를 찾아 해당 뷰의 typeface를 바꾸는 ..
[안드로이드 / Kotlin] ViewPager2 setCurrentItem duration
·
Android
안녕하세요! 오늘은 제가 안드로이드를 개발하면서 유용한 팁 하나를 소개시켜드리고자 합니다. 안드로이드를 개발하시면서 ViewPager2를 많이들 사용하고 계실거라는 생각이 듭니다. ViewPager2에서 특정한 위치의 페이지로 이동할 때, setCurrentItem(item: Int, smoothSroll: Boolean)을 이용합니다. 이때 두번째 파라미터인 smoothScroll을 true로 하게되면 마치 직접 스크롤하듯이 페이지가 전환됩니다. 그런데 해당 애니메이션의 속도가 생각보다 너무 빠르게 흘러가 속도를 조절하고자 서칭해본 결과.. ViewPager2에서 해당 기능을 따로 제공하지 않고 있었습니다..😢 그래서 오늘 소개시켜드릴 내용이 바로 duration 조절이 가능한 커스텀 setCurren..
[안드로이드 / Kotlin] Moshi
·
Android
오늘은 최근 안드로이드 네트워킹시 자주 이용되고 있는 Moshi에 대해 간략하게 알아보도록 하겠습니다! Moshi 보통 직렬화, 역직렬화 라이브러리로 Gson을 많이들 이용하셨을거라는 생각이 듭니다. 안드로이드 개발 언어의 추세가 자바에서 코틀린으로 넘어가게되면서 Gson외에도 Moshi라는 라이브러리가 최근 많이 이용되고 있습니다. Moshi란, Gson과 마찬가지로 Json과 객체 사이의 직렬화 및 역직렬화를 안전하게 할 수 있도록 돕는 라이브러리 입니다. Gson이라는 라이브러리가 있음에도 최근 Moshi의 사용이 증가하는 이유가 무엇일까요? 이유를 간단히 살펴보면 아래와 같습니다. Kotlin 친화적이다. Gson의 리플랙션외 Code-gen 방식이 변환을 지원한다. 어뎁터를 커스텀하여 사용할 수..
[안드로이드 / Kotlin] Clean Architecture 개념
·
Android
안녕하세요! 최근 바쁜 일이 좀 있어서 엄청 오랜만에 글을 올리는 것 같습니다,,😓 앞으로는 시간이 되는대로 틈틈이 안드로이드 개발에 도움이 되는 것들을 정리해서 올리도록 노력하겠습니다 🙃 오늘 알아볼 내용으로는 안드로이드에서의 '클린 아키텍처(Clean Architecture)'가 되겠습니다! 클린아키텍처란? Clean Architecture 특정 수준 혹은 복잡도를 가진 애플리케이션을 위한 고품질 코드를 작성하기 위해서는 상당한 노력과 경험이 필요합니다. 애플리케이션은 고객의 요구사항을 충족 할 뿐만 아니라 유연하고 테스트 가능하며, 유지 관리가 가능해야합니다. 이런 문제에 대한 해결책을 Bob 삼촌으로도 잘 알려진 Robert C. Martin이 2012년에 제시한 개념입니다. 아래는 안드로이드에서..
[안드로이드 / Kotlin] 소스코드 수정 없이 debug/release 앱 분리하기
·
Android
안녕하세요! 안드로이드 개발을 하다보면 앱 배포 이전에 테스트를 하기 위해 debug용으로 앱을 따로 추출하여 사용하는 경우가 많습니다. 저 같은 경우 debug용 빌드를 위해 패키지명이라던가 앱이름을 하나하나 수정한 뒤에 따로 apk를 추출했었습니다. 하지만 이는 추후 실제 release 앱을 배포할 때 소스코드를 원래대로 돌려놓아야하기 때문에 여간 귀찮은 일이 아닙니다..😢 그래서 오늘은 소스코드 수정없이 debug와 release용 앱을 분리하는 방법에 대해 알아보도록 하겠습니다. 패키지명 분리 Gradle에서 debug와 release용에 맞는 앱 이름을 각각 따로 설정하실 수 있으며, applicationIdSuffix를 이용하면 패키지명을 직접 바꿀 필요없이 debug용으로 빌드할때 자동으로 ..
[안드로이드 / Kotlin] Status bar 투명하게 (with DrawerLayout)
·
Android
안녕하세요! 오늘은 제가 개발하면서 오랫동안 삽집했던 DrawLayout을 이용한 Navigation을 구성 시 Status bar 를 투명하게 하는 방법에 대해 알려드리고자 합니다. 문제 상황 : DrawerLayout 과 Navigation 사용시 Status bar 영역까지 꽉차지 않는 상황 해결방안 1. DrawerLayout 및 NavigationView에 fitsSystemWindows="true" 속성 추가하기 ... fitsSystemWindows="true" : 상태 표시줄과 같은 시스템 창을 기반으로 보기 레이아웃을 조정하는 속성. true 이면 시스템 창을 위한 공간을 남기기 위해 패딩을 조정합니다. 즉 Status bar나 Navigation bar를 포함한 전체 창 크기에 맞게 레..