전체 글132 [Kotlin] Flow 기본 개념 딥 다이브 1. Flow, 왜 필요한가?애플리케이션 개발에서 우리는 종종 데이터 스트림(Data Stream), 즉 시간이 지남에 따라 순차적으로 발생하는 데이터의 흐름을 다뤄야 합니다. suspend함수가 단 한 번의 비동기 결과를 반환하는 데 최적화되어 있다면, Flow는 여러 개의 비동기 결과를 순차적으로 반환하는 데 사용됩니다.과거 안드로이드에서는 RxJava가 데이터 스트림을 다루는 표준 라이브러리였습니다.Flow는 코루틴을 기반으로 하여, RxJava의 강력한 기능들을 더 가볍고, 더 간결하며, 코틀린 언어에 더 자연스러운 방식으로 제공하기 위해 탄생했습니다.2. Flow의 기본 구조: 생산자, 중개자, 소비자Flow는 세 가지 구성 요소로 이루어집니다.생산자 (Producer): flow { ... }.. 2025. 12. 19. [Flutter] AdManager 리팩터링 : 새로운 타입 추가 기존 아키텍처를 유지하며 새로운 타입 추가하기앱의 광고 시스템은 AdManager에서 관리하고 있었습니다. AdManager는 서버로부터 데이터를 받아와서 AdInfo 객체를 생성하고, 이를 AdBanner라는 Widget에 주입하는 방식이었습니다.AdManager : 광고 로딩 및 데이터 관리 (내부 데이터베이스 & 서버 비즈니스 로직 담당)AdInfo : 광고 id, 이미지 URL, 링크, 타이틀 등을 담은 데이터 객체AdBanner : AdInfo를 받아 렌더링하는 위젯기존에는 이미지 배너 형태만 존재했기에 이 구조는 매우 심플하고 효율적이었습니다.새로운 요구사항"서버에 등록된 광고가 없을 땐 광고 플랫폼 광고를 보여주면 좋을 것 같아요." 비즈니스 요구사항은 간단했지만, 기술적인 문제는 간단하지 .. 2025. 12. 17. [Kotlin] Sealed class & Sealed interface 가이드 Kotlin sealed class 소개Kotlin에서 sealed class는 제한된 클래스 계층 구조를 정의할 때 사용하는 강력한 도구입니다. 쉽게 말해, 부모 클래스를 상속받는 자식 클래스의 종류를 컴파일러가 모두 알고 있게 만드는 기능입니다.결론적으로 이러한 특성 덕분에 개발자의 실수를 줄여주고, 코드의 안정성을 높여줍니다. 사용하는 이유Enum class의 한계enum class는 상수 집합을 정의하는 데 유용하지만, 각 상수가 하나의 인스턴스만 가질 수 있다는 단점이 있습니다. 서로 다른 상태 값을 가진 객체를 개별적으로 생성할 수 없습니다.// UI의 상태를 표현하려고 함 (로딩 중, 성공, 실패)enum class UiState(val data: String?, val error: Exce.. 2025. 12. 15. [Kotlin] Abstract class (클래스를 위한 미완성 설계도) 소개Kotlin에서 abstract class는 말 그대로 추상적인(미완성된) 클래스를 의미합니다. 스스로는 객체(인스턴스)를 만들 수 없으며, 오직 다른 클래스가 이를 상속받아 완성시킬 때만 의미를 가집니다. 마치, 건물을 짓기 위한 청사진(Blueprint)이나 템플릿과 같은 역할을 합니다. 특징인스턴스화 불가: abstract class는 미완성 상태이므로 직접 객체를 생성할 수 없습니다.멤버의 구성:추상 멤버 (Abstract Member): 구현부 없이 선언만 된 멤버. 상속받는 자식 클래스가 반드시 구현해야 합니다. (open 키워드 불필요)구현된 멤버 (Concrete Member): 이미 로직이 구현된 멤버. 자식 클래스가 그대로 쓰거나 필요시 오버라이드 할 수 있습니다.상태(State) .. 2025. 12. 15. [Kotlin] Coroutine 기본 개념 딥 다이브 Android & Main Thread안드로이드의 View는 메인 스레드에서 업데이트가 된다. 그 이유는 서로 다른 스레드에서 View를 동시에 업데이트하면 문제가 발생할 수 있기 때문이다.안드로이드는 프레임 렌더링을 위해서 60fps(1초에 60 프레임 렌더링), 16ms(하나의 프레임을 렌더링 하는 데 걸리는 시간)에 달성해야 한다고 한다. 이 이하로 떨어지게 되면 시각적으로 봤을 때, 버벅거림이 발생하고 사용자에게 안 좋은 경험을 제공할 수 있기 때문이다. 스레드는 한 번에 하나의 일을 처리할 수 있다. 메인 스레드는 View 업데이트에 사용되어야 한다. 만약 View 업데이트가 아닌 다른 작업이 많아지거나 오래 걸린다면 메인스레드가 View 업데이트를 하지 못하게 된다. 결과적으로 View 업데.. 2025. 5. 29. [Android] Compose Dialog Animation 개요Compose를 활용할 때, Dialog를 활용하기 위해서 Dialog 함수를 많이 사용합니다. 또한, Animation을 적용하기 위해서 AnimatedVisibility 함수를 사용하면 아마 코드가 이런 식으로 작성될 것이라고 생각됩니다.val openDialog = remember { mutableStateOf(false) }AnimatedVisibility( visible = openDialog.value, ...) { Dialog(onDismissRequest = {}) { Text("Test") } }출처 : https://stackoverflow.com/questions/72527630/animatedvisibility-not-working-with-dialog 다만, D.. 2024. 8. 15. [Android] Compose TextField 개요TextField는 유저가 텍스트를 입력할 수 있도록 하는 Composable 함수이다. Composable TextFieldView에서 EditText를 정의했을 땐, 정의한 후 텍스트 입력이 자유로웠지만, TextField에서 텍스트 입력을 사용하기 위해서는 remember API를 함께 사용해야 한다. 아래 코드 블록과 같이 text에 대한 선언이 없다면 TextField에 Text 입력이 제대로 이루어지지 않는다.var text by remember { mutableStateOf("") }TextField( value = text, onValueChange = { text = it },)remember API는 간단하게 이야기하면 포함되어 있는 Composable 함수에 저장되는 .. 2024. 2. 27. [Android] Compose Button 개요Composable 함수를 사용하여 다양한 Button을 쉽게 만들 수 있다. 버튼은 사용자가 정의된 작업을 트리거할 수 있도록 도와주는 기본 구성요소이다. Composable Button일반적으로 Button은 onClick 속성과 content 속성을 정의한다. onClick 속성은 모든 버튼이 공통적으로 갖고 있는 속성이며, 여기에 트리거를 정의한다. content 속성은 Composable 함수를 정의하는 람다식으로 Composable Button 안에 contents를 custom 하기 위해 자유롭게 정의할 수 있다.Button(onClick = { /*TODO*/ }) { } Text Button 구현하기일반적으로 Button 안에 Text를 입력한 형태를 가.. 2024. 2. 25. [Android] Compose Text 개요Android에서 UI를 개발할 때 Text는 꼭 필요한 중요 요소 중의 하나이며, Jetpack Compose를 사용하면 Text를 더 쉽게 표현할 수 있다. TextText의 text 속성 값은 String 형식이다. 따라서 문자열 변수를 사용하거나 직접 입력이 가능하며, strings.xml에 정의한 속성 역시 사용 가능하다.Column { Text(text = "Hello World") Text(text = stringResource(id = R.string.hello_world))}String 값과 strings.xml 속성을 사용하는 방법과 결과물이다. 둘 사이의 차이점은 없다. Text Style색상 변경Text( text = stringResource(id = R.str.. 2024. 2. 24. 이전 1 2 3 4 ··· 15 다음 반응형