본문 바로가기

전체 글139

[Android/Coroutine] Cold Stream vs Hot Stream 쉽게 이해하기: 언제 어떤 것을 써야 할까? 코루틴을 사용하다 보면 Flow, StateFlow, SharedFlow와 같은 다양한 스트림 타입을 접하게 됩니다.이때 함께 따라오는 개념이 바로 Cold Stream과 Hot Stream입니다.처음에는 문서에 나와 있는 특징들을 정리하며 각각을 구분해보려 했지만,막상 실제 코드에 적용해 보려 하니 어떤 상황에서 무엇을 선택해야 할지 명확하게 감이 오지 않았습니다.그래서 이 개념들을 좀 더 쉽게, 감각적으로 이해할 수 있는 방법이 없을까 고민하게 되었고,그 과정에서 일상에서 흔히 겪는 상황들을 비유로 떠올려 보며 Cold Stream과 Hot Stream의 차이를 정리해 보았습니다.Cold Stream이란?Cold Stream은 collect가 시작되어야 비로소 동작하는 스트림입니다. 대표적으로 Kot.. 2025. 3. 28.
[Android/Kotlin] Kotlin 컬렉션 확장 함수 정리: associateBy 사용법 Kotlin에서는 리스트나 배열과 같은 컬렉션을 다룰 때 유용한 확장 함수(Extension Function)들이 많이 제공됩니다. 그 중에서도 associateBy는 컬렉션을 Map으로 변환할 때 자주 사용되는 함수입니다.이 글에서는 associateBy의 기본 개념부터 실전 예제까지 정리해보았습니다.associateBy란?associateBy는 컬렉션(List, Array 등)의 요소를 기준값으로 묶어 Map으로 변환해주는 확장 함수입니다.즉, 리스트의 각 요소에서 특정 값을 꺼내 Key로 삼고, 해당 요소를 Value로 하여 Map을 만드는 방식입니다.기본 사용법val resultMap = list.associateBy { it.someProperty } someProperty는 각 요소에서 추출한.. 2025. 3. 27.
[Android/Compose] collectAsState()를 활용한 상태 관리 Jetpack Compose에서 Flow 또는 StateFlow를 UI에서 구독할 때, 상태를 효율적으로 관리하는 것이 중요합니다.이때 collectAsState()를 사용하면 Flow를 State로 변환하여 UI가 자동으로 최신 상태를 반영할 수 있습니다.이번 글에서는 collectAsState()가 무엇이며, 어떻게 사용해야 하는지 공부 한 내용을 정리하겠습니다.1. collectAsState()란?collectAsState()는 Jetpack Compose에서 Flow나 StateFlow를 구독하여 State로 변환하는 함수입니다.이 함수를 사용하면 Composable 내부에서 Flow를 안전하게 수집(collect)할 수 있으며, 값이 변경될 때 자동으로 UI가 갱신됩니다.또한, State로 변환.. 2025. 3. 20.
[Android/Coroutine] SharingStarted.WhileSubscribed(): 효율적인 Flow 공유 전략 Flow를 UI에서 구독할 때 불필요한 리소스 낭비를 방지하는 것이 중요합니다.SharingStarted.WhileSubscribed()를 사용하면 구독자가 있을 때만 데이터를 방출하고, 없으면 정지하는 방식으로 Flow를 최적화할 수 있다는 것을 알게 되었습니다.이번 글에서는 SharingStarted.WhileSubscribed()가 무엇인지, 그리고 어떤 상황에서 유용한지 공부한 내용을 정리해두겠습니다.1. SharingStarted란?SharingStarted는 Flow를 여러 곳에서 공유할 때 흐름을 언제 시작하고, 언제 중지할지를 결정하는 전략입니다.이를 활용하면 ViewModel에서 Flow 데이터를 공유하고, UI에서 구독할 때 불필요한 연산을 줄일 수 있습니다.SharingStarted .. 2025. 3. 20.
[Algorithm/Kotlin] 백준 30804번 과일 탕후루: 투 포인터(슬라이딩 윈도우)로 최적화 문제 설명은하는 긴 막대에 N개의 과일이 꽂혀있는 과일 탕후루를 만들었습니다.과일의 종류는 1부터 9까지 있으며, 막대에는 앞쪽부터 차례대로 S1,S2,...,SN번 과일이 꽂혀 있습니다.그러나 주문을 다시 확인해 보니 과일을 두 종류 이하로 사용해야 한다는 요청이 있었습니다.새로 만들 시간이 없는 은하는 앞쪽에서 a개, 뒤쪽에서 b개의 과일을 빼서 두 종류 이하의 과일만 남기기로 했습니다.즉, 막대의 연속된 구간 중에서 과일 종류가 2개 이하인 가장 긴 부분을 찾아야 합니다.이때, 남아 있는 과일 개수가 가장 많은 경우를 구하는 것이 목표입니다.입력첫 줄에 과일의 개수 N이 주어집니다. (1≤N≤200,000)둘째 줄에 탕후루에 꽂힌 과일을 나타내는 NNN개의 정수 S1,S2,...,SN​이 공백으로 .. 2025. 3. 17.
[Android/Kotlin] Retrofit에서 인터페이스를 활용한 API 요청 처리 원리 안드로이드에서 네트워크 요청을 쉽게 처리할 수 있도록 도와주는 대표적인 라이브러리인 Retrofit을 공부하면서, 한 가지 궁금한 점이 생겼습니다.Retrofit을 사용할 때 interface를 retrofit.create()에 넘겨주기만 하면 네트워크 통신이 자동으로 이루어진다는 점이었습니다.단순히 메서드를 선언한 인터페이스를 넘겼을 뿐인데, 실제 HTTP 요청이 발생하는 원리가 무엇인지 궁금했습니다.공부하면서 Retrofit이 인터페이스를 동적으로 구현하고, 내부적으로 HTTP 요청을 처리하는 과정을 이해하게 되었습니다.이번 글에서는 Retrofit이 API 요청을 어떻게 자동으로 처리하는지 정리해보겠습니다.Retrofit을 이용한 API 요청 흐름Retrofit을 사용할 때 interface를 정의.. 2025. 3. 12.
[Android/Kotlin] ViewModel 개념과 ViewModelStore를 통한 구성 변경 시 상태 유지 원리 안드로이드 컴포넌트의 생명 주기에 따라 데이터가 유실되지 않도록 하기 위해 ViewModel을 사용하는 것이 일반적이지만, 문득 구성 변경(Configuration Change)으로 인해 Activity가 파괴되는데도 어떻게 ViewModel이 유지될 수 있을까? 하는 궁금증이 들었습니다.ViewModel이 어떻게 상태를 관리하고 구성 변경 시에도 유지될 수 있는지 이해하기 위해 내부 코드를 직접 분석하고 정리한 내용을 공유하겠습니다. 또한, ViewModel의 개념과 사용 시 고려해야 할 사항들도 함께 정리하겠습니다.ViewModel이란?구성 변경이 발생해도 데이터를 유지하도록 설계된 컴포넌트입니다.Activity나 Fragment보다 생명 주기가 깁니다.하지만 앱이 종료되면 ViewModel도 함께 .. 2025. 3. 10.
[Android/Coroutine] 구조화된 동시성이란? 구조화된 동시성은 코루틴에서 중요한 개념으로, 코루틴이 부모-자식 관계를 통해 체계적으로 관리되는 방식을 의미합니다.이를 통해 코루틴의 실행 흐름을 명확하게 제어하고, 예측 가능한 방식으로 동시 실행을 관리할 수 있습니다.또한, 특정 범위(Scope) 내에서 코루틴을 실행함으로써 오류 처리를 용이하게 하고, 불필요한 리소스 낭비나 메모리 누수를 방지할 수 있도록 돕습니다.1. 구조화된 동시성의 핵심 개념1) 코루틴 스코프 (Coroutine Scope)모든 코루틴은 반드시 코루틴 스코프 안에서 실행됩니다.코루틴 스코프를 사용하면 코루틴이 언제 시작되고 종료되는지를 명확히 제어할 수 있습니다.대표적인 코루틴 스코프는 다음과 같습니다.CoroutineScope: 개발자가 직접 생성하여 관리 가능GlobalS.. 2025. 3. 7.
[Android/Hilt] @Provides vs @Binds: Hilt에서 객체를 주입하는 두 가지 방식 이전에 사이드 프로젝트를 진행하면서 의존성 주입을 할 때 어떤 곳에는 @Provides를 사용하고, 어떤 곳에는 @Binds를 사용하는 것을 보고 그 차이가 궁금했습니다. 당시에는 명확하게 이해하지 못한 채 사용했었지만, 학습을 진행하며 그 차이를 조금씩 이해하게 되었습니다. 이에 대한 내용을 정리하여 보다 명확하게 개념을 정리하고자 합니다.@Provides와 @Binds의 핵심 차이점구분사용 방식특징@Provides메서드 내에서 인스턴스를 반환인터페이스뿐만 아니라 일반 클래스 객체도 생성 가능@Binds구현체를 바인딩하는 방식인터페이스와 구현체 간의 관계를 선언적으로 설정@Provides를 사용하는 경우@Provides는 Hilt가 직접 @Inject를 붙여 생성할 수 없는 경우 사용해야 합니다.사용하.. 2025. 3. 7.
[Android/Hilt] @Qualifier와 @Named 이해하기: 같은 타입의 여러 의존성을 구별하여 주입 Hilt를 사용하다 보면 같은 타입의 여러 의존성을 주입해야 하는 상황이 발생할 수 있습니다. 이때, 어떤 객체를 주입해야 할지 Hilt가 알 수 있도록 구분하는 방법이 @Qualifier와 @Named입니다. 이번 글에서는 이 두 개념을 정리해보겠습니다.같은 타입의 의존성 주입 문제Hilt는 기본적으로 반환 타입을 기준으로 의존성을 주입합니다. 그러나 같은 타입의 여러 객체를 주입해야 하는 경우가 있을 수 있습니다.예를 들어, 두 개의 String 값을 의존성으로 제공하려고 할 때 문제가 발생할 수 있습니다.@Module@InstallIn(SingletonComponent::class)object StringModule { @Provides fun provideHelloString().. 2025. 3. 7.
[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.
[Operating System & Concurrency] 프로세서, 프로세스, 스레드, 코루틴의 개념과 관계 정리 운영체제를 공부하면서 여러 번 관계성을 정리하려 했지만, 학습할 때마다 다시 헷갈리는 반복이 이어졌습니다. 흐름을 제대로 정리하고자 여러 유튜브 강의를 찾아보던 중, 유튜버 얄팍한 코딩사전님의 "프로세스는 뭐고 스레드는 뭔가요?" 영상을 보고 개념을 정리하는 데 많은 도움을 받았습니다. 이 글은 해당 영상에서 설명된 내용을 바탕으로 나중에 다시 참고하기 위해 정리한 글입니다.또한, 프로세서, 프로세스, 스레드의 관계를 이해한 후, 처음에는 스레드와 비슷하게 보였던 코루틴의 개념까지 정리하고 싶어 관련 블로그 글을 찾아 읽었습니다. 이 과정에서 발견한 글을 통해 스레드와 코루틴의 차이를 이해하는 데 큰 도움이 되었으며, 이를 바탕으로 최종적으로 본 글을 정리하게 되었습니다.혹시라도 이 글을 보게 된 분이라.. 2025. 3. 6.
반응형