본문 바로가기

안드로이드

(16)
안드로이드로이드에서 Constants를 효율적으로 사용하려 어떻게 해야할까? 1. 서론Android/Kotlin 프로젝트를 진행하다 보면, 상수를 선언할 때 크게 두 가지 방식 중 하나를 사용합니다.최상위 레벨(top-level) 상수companion object 내부에 상수두 방식이 실제로 어떤 차이가 있는지, 성능이나 APK 크기, 메모리 사용량에 차이가 있는지 궁금해질 때가 있습니다. 이번 글에서는 컴파일 과정에서 생성되는 바이트코드와 R8 최적화 과정을 살펴보며, 어떤 방식을 쓰는 것이 효과적인지 알아보겠습니다.2. Kotlin에서 상수 선언하기Kotlin에서는 상수를 만들기 위해 const val 키워드를 사용합니다. 대표적인 선언 패턴은 다음과 같습니다.최상위 레벨 상수// MyConstants.kt const val MAX\_RETRY\_COUNT = 3클래스 내부 ..
Android에서의 객체 전달 방법 비교 Serializable vs Parcelable, Parcel 안드로이드 개발을 하다 보면 액티비티(Activity) 간, 혹은 서비스(Service) 간 데이터를 전송해야 하는 경우가 많습니다. 이때 자주 사용되는 방법이 Serializable과 Parcelable이며, 실제 데이터를 담아 전달하는 그릇 역할로 Parcel이 사용됩니다. 이번 포스팅에서는 각각이 무엇이며 왜 쓰이는지, 어떤 상황에서 더 유용한지, 간단 예제까지 살펴보겠습니다.1. Serializable1.1 특징Java 표준 인터페이스: java.io.Serializable 인터페이스를 구현하기만 하면 됩니다.Reflection 기반: 런타임에 리플렉션을 통해 필드를 직렬화하기 때문에 단순 구현이 가능하지만, 그만큼 속도가 느리고 오버헤드가 큼.사용 용도: 안드로이드가 아닌 순수 Java 환경에서..
Jetpack Compose에서의 매개변수 전달 - Composition Local Jetpack Compose에서의 매개변수 전달 문제Jetpack Compose로 앱을 개발하다 보면, 다음과 같은 상황을 겪을 수 있습니다:상위 컴포저블(Composable)에서 정의한 Theme, Color, Spacing, Localization 등 UI에서 자주 쓰이는 "공용 데이터"를 하위 컴포저블로 전달해야 한다.직접 사용하지도 않는 중간 컴포저블에까지 매번 매개변수를 넘겨주어야 해서 코드 가독성과 유지보수가 어려워진다.이 문제를 "prop drilling"이라고 부르는데, React Native나 Flutter 개발 경험이 있는 분이라면 익숙할 겁니다.Jetpack Compose에서는 Composition Local을 통해 이 문제를 해결할 수 있습니다.Composition Local이란?C..
안드로이드 jetcaster 예제 분석 - Flow와 Combine을 이용한 흐름 제어 https://github.com/android/compose-samples/blob/main/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/search/SearchScreenViewModel.kt위에 코드의 flow와 combine을 이용한 흐름들의 변경에 따라 값을 갱신(UI)하는 로직을 분석해보자1. 코드 개요1.1 SearchScreenViewModel의 핵심 플로우들코드를 보면, 몇 가지 StateFlow/MutableStateFlow 들이 모여 최종 uiStateFlow를 만들어 내는 구조입니다.사용자가 직접 입력/선택하는 값keywordFlow: 사용자의 검색어 입력.selectedCategoryListFlow: 사용자가 현재 선택한 카테고..
MVI란? 안드로이드에서 MVI는 무엇이고 어떻게 적용할까? 1. MVI(Model-View-Intent)란?MVI는 말 그대로 Model - View - Intent를 통해 단방향 데이터 흐름(Unidirectional Data Flow)을 구현하는 아키텍처 패턴입니다.Intent: 사용자 액션(이벤트) 혹은 시스템 이벤트.예) 버튼 클릭, 텍스트 입력, 스크롤, 외부 알림, 네트워크 응답 등 “무엇을 할 것인지” 의도를 표현합니다.Model: UI가 그릴 상태(State).뷰에 표시되어야 할 “현재 상태”를 모두 포괄. 예) 로딩 여부, 보여줄 데이터 리스트, 에러 메시지 등.View: 실제 UI.MVI에서는 View가 상태(Model)를 구독(subscribe)하고, 상태가 바뀌면 자동으로 화면을 갱신합니다.흐름은 보통 다음과 같습니다:View에서 Inten..
Dagger의 @Binds vs @Provides, @Qualifier vs @Named, @Lazy<T> vs @Provider<T> @Binds interface AnalyticsService { fun analyticsMethods() } // Constructor-injected, because Hilt needs to know how to // provide instances of AnalyticsServiceImpl, too. class AnalyticsServiceImpl @Inject constructor( ... ) : AnalyticsService { ... } @Module @InstallIn(ActivityComponent::class) abstract class AnalyticsModule { @Binds abstract fun bindAnalyticsService( analyticsServiceImpl: Anal..
컴포즈 부수효과 부수효과 컴포저블에는 부수 효과가 없어야 한다. 하지만 앱의 상태를 변경하는 데 필요한 경우 컴포저블의 수명 주기를 인식하는 관리된 환경에서 부수 효과를 호출해야 한다. Compose에서 다양한 가능성 효과를 이용할 수 있기 때문에 과다하게 사용될 수 있는데 이를 방지하기 위해서는 효과(Effect)에서 실행하는 작업이 UI와 관련되고 단방향 데이터 흐름을 중단하지 않아야 한다. LaunchedEffect: 컴포저블의 범위에서 suspend 함수 실행, 취소 실행시점: 컴포지션 실행 종료시점: 해당 컴포지션의 종료 재실행 발생 조건: LaunchedEffect block의 parameter 변경 시 매개변수로 전달된 코드 블록으로 코루틴이 실행되고 LaunchedEffect가 컴포지션을 종료하면 코루틴이..
Compose의 Stateful과 Stateless 개념 Stateful 이란? 내부에서 상태를 생성하는 컴포저블을 stateful이라고 한다. Stateless 이란? 외부로 부터 상태를 받는(상태 호이스팅) 컴포저블을 stateless라고 한다. 상태를 내부에서 생성한다는 의미는 아래와 같이 name, onValueChange와 같은 상태를 직접 생성하는 컴포저블 함수를 말한다. // Stateful 함수 @Composable fun SomeScreen() { val name by rememberSaveable { mutableStateOf("") } Column(modifier = Modifier.padding(16.dp)) { Text( text = "Hello, $name", modifier = Modifier.padding(bottom = 8.dp..