본문 바로가기

Android82

[Android/Hilt] @Inject와 @Module, @Provides 이해하기 Hilt는 안드로이드에서 의존성 주입(DI, Dependency Injection)을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다. Hilt를 사용하면 의존성 관리를 더욱 효율적으로 할 수 있으며, 코드가 간결해집니다. 특히 @Inject와 @Module, @Provides는 Hilt에서 가장 중요한 개념 중 하나입니다. 이번 글에서는 이 두 개념을 정리해보겠습니다.@Inject: 직접 만든 클래스의 의존성 주입@Inject는 직접 만든 클래스의 의존성을 Hilt가 자동으로 관리할 수 있도록 도와줍니다.@Inject constructor를 사용한 생성자 주입class ExampleRepository @Inject constructor() { fun getData(): String = "Hello.. 2025. 3. 7.
[Android/Compose] Jetpack Compose를 통해 살펴보는 선언형 UI와 명령형 UI의 차이 Jetpack Compose를 공부하면서 "선언형 UI"라는 단어를 자주 접하게 되었습니다.Compose의 가장 큰 장점으로 꼽히는 선언형 UI가 기존의 명령형 UI와 어떤 차이가 있는지,그리고 왜 선언형 UI가 더 효율적인지에 대한 궁금증이 생겼습니다.이 글에서는 명령형 UI와 선언형 UI의 차이점,그리고 Jetpack Compose가 제공하는 선언형 UI의 장점에 대해 정리해보겠습니다.1. 명령형 UI와 선언형 UI란?UI를 구성하는 방법에는 크게 명령형 UI(Imperative UI)와 선언형 UI(Declarative UI) 두 가지 접근법이 있습니다.이 두 방식은 상태 관리와 UI 업데이트 방법에서 근본적인 차이를 보입니다.명령형 UI → 어떻게 그릴지를 개발자가 직접 명령선언형 UI → 무엇을.. 2025. 2. 25.
[Android/Kotlin] lateinit 이해하기: nullable과의 차이와 지연 초기화 이해하기 개발을 하다 보면, 변수를 선언할 때 초기값을 바로 할당하지 못하는 경우가 많습니다. lateinit 키워드를 자주 사용했지만, 왜 굳이 nullable 대신 lateinit을 써야 하는지 깊이 고민해보지 않았습니다.이번에 공부하면서 lateinit의 필요성과 nullable과의 차이점을 명확히 이해하게 되었고,그 내용을 정리해보았습니다. 1. lateinit 키워드의 의미와 사용 이유lateinit은 Kotlin에서 변수를 나중에 초기화할 것임을 명시하는 키워드입니다.이를 통해 초기화 시점을 유연하게 조정할 수 있습니다.Kotlin은 Null Safety를 보장하기 위해 변수를 선언할 때 반드시 초기화를 요구하지만,초기값을 바로 설정할 수 없는 경우에는 lateinit 키워드를 사용할 수 있습니다.예시.. 2025. 2. 25.
[Android] Activity 생명주기 정리 Activity 생명주기(Activity Lifecycle)는 앱이 시작되고 종료될 때, 포커스를 얻거나 잃을 때, 백그라운드로 전환될 때 등 다양한 상황에서 호출되는 메서드들의 흐름을 의미합니다. 이를 이해하면 앱의 상태를 올바르게 관리할 수 있으며, 자원 누수나 비정상적인 동작을 방지할 수 있습니다.1. Activity 생명주기 콜백 메서드메서드설명onCreate()Activity가 처음 생성될 때 호출됩니다. 초기화 작업(뷰 세팅, 데이터 바인딩 등)을 여기서 합니다.onStart()Activity가 사용자에게 보이기 직전에 호출됩니다. (하지만 아직 포커스는 없음)onResume()Activity가 포그라운드에 있으며 사용자와 상호작용 가능한 상태일 때 호출됩니다.onPause()다른 Activi.. 2025. 2. 24.
[Android/Compose] LazyColumn vs RecyclerView 비교 : RecyclerView 없이 리스트 만들기 Jetpack Compose를 공부하면서 LazyColumn을 접하게 되었습니다.기존에는 리스트 성능을 최적화하려면 RecyclerView를 사용하고, 그때마다 Adapter와 ViewHolder를 직접 구현해야 했습니다.그런데 LazyColumn을 사용하면 코드가 훨씬 간결해지면서도 자동으로 성능이 최적화된다는 점이 신기했습니다.그래서 기존 RecyclerView와 비교하며 어떤 차이가 있는지 정리해보려고 합니다.1. 기존 RecyclerView의 동작 방식RecyclerView는 리스트의 성능을 최적화하기 위해다음과 같은 요소들을 개발자가 직접 구현해야 합니다.Adapter → 리스트 데이터를 표시하는 역할 ViewHolder → 뷰를 재사용하여 성능을 최적화 LayoutManager → 리스트의 배.. 2025. 2. 19.
[Android/Coroutine] launch vs async 차이점 정리 Coroutine에서 launch와 async는 모두 새로운 코루틴을 시작하는 데 사용되지만, 반환값을 처리하는 방식이 다릅니다.이 글에서는 공부한 내용을 정리하며, launch와 async의 차이를 코드 예제와 함께 살펴보겠습니다.1. launch: 결과를 반환하지 않는 Jobval job = GlobalScope.launch { delay(1000L) println("launch 완료!")}job.join() // 완료될 때까지 대기특징launch는 Job을 반환합니다.Job은 단순히 실행을 시작하고, join()을 호출하기 전까지는 실행 완료 여부를 기다리지 않습니다.launch는 비동기적으로 실행되지만, 결과 값을 반환하지 않습니다.즉, 실행은 하지만 결과를 받아서 처리하는 용도가 아닙.. 2025. 2. 19.
[Android/Compose] Recomposition: 상태 변화에 따른 UI 갱신 Jetpack Compose를 사용하면서 기존 방식과 다르게 LiveData.observe() 같은 코드도 없고, notifyDataSetChanged()를 호출하지 않았는데도 UI가 알아서 갱신되는 것이 신기하게 느껴졌습니다."LiveData도 사용하지 않았는데, 왜 상태가 변하면 UI가 자동으로 업데이트되지?"라는 궁금증이 들었습니다.기존 XML 기반의 View 시스템에서는 명시적인 호출이 필요했지만, Compose에서는 mutableStateOf만으로 UI가 알아서 갱신됩니다. 이는 Recomposition(재구성) 덕분입니다.이번 글에서는 공부한 내용을 바탕으로 Compose의 Recomposition이 무엇인지, 그리고 어떻게 동작하는지를 정리 해 보겠습니다.Recomposition이란?Reco.. 2025. 2. 6.
[Android/Kotlin] mutableMapOf vs hashMapOf 차이점 및 성능 비교 Kotlin에서 Map을 사용할 때 mutableMapOf와 hashMapOf 중 어떤 것을 선택하는 것이 더 좋을까요? 이번 글에서는 두 가지의 차이점과 성능 비교를 통해 언제 어떤 것을 선택하면 좋은지를 알아보겠습니다.1. mutableMapOf vs hashMapOf 차이점mutableMapOfval sitesAndPasswords = mutableMapOf()내부적으로 LinkedHashMap을 사용합니다.입력 순서를 유지하는 특징이 있습니다.성능은 일반적인 HashMap과 동일 (O(1) 조회, 삽입 가능).hashMapOfval sitesAndPasswords = hashMapOf()명시적으로 HashMap을 사용합니다.입력 순서를 유지하지 않음 (순서가 중요하지 않다면 더 적합).성능은 mu.. 2025. 2. 6.
[Android/Compose] Modifier를 파라미터로 전달하는 이유 Jetpack Compose에서 Column과 같은 레이아웃 컴포저블을 사용할 때, Modifier를 기본 인자로 직접 설정할 수 있습니다.그런데, 코드에서 Modifier를 바로 적용할 수 있는데도 불구하고, 굳이 파라미터로 Modifier를 전달하는 방식을 사용하는 이유가 궁금했습니다.이러한 의문을 가지고 공부하던 중, Compose의 재구성(Recomposition)과 성능 최적화와 관련된 중요한 개념을 알게 되었습니다.이 글에서는 왜 Modifier를 직접 선언하는 것이 아니라, 파라미터로 전달하는 것이 더 좋은 방법인지 정리해 보겠습니다.Modifier를 직접 사용하면 생기는 문제처음에는 아래처럼 Column 내부에서 바로 Modifier.padding(16.dp)을 적용하는 것이 자연스러워 보.. 2025. 2. 5.
반응형