본문 바로가기
반응형

전체 글362

Bottom Navigation 구현방법 총정리 # Route 오늘은 BottomNavigation 의 구현방법에 대해서 정리해 보도록 하겠습니다. BottomNavigation을 구현하기 위해서는, Jetpack Compose Navigation 구현방법에 대해서 알고 있으면 도움이 되는데요. 이에 관해서는 아래 글을 참조해 주세요. >> Navigation 구현 방법 총정리 # Route Jetpack Compose 1.  Route 정의 먼저 BottomNavigation 에서 사용할 Route 들을 sealed class 로 정의해 주겠습니다. badge count 를 활용하기 위해서, badgeCount 를 넣어주었습니다. sealed class Screen( val route: String, val title: String, val icon: Image.. 2023. 5. 29.
Navigation 구현 방법 총정리 # Route Jetpack Compose 오늘은 Jetpack Compose 에서 구현하는 Navigation 에 대해서 정리해 보도록 하겠습니다. 1. Navigation Library 가장 먼저 준비할 것은 navigation 구현을 위해 라이브러리를 implement 하는 것 입니다. 아래의 라이브러리들이 모두 이 글의 예제를 구현하는데 필수적인 것은 아니지만, navigation과 viewModel, savedState 등을 같이 사용하기에 도움을 주는 라이브러리이므로 포함시켰습니다. app레벨의 build.gradle에 implement 시켜주면 됩니다. dependencies { def nav_version = "2.5.3" implementation "androidx.navigation:navigation-compose:$nav_v.. 2023. 5. 27.
Nested Navigation 구현 및 총정리 # 중첩 Route Jetpack Compose 실제 앱을 만들다보면, Navigation Graph가 복잡해 지게 됩니다. 중첩된, 즉 nested navigation이 필요하기 때문인데요. 오늘은 Jetpack Compose 에서 Nested Navigation 을 구현하는 방법에 대해서 정리해 보겠습니다. 이 글을 이해하기 위해서는 Jetpack Compose Navigation 구현방법에 대해서 알고 있어야 하는데요. 이에 관해서는 아래 글을 참조해 주세요. >> Navigation 구현 방법 총정리 # Route Jetpack Compose 1. 라이브러리 Implementation 이 글에 나오는 코드를 구현하기 위해서, 아래 라이브러리들이 app레벨의 build.gradle에 implement 되어야 합니다. dependencies { d.. 2023. 5. 26.
CoerceIn, coerceAtMost, coerceAtLeast 범위지정 함수에 대한 정리 # Kotlin 오늘은 Kotlin 에서 값의 범위를 강제할 수 있는, coerceIn, coerceAtMost 그리고 coerceAtLeast 에 대해서 정리해 보겠습니다. 1. CoerceIn 원래 Coerce 라는 단어는 강제로 무언가를 하게 한다는 의미인데요. CoerceIn 은 강제로 어느 범위로 넣게 하겠다는 것 입니다. 인자로 최소값과 최대값을 받는데요. 이 최소값보다 적게나오면, 최소값을, 최대값보다 크게나오면, 최대값을 리턴하도록 강제해주는 API 입니다. 예를 들어서 아래 코드와 같은 경우를 들 수 있습니다. 아래는 Percent 값을 구하는데, distance나 distanceBetween 이 마이너스가 나올 경우에도, 0과 1 사이에서만 값을 주도록 강제해 주었습니다. val distanceInPe.. 2023. 5. 26.
EOFException 발생시키는 empty body 대응 방법 # Retrofit Retrofit 을 이용해서 정상적으로 서버의 데이터를 요청하였을 때, 200 OK를 받았는데도, 서버에서 empty body를 주어서, EOFException 이 발생하는 경우가 있습니다. 오늘은 이것의 대응 방법에 대해서 정리해 보겠습니다. 1. 서버 200 과 EOFException 위에서 언급한 것처럼, 서버에서 200 OK 를 주었는데도, body가 비워져 있어서, EOFException 이 발생할 수 있습니다. 서버에서는 데이터 없으니 "" 를 보내버린 것이구요. 아래와 같이 body는 0-byte가 되어 있습니다. 2023. 5. 25.
MapNotNull 과 MapNotNullTo 에 대한 정리 # null 제거 오늘은 MapNotNull 과 MapNotNullTo 에 대해서 정리해 보도록 하겠습니다. 1. MapNotNull mapNotNull은 엘리먼트에 주어진 transform 연산자를 적용하여서, null 이 나오지 않는 값들로만 list 를 구성해서, 반환해주는 함수입니다. 이름에 map이 있지만, 반환하는 타입은 아래와 같이 List 입니다. null 을 제거해주는 방어연산자라고도 할수 있겠습니다. 2. MapNotNull 예제1 코드를 보면서 이해해 보겠습니다. mapNotNull연산자 안에서, 2로 나누어 나머지가 없이 딱 떨어지는 값은 2를 곱해주고, 그렇지 않은 경우는 null을 리턴하는 조건문을 넣어주었습니다. val numbers = listOf(1, 2, 3, 4, 5, 6) val dou.. 2023. 5. 24.
Broadcast Receiver 등록하고 시스템 이벤트 받아서 처리하기 안드로이드의 시스템은 이벤트가 발생할 때 broadcast를 보내줍니다. 이름이 broadcast이니, 방송을 한다고 해야할까요. 안드로이드 내부적으로 이벤트가 발생을 했다고 알려주는 것인데요, 안드로이드 앱에서, 시스템에게 특정한 이벤트에 관해 관심이 있다고 등록을 하면, broadcast를 수신할 수 있게 되는데요. 오늘은 사용자가 이어폰을 스마트폰에서 빼거나 꽂았을 때, 시스템 이벤트를 받아서 토스트 팝업을 띄우는 방법에 대해서 정리해보겠습니다. 네이버 뮤직 같은 앱들이 헤드폰을 빼거나 꽂았을 때, 플레이를 멈추도록 하는 기능도 broadcastReceiver를 이용했을 거라고 생각이 됩니다. 1. BroadCast 받는 방법 안드로이드의 시스템으로부터는 여러가지 broadcast를 받아서 볼 수 .. 2023. 5. 23.
Vibrator 로 구현하는 안드로이드 진동 앱을 통해 사용자에게 알리는 방법중 진동은 매우 중요한 수단중 하나인데요. 오늘은 Vibrator API를 이용해서 이를 구현하는 방법에 대해서 정리해보겠습니다. 1. Manifest 설정 제일 먼저 해주어야 하는것은 permission을 얻는 것인데요. 다행히도 동적으로 얻어야 하는 수준의 permission은 아닙니다. 아래와 같이, manifest 에서 uses-permission만 VIBRATE에 대해서 정의해주면 됩니다. 2. Vibrator 객체 얻기 가장 먼저 할 일은 Vibrator객체를 얻어오는 것 입니다. 안드로이드 하드웨어와 관련된 클래스들이 그렇듯이, getSystemService 메소드를 사용해서 객체를 얻어와야 합니다. API23 버전(버전 M)부터는 아래와 같이 얻어오구요. 그.. 2023. 5. 23.
List 아이템 부분추출 함수 정리 # take, takeWhile, takeLast, drop, slice, first and last 오늘은 list 나 Sequence에 적용할 수 있는, 아이템을 부분적으로 추출하는 방법에 대해서 정리해 보도록 하겠습니다. 오늘 볼 API에는 다음과 같은 것들이 있는데요. take, takeLast, takeWhile, drop, dropWhile, slice first, last, firstOrNull, lastOrNull 하나씩 보도록 하겠습니다. 1. take api 이름에서 느껴지는 것처럼, 처음 n개의 요소들을 반환해 줍니다. 아래 코드에서는 처음3개를 취하기 위해서, 3을 인자로 넣어주었구요. 결과는 앞의 1,2,3을 반환해 주게 됩니다. val numbers = listOf(1, 2, 3, 4, 5) val result = numbers.take(3) println(result) // 결.. 2023. 5. 15.
DisposableEffect 에서 화면종료 전 리소스 정리 구현 # 구 onDestroy jetpack Compose 오늘은 Jetpack Compose 의 Side effect 중 하나인, DisposableEffect 에 대해서 정리해 보도록 하겠습니다. 참고로, SideEffect 에 대해서는 아래 글을 참조해 주세요. >> LaunchedEffect , Side Effect 그리고 rememberCoroutine 총정리 1. DisposableEffect 1-1. DisposableEffect Disposable 은 일회용처럼 사용하고 버릴 수 있는 물건을 가르키는데요. Composable 에서 DisposableEffect 는, 아래의 경우에 실행이 됩니다. 아래에서 key값은 DisposableEffect에 인자로 들어가는 key값을 말합니다. Composable 이 Composition에서 제거되는 경우(C.. 2023. 5. 13.
LaunchedEffect , Side Effect 그리고 rememberCoroutine 정리 오늘은 Jetpack Compose 의 Side Effect 와 LaunchedEffect, 그리고 rememberCoroutine 에 대해서 정리해 보도록 하겠습니다. 1. Side Effect Side effect 의 단어 뜻은 원래 부차적이고, 의도하지 않은 효과를 말하는데요. 부작용을 가르키기도 합니다. Jetpack Compose 에서, Side effect 는 Composable 함수(의 scope)를 벗어난 곳에서 앱의 state 변경이 일어나는 것을 뜻 합니다. 참고로 State 에 대해서는 아래 글을 참조해 주세요. >> State 를 이해하고 TextField 구현하기 # Jetpack Compose UI Part2 공식문서의 언급된 것에 따르면, Composable 의 이상적인 형태는.. 2023. 5. 12.
BackHandler 에 대한 정리 # 유저가 Back 버튼 누를 때 Jetpack Compose 오늘은 Jetpack Compose 에서 유저가 백버튼을 누를 때, 구현해야 하는 코드를 넣는 부분인 BackHandler 에 대해서 정리해 보겠습니다. 1. BackHandler BackHandler는 Compose의 탑레벨 Composable 함수인데요. 유저가 시스템의 back button을 눌렀을 때, 이벤트를 핸들링 할 수 있는 곳 입니다. 코드로 보도록 하겠습니다. 보다시피 람다블록에 코드만 넣어주기만 하면 되기 때문에 정말 쉬워보입니다. @Composable fun MyScreen() { BackHandler(onBack = { println("Back button pressed") }) } 2023. 5. 11.
compareBy 와 min 그리고 sortedWith 사용방법에 대한 정리 오늘은 리스트를 sorting 할 때 사용할 수 있는, compareBy 와 min 그리고 sortedWith를 사용하는 방법에 대해서 정리해 보겠습니다. 1. 최소값을 찾을 때 2가지 조건을 붙이는 방법에 사용 먼저 CompareBy 와 min 을 사용하는 방법에 대해서 정리해 보겠습니다. 아래 코드에서 사용한 것은 minWithOrNull 인데요. 코드를 먼저 보고 정리해 보겠습니다. compareBy에 두가지 조건 블록이 들어가 있습니다. 이 조건은 아래와 같이 적용됩니다. 먼저 value 가 적은 최소값을 찾고, 다음으로 id가 적은 값을 찾는다 입니다. data class SampleData(val id: Int, val value: Int) val dataList = listOf( Sample.. 2023. 5. 10.
Websocket Protocol 에 대해서 이해해 보자 # Stomp 오늘은 WebSocket 에 대해서 정리해 보려고 합니다. 이 글에서는, 저희가 항상 사용하고 있는 Http Protocol 과 어떻게 다른지를 보면서, WebSocket 에 대해서 이해해 보도록 하겠습니다. 1. Websocket 과 Http와의 차이점 가장 먼저 Websocket Protocol 에 대해서 알아야 합니다. 너무 깊이 들어간다기 보다는 어떤 형식에서, HTTP와 다른지 기본적인 흐름에 대해서 이해하면서 시작하는 것이 좋을 텐데요. HTTP는, 클라이언트가 서버와 약속 된 방식으로 http요청을 하면, 서버는 그에 맞는 데이터를 보내주는 방식입니다. 즉, 요청을 하면 답변을 하는 방식인데요. Request-Response가 반복됩니다. 접속이 유지되지 않은 상태를 의미합니다. 반면 We.. 2023. 5. 8.
any , contains, none , all, containsAll 에 대한 정리 # Kotlin list 존재여부 확인 오늘은 Kotlin list 의 존재여부를 확인하는 함수인, any, contains, none, all, containsAll 에 대해서 정리해 보도록 하겠습니다. 1. any() 적어도 하나 이상의 매칭되는 아이템이 Collection 에 존재한다면, true 를 없으면 false 를 return 해 줍니다. val list = listOf(1, 2, 3, 4, 5) val result = list.any { it > 3 } println(result) // 결과: true 2023. 5. 6.
StateFlow vs SharedFlow 를 비교해보자 #이벤트 핸들링 오늘은 StateFlow 와 SharedFlow 에 대해서 정리해 보도록 하겠습니다. 1. 기존 글 참조 만약 SharedFlow와 StateFlow 각각에 대한 기본적인 부분들에 대해서 정리하고 싶으시다면, 아래 글들을 참조하신 다음에 이 글을 읽으면 더욱 도움이 될 것 입니다. >> SharedFlow 에 대한 총정리 # Buffer Replay tryEmit Kotlin Coroutine >> mutableStateOf 와 MutableStateFlow 비교 총정리 # collectAsState 2. StateFlow 는 State 변화를 위한 API 2-1. StateFlow 는 이벤트핸들링을 위한 API가 아니다 아래는 Kotlin 이 아닌 Android의 공식문서인데요. 중요한 부분이 잘 설명.. 2023. 5. 6.
SharedFlow 에 대한 총정리 # Buffer Replay tryEmit Kotlin Coroutine 오늘은 Kotlin Coroutine의 SharedFlow 에 대해서 정리해 보도록 하겠습니다. 1. SharedFlow SharedFlow 는 이름에서 알 수 있듯이, Collector 가 여러개인 경우, Collector 들이 emit 된 값들을 동시에 consume 할 수 있도록, Share(공유)되는 Flow 의 API 입니다. fun main() = runBlocking { val sharedFlow = MutableSharedFlow(replay = 1) launch { for (i in 1..5) { sharedFlow.emit(i) println("Emitted: $i") } } launch { sharedFlow.collect { value -> println("Collector 1에서 .. 2023. 5. 4.
Flow 결합연산자 combine , zip , merge 비교 총정리 # Kotlin Coroutine 오늘은 Kotlin Coroutine의 Flow API 중, flow들을 결합해 주는 오퍼레이터인, combine과 zip 그리고 merge에 대해서 총정리해 보겠습니다. 1. combine Combine 은 2개 이상의 스트림 되는 flow 데이터들을, 합쳐서 하나의 flow로 흘려보내 주는 API입니다. 2개의 스트림을 합쳐주는 것은 알겠는데, 각각의 데이터들이 다른 시점에 나올 때는 어떻게 되는 것일까요? 아래 공식문서의 설명에 따르면, 둘 중 가장 최근에 방출되는 값이 있으면, 그 값을 기준으로 합쳐진 flow 를 방출해 줍니다. 단순히 2개의 flow를 합쳐준다고만 이해해서는 안 되고요. 2개의 flow 중 어느 하나에서 아이템이 방출되면, 최근 2개의 flow를 합쳐서 방출해 줍니다. 좀 더.. 2023. 5. 3.