MVI 패턴이란?Model - View - Intent의 약자로, 단방향 데이터 흐름을 가지는 패턴입니다.State를 중심으로 UI에 전달하는 방식으로서 여기서 Intent는 기존에 알고 있는 Intent와는 다른 개념입니다. Model: 상태(State)로, UI에서 보일 데이터 또는 상태입니다.View: 화면(UI)을 구성하는 요소로, Model의 상태 변화를 관찰하여 이를 반영합니다.Intent: 사용자의 액션이나 이벤트를 정의한 것으로, 이를 통해 Model이 업데이트됩니다. 상태가 중심인 MVI에서는 데이터는 불변의 구조로 구성되며, 그로 인해 상태가 변할 때 필요한 부분만 갱신되면서 효율성이 증가합니다. MVI 패턴 장점1. 단방향 데이터 흐름 (Unidirectional Data Flow)상..
Kotlin
토글이라고도 불리우는 스위치는 기능을 켜고 끄는 로직에서 많이 사용되는 컴포넌트입니다.기존 Material 방식의 스위치 디자인신규 Compose Material3 방식의 스위치 디자인토글 색상 속성을 수정한다면 SwitchDefaults.colors를 통해 설정해줄 수 있습니다.Switch( checked = isChecked, onCheckedChange = onCheckedChange, colors = SwitchDefaults.colors( checkedThumbColor = colorResource(R.color.colorPrimary), uncheckedThumbColor = colorResource(R.color.unActiveBackground) ..
앱 자체의 잠금 기능을 구현할 때, 비밀번호 말고도 사용자가 더욱더 빠르게 보안 접근을 해제할 수 있도록 지문 인증 처리를 제공할 수도 있습니다.private var biometricPrompt: BiometricPrompt? = nullprivate var promptInfo: BiometricPrompt.PromptInfo? = null먼저 위 두 개 변수를 선언해 줍니다. BiometricPrompt사용자가 지문, 얼굴 인식 등을 통해 인증을 수행할 때 해당 프롬프트를 표시하고, 인증이 성공하거나 실패했을 때의 콜백을 처리합니다. BiometricPrompt.PromptInfoBiometricPrompt.PromptInfo는 BiometricPrompt에 표시할 다이얼로그의 정보를 구성하는 데 사용..
RxJava 라이브러리를 통해 검색 기능을 구현하는 부분에 대해 다뤄보겠습니다.RxJava를 통해 검색 중에 Reactive Steam으로 사용자가 입력 중인 검색어에 따라 debounce로 실시간 검색 처리가 가능합니다. 먼저 RxJava에 대한 개념 몇 가지를 살펴보자면.. Reactive Programming: 데이터를 비동기 스트림으로 처리하는 프로그래밍 패러다임입니다. 데이터의 흐름을 관찰하면서 이벤트가 발생하면 이를 구독자에게 전달하여 처리하는 방식입니다.Observable: 스트림에서 발생하는 이벤트나 데이터를 발행하는 주체입니다. TextView의 텍스트 변화처럼 연속적인 이벤트를 관찰하고, 이에 대해 구독자에게 이벤트를 전달합니다.Observer: Observable이 발행하는 이벤트나..
기존 프로젝트는 Retrofit을 매번 모든 Api 통신 클래스 하위에 가지고 있었습니다. 또한 통신 과정에서 예외 처리하는 부분까지 반환되는 타입이 매번 다를 뿐 거의 유사했기 때문에코드 관리 및 낭비를 줄이기 위한 정리가 필요했습니다. API 통신 클래스들이 추상 클래스를 상속받는 형태로 처리를 진행했습니다.먼저 각각의 API 통신 결과 타입은 항상 상이할 수 있기에 제네릭을 활용하여 값을 받을 Result Class를 만들어줍니다.sealed class Result { data class Success(val data: T) : Result() data class Error(val message: String? = "ERROR", val code: Int) : Result()}매번 다른 ..
하단 탭 바를 통해 탭을 이동하는 것뿐 아니라 간혹 내부 컴포넌트 onClick을 통해 탭을 이동해야 하는 경우가 있습니다.이때는 NavController를 통해 원하는 탭을 지정할 수 있습니다.FloatingActionButton( onClick = { navController.navigate(Screen.Notes.route) } ...navigate 함수에 탭 key 값을 인자로 넣어줌으로써 지정한 탭으로 이동이 가능합니다. 하지만? 여기서 문제가 한 가지 발생합니다.1번 탭에 있다가 2번 탭으로 navigate -> 이후 다시 하단 탭바로 1번 탭으로 이동하려 하면 1번 탭으로 이동되지 않습니다.이 현상은 NavController가 경로(Route)와 백 스택(Back..
컴포즈에서 하단에 4칸짜리 탭을 구현해 보겠습니다.먼저 gradle에 아래 navigation 의존성 추가가 필요합니다.implementation("androidx.navigation:navigation-compose:2.8.1")implementation("androidx.compose.material3:material3:1.2.1") 탭을 구성하기 위해서는 NavigationBar, NavigationGraph, 각 탭 별 Screen Class가 필요합니다.그리고 화면에서 NavController를 통해 등록된 화면 간의 이동을 제어하게 됩니다. 먼저 필요한 화면에 대한 기본 데이터(route, title, icon....)들을 sealed class로 정의해 줍니다.sealed class Scre..
https://www.acmicpc.net/problem/2910[문제]위대한 해커 창영이는 모든 암호를 깨는 방법을 발견했다. 그 방법은 빈도를 조사하는 것이다.창영이는 말할 수 없는 방법을 이용해서 현우가 강산이에게 보내는 메시지를 획득했다. 이 메시지는 숫자 N개로 이루어진 수열이고, 숫자는 모두 C보다 작거나 같다. 창영이는 이 숫자를 자주 등장하는 빈도순대로 정렬하려고 한다.만약, 수열의 두 수 X와 Y가 있을 때, X가 Y보다 수열에서 많이 등장하는 경우에는 X가 Y보다 앞에 있어야 한다. 만약, 등장하는 횟수가 같다면, 먼저 나온 것이 앞에 있어야 한다.이렇게 정렬하는 방법을 빈도 정렬이라고 한다.수열이 주어졌을 때, 빈도 정렬을 하는 프로그램을 작성하시오.첫째 줄에 메시지의 길이 N과 C가..
https://www.acmicpc.net/problem/5648모든 원소가 양의 정수인 집합이 있을 때, 원소를 거꾸로 뒤집고 그 원소를 오름차순으로 정렬하는 프로그램을 작성하세요.단, 원소를 뒤집었을 때 0이 앞에 선행되는 경우는 0을 생략해야 합니다.첫 번째로 입력되는 건 n (1 ≤ n ≤ 106)으로 사용자가 뒤이어 입력할 원소값을 결정합니다. 입력하는 줄에는 하나의 원소값뿐만 아니라 여러 원소값도 들어갈 수 있습니다.단, 입력하는 정수는 1012를 넘어선 안 됩니다.출력문은 위 문제 내용에 나와있는 정렬방법으로 정렬하여 아래 예제 출력을 참고하여 출력하세요. [풀이]문제 자체는 쉽게 이해할 수 있는데, 자잘한 오류가 발생하는 구간들이 있네요.일단 첫 번째로 입력되는 건 사용자가 입력할 원소 개..
https://www.acmicpc.net/problem/2493[문제]KOI 통신연구소는 레이저를 이용한 새로운 비밀 통신 시스템 개발을 위한 실험을 하고 있다. 실험을 위하여 일직선 위에 N개의 높이가 서로 다른 탑을 수평 직선의 왼쪽부터 오른쪽 방향으로 차례로 세우고, 각 탑의 꼭대기에 레이저 송신기를 설치하였다. 모든 탑의 레이저 송신기는 레이저 신호를 지표면과 평행하게 수평 직선의 왼쪽 방향으로 발사하고, 탑의 기둥 모두에는 레이저 신호를 수신하는 장치가 설치되어 있다. 하나의 탑에서 발사된 레이저 신호는 가장 먼저 만나는 단 하나의 탑에서만 수신이 가능하다.예를 들어 높이가 6, 9, 5, 7, 4인 다섯 개의 탑이 수평 직선에 일렬로 서 있고, 모든 탑에서는 주어진 탑 순서의 반대 방향(왼쪽..