전체 글 26

Flow, StateFlow, SharedFlow

Stream시간의 흐름에 따라 여러 값이 전달되는 데이터의 흐름이다.함수가 값 하나를 반환하는 것과 달리, 여러 값을 순차적으로 전달한다ex. 검색어 입력, 위치 변경, 서버 응답Hot Stream vs Cold StreamCold Stream구독자가 수집을 시작할 때 각자 새로운 생산 작업이 시작됨구독자가 독립적으로 스트림이 실행됨일반적인 flow {} 가 대표적이다val numbers = flow { println("Flow 시작") emit(1) emit(2)}numbers.collect { println("A: $it") }numbers.collect { println("B: $it") }// "Flow 시작"이 두 번 출력된다. 각 collect가 별도의 실행을 시작해서이다.Ho..

Kotlin coroutine - suspend 함수

suspend 함수코루틴 실행을 일시정지 할 수 있는 함수이다. 대표적으로 delay 함수가 지정한 시간만큼 코루틴을 일시정지 하는 함수이다. (delay가 사실 suspend 함수 종류중 하나이다.)코루틴 라이브러리에서는 delay 뿐만 아니라 다양한 suspend 함수를 지원한다.suspend 함수는 코루틴 또는 다른 suspend 함수에서만 호출해야한다 예시우리는 1초가 걸리는 A 작업과 B 작업을 하고싶다. A 와 B는 시간이 많이 걸리는 작업이므로, 다른 코루틴에게 맡겨놓고 다른 작업을 처리하고자 한다.대략적인 순서는 아래와 같다.오래 걸리는 A와 B 작업을 먼저 실행시켜 놓는다. 다른 코루틴에게 해당 작업을 시켜놓고, 나는 다른 작업을 실행한다. 이를 코드로 표현하면 아래와 같다.fun mai..

함수형 프로그래밍

프로그래밍 패러다임과 함수형 프로그래밍컴퓨터 프로그램의 구현을 개념화 하고 구조화 하는 방법. 하나의 언어는 하나 또는 여러 개의 패러다임을 지원하는 것으로 분류 가능하다. 프로그래머에게 프로그래밍의 관점을 갖게 하고, 코드를 어떻게 작성할지 결정하는 역할을 한다.최근의 프로그래밍 패러다임은 아래와 같이 분류된다.명령형 프로그래밍: 무엇(What)을 할 것 인지보다 어떻게(How) 할 것인지를 설명하는 방식,컴퓨터에게 절차와 순서를 하나하나 명령함.절차 지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식객체 지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현선언형 프로그래밍: 어떻게(How) 보다 무엇(What)을 할 건지 설명하는 방식함수형 프로그래밍: 순수 함수를 조합하고 ..

우테코 8기 2026.08.30

Instrumented Test (계측 테스트)

프로젝트를 진행하면서 선택 프로그래밍 요구사항 중 하나가 “자동화 된 테스트” 였다. 그 중 키워드 하나로, 계측 테스트가 있었다.계측 테스트계측 테스트는 일반적으로 안드로이드 종속성이 있는 코드를 테스트 한다. 실제 안드로이드 에뮬레이터나 디바이스에서 실행된다.계측 테스트는 실 기기에서만 테스트 해야하는 기능에 대해서 하는 것을 추천한다.대표적인 라이브러리로는 Espresso, Robotium 등등이 있다. 우리 팀의 경우엔 JUnit 으로도 가능했다.단위 테스트 vs 계측 테스트단위 테스트는 격리된 상태에서 테스트 해야할 대상에 집중한다. 해당 클래스의 작은 기능들이 제대로 동작하는지, 도메인 규칙을 지키고 있는지 등등을 확인하기 위해서 사용한다. 독립된 상태를 유지하기 위해서 외부에서 Mock 객체..

expect / actual 키워드 (Kotlin Multiplatform, KMP)

expect / actual 키워드는 KMP에서 제공된다. 원래는 KMP를 쓰면서 많이 사용했었는데, 최근들어서 Android ViewModel에서도 코드를 타고 들어가다보면 expect/actual 이 나오기도 한다.멀티 플랫폼을 지원하면서 안드로이드, ios 모두의 비즈니스로직을 구현하기 위해 kotlin 함수에 붙일 수 있는 키워드이다.함수, 프로퍼티, 클래스, 인터페이스, 열거형, 어노테이션에 해당 키워드를 적용할 수 있다.일종의 인터페이스나 추상클래스와 비슷한 역할을 한다. 다만 의도는 다르다. abstract class 의 경우 자신을 상속하는 클래스가 추상체로 포함된 함수, 변수를 구현하도록 하지만, expect는 KMP 내 공통 모듈에서 선언된 선언체가 Android 나 iOS 각각에서 구..

Dagger 기본 개념과 @Inject, @Component

Dagger를 사용해 의존성을 관리하면 프로젝트가 커져도 복잡도를 낮출 수 있다.Dagger는 개발자가 직접 작성해야 하는 코드를 자동으로 생성해준다. 코드가 컴파일 시점에 생성되므로 추적이 가능하고, Guice(Java DI 도구) 같은 리플렉션 기반 보다 성능이 뛰어나다Dagger의 장점Dagger를 통해 보일러플레이트 코드를 줄일 수 있다.수동 의존성 주입 섹션에서 직접 구현한 AppContainer 코드(어플리케이션 그래프)를 자동으로 생성해준다.어플리케이션 그래프에서 사용할 수 있는 클래스의 팩토리를 생성한다. 이를 통해 내부적으로 의존성이 충족된다범위(scope)를 사용해 의존성을 재사용할지 새로운 인스턴스를 생성할지 결정한다Dagger 서브컴포넌트를 사용해 특정 화면 흐름에 맞는 컨테이너를 ..

Android AppFunctions - 내 프로젝트에 연결하기

GDG행사인 Google I/O Extended 에서 핸즈온 세션에 운빨로 참여할 수 있는 기회가 생겼다. 내용은 “Android App Functions: 내 앱을 에이전트에게 연결하기” 였다.What's new in Android 2026 Google I/O 에서 발표한 내용으로, App Functions를 Android의 온디바이스 MCP 방식으로 나왔다고 한다. 이전부터 AppFunctions는 존재했지만, Gemini와 연결하는 실제 개발 경험을 이번에 본격적으로 공개했다.해당 영상을 보면, 간단하게 첫 번째 앱인 채팅 앱을 구현하고, 사용자가 AI에게 부탁을 하는 두 번째 앱에, Gemini API Key를 넣어 실행하면, 두 번째 앱에서 간단하게 프롬프트로 “~~에게 ~~라고 보내줘” 라고 ..

가변성을 제한하라

본 내용은 이펙티브 코틀린에 있는 “Limit Mutability”에 관련된 내용이다.Effective Kotlin Item 1: Limit mutability kt.academyTeaching Kotlin, with focus on the best practices.kt.academy 가변 상태를 왜 제한할까?가변 상태의 문제점코틀린을 사용하면서 아래와 같은 프로퍼티나 리스트를 사용해본 적이 있을 것이다.var a = 10val list: MutableList = mutableListOf()객체나 요소가 위와 같이 읽기, 쓰기가 모두 가능한 프로퍼티(var)나 가변 리스트(MutableList)를 상태로 가질 수 있다. 상태란, 객체나 요소가 갖고 있는 변할 수도 있는 값이다.요소가 상태를 들고 있게 ..

Compose에서 접근성 제공하기(1) - semantics, contentDescription

컴포즈의 Semantics는 컴포저블 컴포넌트에 대해서 접근성, 자동 완성, 테스트를 위한 추가적인 맥락을 제공한다.짧게 접근성과 Talkback 이해하기일반적으로 시각장애인에게 접근성 서비스를 제공하기 위해 사용한다.@Composableprivate fun PostMetadata(metadata: Metadata) { Row() { Image( imageVector = Icons.Filled.AccountCircle, contentDescription = "프로필 사진" // 이 부분! ) Column { Text(metadata.author.name) Text("${metadata..

반응형