Android, Kotlin, Firebase 분야의 Google Developer Expert (GDE)인 엄재웅 (skydoves)이 2024년부터 Dove Letter를 운영해 오면서 직접 작성하고 검수한 기술 면접 질문과 상세한 답변이 정리되어 있습니다. 안드로이드, 코틀린, 코루틴, 컴포즈, 아키텍처 등 범용적인 주제에 대해 깊은 학습을 하실 수 있습니다.
R8은 안드로이드 애플리케이션의 기본 코드 축소기code shrinker, 최적화기, 그리고 난독화 도구입니다. 빌드 타임에 실행되어 컴파일된 바이트코드를 받아, 사용되지 않는 코드를 제거하고 인라이닝inlining과 역가상화devirtualization 같은...
Compose에서 모든 프레임은 Composition, Layout, Drawing이라는 세 단계를 순서대로 거칩니다. Composition 단계에서는 컴포저블composable 함수를 재실행하여 노드 트리를 생성하거나 업데이트하고, Layout 단계에서는 각...
코틀린 코루틴은 구조화된 동시성structured concurrency을 기반으로 한 협력적 취소cooperative cancellation 메커니즘을 통해 취소를 처리합니다. 취소가 발생하더라도 코루틴을 강제로 중단하는 것이 아니라, Job 계층 구조를 따라...
Kotlin Flow는 엄격한 컨텍스트 보존 규칙을 적용합니다. 모든 방출emission은 Flow가 수집collect되는 코루틴 컨텍스트와 동일한 컨텍스트에서 이루어져야 합니다. 이 불변 조건invariant은 Flow 설계의 근간이 되는 원칙으로, 별도의...
Hilt는 Dagger 위에 구축된 안드로이드용 컴파일 타임 의존성 주입dependency injection 프레임워크입니다. Hilt의 가장 핵심적인 아키텍처 결정은 어노테이션 프로세싱을 두 단계로 분리하는 2단계 컴파일 모델에 있습니다. 첫 번째 단계에서는...
코루틴 디스패처Coroutine Dispatcher는 코틀린 코루틴이 어떤 스레드 또는 스레드 풀에서 실행될지를 제어하는 핵심 메커니즘입니다. 디스패처는 ContinuationInterceptor 인터페이스를 구현하여, 모든 Continuation을 재개하기...
코틀린의 suspend 함수는 소스 코드 상에서는 순차적인 코드처럼 보이지만, 컴파일러가 내부적으로 CPSContinuation-Passing Style 기반의 상태 머신state machine으로 변환합니다. 이 변환이야말로 코루틴 시스템 전체의 근간이 되는...
안드로이드의 Toast는 가장 흔하게 사용되는 UI 컴포넌트 중 하나이지만, 내부 아키텍처를 들여다보면 안드로이드 프레임워크가 윈도우, 시스템 서비스, 스레딩을 관리하는 방식에 대한 핵심 개념들이 드러납니다. Toast는 단순한 텍스트 팝업이 아닙니다....
코틀린의 inline 키워드는 JVM 언어 설계에서 근본적인 딜레마를 해결합니다. 고차 함수higher-order function와 같은 고수준 추상화를 제공하면서도 익명 클래스 할당과 가상 디스패치virtual dispatch에 따르는 런타임 비용을 제거해야...
코틀린 코루틴은 코루틴이 무엇을 하는지와 어디에서 실행되는지를 분리합니다. 실행 위치를 결정하는 것이 바로 코루틴 디스패처coroutine dispatcher이며, 디스패처는 코루틴의 Continuation을 적절한 스레드에 할당하는 역할을 합니다. 안드로이드...
상태 호이스팅state hoisting은 Jetpack Compose에서 예측 가능하고 재사용 가능하며 테스트하기 쉬운 UI 컴포넌트를 구축하기 위한 핵심 패턴 중 하나입니다. 기본 아이디어는 간단합니다. 컴포저블이 직접 상태를 소유하는 대신, 호출자caller...
웹툰 리더 애플리케이션은 모바일 플랫폼에서 가장 까다로운 이미지 로딩 과제 중 하나입니다. 사용자는 고해상도 아트워크로 이루어진 세로 연속 스트립을 수직으로 스크롤하며, 한 화chapter당 수십 개의 개별 비트맵 타일을 넘나듭니다. 이때 실제 종이를 넘기듯...
단순한 프로토타입 수준을 넘어서는 안드로이드 애플리케이션에는 명확한 관심사 분리separation of concerns, 예측 가능한 데이터 흐름, 그리고 기능 확장에 맞춰 성장할 수 있는 계층 구조가 필수적입니다. Google의 공식 아키텍처 가이드는 이러한...
실시간 채팅 화면을 구현하려면 지속적인 네트워크 연결, 로컬 영속성persistence, 낙관적 UI 업데이트optimistic UI update, 그리고 효율적인 리스트 렌더링을 모던 안드로이드 아키텍처 안에서 조화롭게 조율해야 합니다. 채팅 도메인은...
코틀린 코루틴은 동시성 작업을 시작하기 위한 두 가지 주요 코루틴 빌더coroutine builder를 제공합니다. 바로 launch와 async입니다. 두 빌더 모두 구조화된 동시성structured concurrency 스코프 내에서 새로운 코루틴을...
UI 버벅임jank은 메인 스레드가 한 프레임의 데드라인 내에 작업을 완료하지 못할 때 발생하며, 사용자에게 눈에 보이는 끊김이나 프레임 드롭으로 나타납니다. 최신 안드로이드 기기에서 60Hz, 90Hz, 120Hz 등 다양한 주사율을 지원하기 때문에, 한...
모든 안드로이드 Activity는 프레임워크의 ActivityManager 서비스와 ActivityThread 클래스가 관리하는 엄격한 생명주기lifecycle를 따릅니다. 시스템이 Activity를 포그라운드로 가져오거나, 전화 수신으로 일시 중지하거나,...
사용자가 앱 아이콘을 탭했을 때 메모리에 아무것도 없는 상태라면, 시스템은 새로운 프로세스를 생성하고, Application 클래스를 로드한 뒤, ContentProvider를 인스턴스화하고, Application.onCreate를 호출한 후, 대상...
Android Studio의 APK Analyzer는 리버스 엔지니어링 없이도 APK, AAB, ZIP 파일의 내부 구성을 검사할 수 있는 도구입니다. 개발자들이 주로 파일 크기나 DEX 메서드 수를 확인하는 용도로 사용하지만, 사실 가장 유용한 기능 중 하나는...
Jetpack Compose에서 모든 컴포저블composable 함수는 세 가지 이벤트로 정의되는 생명주기를 따릅니다. 컴포지션Composition에 진입하고, 0회 이상 리컴포지션Recomposition을 수행하며, 최종적으로 컴포지션에서 벗어납니다. 전통적인...
Jetpack Compose는 컴포저블 함수의 매개변수가 가진 안정성stability을 기반으로, 부모 컴포저블이 리컴포지션Recomposition될 때 자식 컴포저블의 리컴포지션을 건너뛸 수 있는지 여부를 판단합니다. 안정적인stable 타입이란...
Android 10API 29부터 포그라운드 서비스를 실행 중인 앱은 백그라운드에서 직접 Activity를 시작하는 것이 원칙적으로 제한됩니다. 포그라운드 서비스가 사용자에게 인식되는 진행 중인 작업을 나타내더라도, 시스템은 새로운 Activity를 시작할 수...
스레드와 코루틴은 모두 동시 실행을 가능하게 하지만, 관리 방식, 블로킹 처리 방식, 리소스 소비량에서 근본적인 차이가 있습니다. 스레드는 운영 체제 수준의 구조물로서 자체 호출 스택call stack을 가지며, OS 스케줄러가 관리합니다. 반면 코루틴은 언어...
UI 상태 생산 파이프라인state production pipeline에서는 항목 삭제나 단일 레코드 조회와 같은 원샷one-shot 연산과, 리포지토리의 실시간 업데이트처럼 스트림 기반의 소스를 결합하는 경우가 흔히 발생합니다. 이때 권장하는 전략은 원샷...
LazyColumn의 아이템이 순서가 바뀌거나 추가, 삭제될 때 Jetpack Compose는 각 아이템의 remember 상태를 올바른 데이터에 연결해 두어야 합니다. 아이템 키item key가 바로 이 연결 고리 역할을 합니다. 키를 명시하지 않으면...
스낵바Snackbar와 같은 일시적 UI 메시지는 네트워크 요청 실패나 특정 작업 완료 등 ViewModel 로직에서 발생하는 경우가 많습니다. 단방향 데이터 흐름Unidirectional Data Flow, UDF 아키텍처에서는 이러한 메시지를 일회성...
Baseline Profiles는 프로파일 가이드 최적화Profile Guided Optimization, PGO의 한 형태로, 사용자가 접하는 핵심 코드 경로에 대해 AOTAhead-of-Time 컴파일을 가능하게 함으로써 첫 실행부터 안드로이드 앱의 성능을...
Build Analyzer는 Android Studio에 내장된 도구로, 어떤 Gradle 태스크와 플러그인이 빌드 시간에 가장 큰 영향을 미치는지 상세한 데이터를 제공하여 빌드 성능 문제를 감지하고 해결하는 데 도움을 줍니다. 빌드 간 리포트를 비교하면 성능...
Jetpack Compose는 텍스트 입력을 처리하기 위해 값 기반value-based 텍스트 필드와 상태 기반state-based 텍스트 필드, 두 가지 접근 방식을 제공합니다. 이 두 방식은 입력 상태 관리, 텍스트 변환 처리, 줄 수 제한 설정, 보안 입력...
Jetpack Compose는 컴포지션Composition 트리를 따라 데이터를 암묵적으로 전달하는 메커니즘으로 CompositionLocal을 제공합니다. CompositionLocal을 사용하면 모든 컴포저블 함수의 매개변수로 데이터를 일일이 전달하지 않아도...
Jetpack Compose는 시맨틱스Semantics 시스템을 통해 UI 요소의 시각적 외형 이상의 의미meaning를 정의합니다. 이 시스템은 접근성Accessibility 서비스와 테스트 프레임워크 양쪽에서 활용되며, 구현 세부 사항에 의존하지 않고도 UI...
코틀린 코루틴은 코루틴 간 데이터를 전달하기 위한 두 가지 핵심 동시성 프리미티브concurrency primitive를 제공합니다. 바로 Channel과 Deferred입니다. Deferred<T는 미래에 완료될 단일 결과를 나타내고, Channel<T는 값의...
Jetpack Compose에서는 커스텀 Modifier를 생성하는 여러 가지 방법을 제공하며, 각 접근 방식은 단순성, 유연성, 성능 사이에서 서로 다른 트레이드오프를 가집니다. 적합한 방식을 선택하려면 Compose 상태state에 접근할 필요가 있는지,...
안드로이드 아키텍처에서 UI 레이어는 두 가지 핵심 역할을 담당합니다. 첫째는 애플리케이션 데이터를 화면에 렌더링하는 것이고, 둘째는 사용자와 상호작용하는 인터페이스 역할입니다. UI 레이어 내에서 상태state가 어떻게 흘러가는지에 따라 전체 애플리케이션의...
Jetpack Compose는 하나의 거대한 모놀리식 툴킷이 아니라, 계층화된 모듈형 프레임워크로 설계되어 있습니다. 각 계층은 하위 계층의 컴포넌트 위에 구축되며, 위로 올라갈수록 더 높은 수준의 추상화와 편의성을 제공합니다. 동시에 개발자가 사용 사례에 맞는...
코틀린 코루틴은 안드로이드 비동기 프로그래밍을 위한 구조적이고 경량화된 솔루션을 제공합니다. 스레드를 블로킹하지 않으면서도 코드의 가독성을 유지할 수 있도록 설계되어 있으며, 네트워크 요청과 같은 백그라운드 작업을 메인 스레드를 멈추지 않고 수행할 수 있습니다....
단위 테스트unit test란 함수, 클래스, 또는 작은 컴포넌트 같은 하나의 "단위unit"를 나머지 시스템으로부터 격리하여 정확성을 검증하는 테스트입니다. 안드로이드 개발에서 단위 테스트는 주로 비즈니스 로직, 유틸리티 클래스, 또는 ViewModel의...
Jetpack Compose에서 UI 상태를 보존하는 것은 매끄러운 사용자 경험을 유지하기 위해 필수적입니다. 특히 구성 변경configuration changes이 발생하거나 시스템이 프로세스를 종료process death한 뒤 앱이 복원되는 상황에서 상태가...
안드로이드 개발에서 깔끔하고 일관되며 오류 없는 코드를 유지하는 것은 앱의 안정성과 장기적인 유지보수에 필수적입니다. Lint는 Android Studio에 내장된 정적 코드 분석static code analysis 도구로, 앱을 실행하거나 빌드하기 전에...
안드로이드는 장기 실행 백그라운드 작업을 처리하기 위한 다양한 메커니즘을 제공합니다. 이러한 메커니즘은 시스템 리소스를 효율적으로 사용하면서도 최신 OS의 백그라운드 실행 제한 정책을 준수하도록 설계되어 있습니다. 작업의 성격, 긴급도, 그리고 앱 생명주기와의...
Jetpack Compose에서 리컴포지션Recomposition은 관찰 가능한 상태state가 변경될 때 UI를 업데이트하는 핵심 프로세스입니다. Compose의 반응형 프로그래밍 모델에서 가장 중심적인 역할을 담당하며, 컴포지션 생명주기의 핵심 메커니즘 중...
Kotlin은 컬렉션에서 특정 부분 집합이나 원하는 요소를 추출하기 위한 다양한 확장 함수extension function를 제공합니다. 이 함수들은 원본 컬렉션을 변경하지 않으면서도 효율적으로 데이터를 꺼내올 수 있도록 설계되어 있습니다. 각 상황에 맞는...
ViewStub은 레이아웃 인플레이션layout inflation을 명시적으로 필요한 시점까지 지연시키기 위해 사용하는 경량의 보이지 않는 플레이스홀더placeholder 뷰입니다. 앱의 생명주기 동안 즉시 필요하지 않거나 아예 사용되지 않을 수 있는 뷰를...
Jetpack Compose는 UI 상태 간 부드러운 전환을 구현할 수 있는 선언적declarative 애니메이션 시스템을 제공합니다. 내장 API를 활용하면 컴포저블composable의 등장과 퇴장, 콘텐츠 변경, 크기 조절, 프로퍼티 전환 등 다양한...
페이징paging 시스템은 대용량 데이터셋을 다룰 때, 데이터를 로드하고 화면에 표시하는 방식을 최적화하는 기법입니다. 작고 관리하기 쉬운 단위chunk로 나누어 데이터를 가져오기 때문에, 앱의 성능을 안정적으로 유지하면서 더 나은 사용자 경험을 제공할 수...
runBlocking은 코틀린에서 일반적인 블로킹 코드와 suspend 함수를 연결해 주는 코루틴 빌더입니다. 코루틴 실행이 완료될 때까지 현재 스레드를 블로킹하는 방식으로 동작하며, suspend 함수를 비非 suspend 컨텍스트에서 호출할 때 편리해 보일...
뷰 무효화invalidation란 특정 View를 다시 그려야 한다고 표시하는 과정을 의미합니다. 안드로이드 뷰 시스템에서 UI 변경 사항을 화면에 반영하기 위한 핵심 메커니즘이며, View가 무효화되면 시스템은 다음 드로잉 사이클drawing cycle에서...
안드로이드 애플리케이션은 두 가지 주요 형식으로 배포됩니다. APKAndroid Package와 AABAndroid App Bundle가 바로 그것입니다. APK는 모든 기기 구성에 필요한 리소스를 통째로 포함하는 전통적인 설치 형식이며, AAB는 Google이...
고차 함수higher-order function란 다른 함수를 매개변수로 받거나, 함수를 반환하거나, 혹은 두 가지를 모두 수행하는 함수를 의미합니다. 이 개념은 코틀린이 함수형 프로그래밍functional programming을 지원하는 데 핵심적인 역할을...
Jetpack Compose에서 수백, 수천 개의 아이템을 화면에 표시해야 할 때, Column과 같은 일반 레이아웃은 화면에 보이는지 여부와 관계없이 모든 자식 컴포저블을 한꺼번에 컴포지션합니다. 이로 인해 불필요한 메모리 소비와 컴포지션 오버헤드가 발생하며,...
Kotlin 프로퍼티는 접근자accessor를 포함하는 필드를 간결한 문법으로 선언할 수 있게 해줍니다. 이 문법 뒤편에서는 프로퍼티 값의 실제 저장을 관리하는 두 가지 메커니즘이 존재합니다. 바로 backing field와 backing property입니다.
두 개의 Activity 사이를 전환할 때 생명주기 콜백이 어떤 순서로 호출되는지 이해하는 것은 리소스 관리, 상태 보존, 그리고 화면 전환 시 시각적 결함visual glitch 방지에 필수적입니다. 안드로이드 시스템은 나가는 Activity와 들어오는...
Jetpack Compose에는 네트워크 URL로부터 이미지를 로딩하는 빌트인 API가 포함되어 있지 않습니다. 이는 의도적인 설계 결정으로, 네트워크 이미지 로딩에는 HTTP 요청, 비트맵 디코딩, 메모리 및 디스크 캐싱, 다운샘플링downsampling,...
produceState 함수는 컴포지션Composition 내부에서 코루틴을 실행하여 State 객체의 값을 생성하는 Compose API입니다. 네트워크 요청, 데이터베이스 쿼리, 장기 실행 연산 등 비동기 작업의 결과를 Compose의 반응형...
안드로이드 애플리케이션의 크기를 최적화하면 다운로드 전환율, 저장 공간이 제한된 디바이스에서의 설치 성공률, 그리고 업데이트 수용률에 직접적인 영향을 미칩니다. 최종 APK 또는 AAB 크기를 최소화하려면 빌드 설정부터 리소스 최적화, 모듈식 전달에 이르기까지...
코틀린은 클래스, 인터페이스, 함수, 프로퍼티의 접근 범위를 제어하는 네 가지 가시성 수정자visibility modifier를 제공합니다. public, private, protected, internal 이 네 가지 수정자는 코드 접근에 대한 명확한 경계를...
Baseline Profiles는 앱의 시작 시간을 단축하고 런타임 실행 성능을 높여 주는 안드로이드 성능 최적화 기능입니다. 사전에 컴파일해야 할 코드 정보를 안드로이드 런타임ART에 제공함으로써, 앱 설치 시점에 주요 코드 경로를 미리 컴파일할 수 있도록...
Kotlin에서 val 키워드는 불변성immutability을 보장한다고 흔히 오해받지만, 실제로는 초기화 이후 참조 재할당만 금지할 뿐입니다. 참조가 가리키는 객체 자체의 변경까지 막아 주지는 않습니다. 이 참조 불변성reference immutability과...
Box는 Jetpack Compose에서 가장 기본적인 레이아웃 컴포저블composable 중 하나로, 자식 요소들을 하나의 부모 영역 안에서 서로 겹쳐 쌓는 방식으로 배치합니다. Column이나 Row가 자식 요소를 하나의 축을 따라 순차적으로 배열하는 것과...
OAuth로 보호되는 API와 통신할 때, 토큰 만료 및 갱신 처리는 네트워킹 계층에서 매우 중요한 부분입니다. 실무에서도 거의 모든 프로젝트에서 마주치는 문제이므로, 면접에서 자주 등장하는 주제이기도 합니다. OkHttp는 이를 위한 두 가지 메커니즘을...
value class는 하나의 값을 래핑하면서, 런타임에 불필요한 객체 할당을 피하도록 컴파일러가 최적화하는 특수한 클래스입니다. 소스 코드 수준에서는 타입 안전성과 의미적 명확성을 제공하지만, 컴파일러는 가능한 한 호출 지점에서 래핑된 값을 인라인inline...
AndroidManifest.xml 파일은 모든 안드로이드 프로젝트에 반드시 포함되어야 하는 필수 설정 파일입니다. 이 파일은 애플리케이션에 관한 핵심 정보를 안드로이드 운영 체제에 선언하며, 앱과 시스템 사이의 다리 역할을 수행합니다. 운영 체제는 앱 설치...
컴포저블composable 함수 내부에서 Flow를 수집하는 것은 UI 상태를 관리하고 데이터 변경에 반응하기 위해 매우 흔히 사용되는 패턴입니다. 그러나 이를 올바르게 관리하지 않으면 메모리 누수, 불필요한 백그라운드 작업, 과도한...
flowOn 연산자는 Kotlin Flow에서 다운스트림downstream 수집기에 영향을 주지 않으면서 업스트림upstream 연산의 코루틴 컨텍스트를 변경하는 역할을 합니다. 비용이 큰 연산, IO 작업, 데이터베이스 쿼리 등을 백그라운드 스레드로 옮기면서도...
Context는 안드로이드 개발에서 가장 빈번하게 사용되는 객체 중 하나입니다. 애플리케이션 리소스, 시스템 서비스, 데이터베이스, SharedPreferences, 파일 시스템 등에 접근할 때 반드시 필요하며, 안드로이드 프레임워크의 거의 모든 기능과 연결되어...
코틀린은 요소의 그룹을 관리하기 위한 체계적인 컬렉션collection 타입을 제공합니다. 컬렉션은 크게 두 가지 범주로 나뉩니다. 접근 연산만 노출하는 읽기 전용read-only 컬렉션과 수정을 허용하는 가변mutable 컬렉션입니다. 이러한 구분은 별도의...
snapshotFlow는 Compose의 상태 관찰 시스템과 Kotlin의 Flow API를 연결해 주는 다리 역할을 합니다. Compose 스냅샷Snapshot 내부에서 읽힌 상태 값을 cold Flow로 변환하여, 관찰 중인 상태가 변경될 때마다 새로운 값을...
코틀린에서는 클래스 내부에 또 다른 클래스를 정의할 수 있으며, inner 키워드의 사용 여부에 따라 동작 방식이 달라집니다. inner 키워드 없이 선언된 nested class는 외부 클래스enclosing class에 대한 참조를 보유하지 않으며,...
안드로이드Android는 리눅스 커널Linux Kernel을 기반으로 한 오픈소스 운영 체제로, Google이 개발하고 유지·관리하고 있습니다. 스마트폰과 태블릿 같은 터치스크린 모바일 기기를 주 대상으로 설계되었지만, 웨어러블, TV, 자동차, IoT 기기 등...
LiveData는 안드로이드 Jetpack 아키텍처 컴포넌트Architecture Components에서 제공하는 관찰 가능한 데이터 홀더observable data holder 클래스입니다. 생명주기 인식lifecycle-aware 기능을 갖추고 있어,...
컴포지션Composition은 Jetpack Compose가 @Composable 함수를 실행하여 UI 트리를 구축하고 관리하는 핵심 프로세스입니다. @Composable 함수가 처음 실행되면, Compose 런타임은 해당 함수 호출을 내부 데이터 구조에...
안드로이드는 로컬 데이터를 저장하고 영속적으로 유지하기 위한 다양한 메커니즘을 제공하며, 각 메커니즘은 서로 다른 데이터 형태와 접근 패턴에 맞게 설계되어 있습니다. 올바른 저장 방식을 선택하려면 해당 데이터가 단순한 키-값key-value 쌍인지, 구조화된...
Kotlin은 null 안전성null safety 시스템을 통해 null 값을 안전하게 처리하지만, null과 관련된 일부 동작은 여전히 개발자를 놀라게 할 수 있습니다. 면접에서 자주 등장하는 주제 중 하나가 바로 null + null을 평가하면 어떤 결과가...
Jetpack Compose는 선언적declarative UI 프레임워크로, 개발자가 UI를 단계별 명령으로 직접 조작하는 대신 주어진 상태state에 대해 UI가 어떤 모습이어야 하는지를 기술합니다. 프레임워크가 상태 변경을 관찰하고, UI 트리에서 영향을...
ActivityManager는 안드로이드의 시스템 서비스system service로, 기기에서 실행 중인 액티비티, 태스크, 프로세스 및 메모리 상태에 대한 정보를 제공합니다. 시스템 수준의 리소스 사용량을 조회하고 애플리케이션 프로세스를 프로그래밍 방식으로...
안드로이드는 일반적인 뷰 드로잉 파이프라인 외부에서 콘텐츠를 렌더링하기 위한 두 가지 특수한 뷰 클래스를 제공합니다. 바로 SurfaceView와 TextureView입니다. 두 클래스 모두 비디오 재생, 카메라 프리뷰, 커스텀 그래픽 등 오프스크린...
안드로이드 애플리케이션은 디바이스에서 실행되기 전에 고유한 컴파일 및 실행 파이프라인을 거칩니다. 안드로이드 런타임ART, ART의 전신인 Dalvik, 그리고 Dex 컴파일러는 각각 애플리케이션 코드를 제한된 하드웨어 환경에서 효율적으로 실행할 수 있도록...
안드로이드 빌드 시스템은 빌드 변형build variant과 Product Flavor를 활용하여 하나의 코드베이스에서 여러 버전의 애플리케이션을 생성할 수 있도록 설계되어 있습니다. 빌드 타입build type은 애플리케이션의 컴파일 및 패키징 방식을...
코틀린의 함수형 인터페이스functional interface는 SAMSingle Abstract Method 인터페이스라고도 불리며, 추상 메서드가 정확히 하나만 존재하는 인터페이스를 람다 표현식으로 인스턴스화할 수 있게 해 줍니다. 이 메커니즘 덕분에 콜백,...
코틀린 멀티플랫폼Kotlin Multiplatform, KMP은 JetBrains에서 개발한 프레임워크로, 여러 플랫폼 간에 코드를 공유하면서도 플랫폼별 네이티브 API에 대한 접근성을 유지할 수 있도록 설계되었습니다. 플랫폼 자체를 완전히 추상화하는...
Bundle은 안드로이드에서 Activity, Fragment, Service 등 컴포넌트 간 데이터를 전달할 때 사용하는 키-값key-value 데이터 구조입니다. Bundle은 데이터를 운영 체제가 프로세스 경계를 넘어 전송하거나 구성...
CompositionLocal은 Jetpack Compose에서 컴포지션Composition 트리를 따라 데이터를 암시적으로 전달하는 메커니즘입니다. 매번 컴포저블 함수의 매개변수로 데이터를 일일이 전달하지 않아도, 테마, 설정 정보, 플랫폼 의존성 등 여러...
오프라인 퍼스트Offline First 설계란, 활성 네트워크 연결이 없더라도 애플리케이션이 정상적으로 동작하도록 로컬에 저장된 데이터를 우선 활용하고, 네트워크 연결이 복구되었을 때 원격 서버와 동기화하는 방식을 말합니다. 모바일 기기에서는 불안정하거나...
스코프 함수scope function란 Kotlin 표준 라이브러리에서 제공하는 함수 집합으로, 특정 객체의 컨텍스트context 내에서 코드 블록을 실행할 수 있게 해줍니다. 스코프 함수를 사용하면 보일러플레이트 코드를 줄이고, 가독성을 높이며, 객체 초기화...
코틀린은 객체를 비교할 때 두 가지 연산자를 제공합니다. 구조적 동등성structural equality을 검사하는 == 연산자와, 참조적 동등성referential equality을 검사하는 === 연산자가 바로 그것입니다. 구조적 동등성은 두 객체의 내용이...
안드로이드 파일 시스템은 리눅스 커널 위에 구축된 구조화된 환경으로, 디바이스 전체의 데이터 저장을 관리하고 체계적으로 구성합니다. 각 애플리케이션에 격리된 저장 공간을 제공하고, 사용자 콘텐츠를 위한 공유 디렉터리와 운영 체제 자체를 위한 보호된...
람다 표현식lambda expression이란 이름이 없는 익명 함수로, 값처럼 다룰 수 있는 함수 리터럴입니다. 다른 함수의 인자로 전달하거나, 반환값으로 사용하거나, 변수에 저장하는 것이 모두 가능합니다. 람다는 코틀린의 함수형 프로그래밍을 떠받치는 핵심...
Jetpack Compose에서 컴포저블composable은 자체적으로 상태state를 관리하는지, 아니면 외부로부터 상태를 전달받는지에 따라 stateful 컴포저블과 stateless 컴포저블로 분류할 수 있습니다. 이 두 가지의 차이를 명확히 이해하는 것은...
Context는 안드로이드에서 애플리케이션 리소스, 시스템 서비스, 컴포넌트 생명주기 정보에 접근할 수 있도록 해 주는 기본base 클래스입니다. 모든 Activity, Service, Application, BroadcastReceiver는 Context를...
Application 클래스는 안드로이드에서 전역 애플리케이션 상태global application state를 유지하기 위한 기본 클래스입니다. Activity, Service, BroadcastReceiver, ContentProvider보다 먼저...
Jetpack Compose는 스냅샷 상태snapshot state 시스템과 통합되는 관찰 가능한 컬렉션 타입으로 mutableStateListOf와 mutableStateMapOf를 제공합니다. 일반적인 MutableList나 MutableMap과 달리, 이...
경쟁 조건race condition이란, 공유 가변 상태shared mutable state에 동시에 접근하는 여러 작업의 실행 순서에 따라 프로그램의 정확성이 달라지는 현상을 말합니다. 두 개 이상의 스레드 또는 코루틴이 적절한...
안드로이드는 가비지 컬렉션Garbage Collection 메커니즘을 통해 메모리를 관리하며, 애플리케이션에서 더 이상 참조하지 않는 객체를 자동으로 회수합니다. Dalvik과 ART 런타임은 객체의 도달 가능성reachability을 추적하고, GC 사이클...
Jetpack Compose는 상태 관리 유틸리티로 derivedStateOf를 제공합니다. derivedStateOf는 다른 관찰 가능한 상태observable state로부터 값을 계산하여 파생된 상태 객체를 생성합니다. 핵심 이점은 파생 연산이 매...
팩토리 패턴Factory Pattern은 객체 생성을 전담 메서드나 클래스에 위임하는 생성 디자인 패턴creational design pattern입니다. 생성자를 직접 호출하는 대신 팩토리 메서드를 통해 객체를 만들기 때문에, 클라이언트 코드가 구체적인...
SparseArray는 정수int 키를 객체 값에 매핑하는 안드로이드 전용 자료구조로, HashMap<Integer, Object보다 메모리 효율이 높은 대안으로 설계되었습니다. 원시 타입primitive type int 키를 Integer 래퍼 객체로 변환하는...
코틀린의 Flow API는 두 가지 근본적으로 다른 방출emission 모델을 제공합니다. Cold Flow는 수집자collector가 존재할 때만 값을 생성하며, 새로운 수집자마다 처음부터 독립적으로 실행됩니다. 반면 Hot Flow는 수집자의 존재 여부와...
코틀린의 확장extension은 기존 클래스의 소스 코드를 수정하거나 상속하지 않고도 새로운 함수와 프로퍼티를 추가할 수 있는 기능입니다. 컴파일러는 확장 호출을 정적으로 해석resolve하며, 실제로 대상 클래스에 멤버를 삽입하지 않습니다. 대신, 수신자를 첫...
LRULeast Recently Used 캐시는 고정된 용량을 가진 자료구조로, 용량이 초과되면 가장 오래 전에 접근한 항목을 제거합니다. 해시 맵을 통한 키 조회와 이중 연결 리스트doubly linked list를 활용한 접근 순서 추적을 결합하여, 조회와...
리컴포지션Recomposition은 Jetpack Compose에서 입력 상태state가 변경되었을 때 컴포저블composable 함수를 다시 실행하는 과정입니다. Compose 런타임은 전체 UI 트리를 처음부터 다시 구성하지 않고, 어떤 컴포저블 함수가 어떤...
코틀린의 코루틴 라이브러리는 여러 수집자collector 간에 데이터를 공유하기 위한 두 가지 핫 Flowhot flow 타입을 제공합니다. 바로 StateFlow와 SharedFlow입니다. 두 타입 모두 수집자의 활성 여부와 관계없이 값을 방출하지만, 데이터...
AndroidManifest.xml 파일은 모든 안드로이드 애플리케이션 모듈의 루트에 반드시 존재해야 하는 필수 설정 파일입니다. 이 파일은 애플리케이션의 컴포넌트, 권한, 하드웨어 요구 사항, 메타데이터 등을 안드로이드 운영 체제에 선언하는 역할을 합니다....
Jetpack Compose에서는 레이아웃 컨테이너 내부에 자식 요소를 배치할 때 두 가지 핵심 개념을 사용합니다. Arrangement는 주축main axis을 따라 자식 요소 간의 간격과 분배를 제어하며, Alignment는 교차축cross axis을 따라...
빌더 패턴Builder Pattern은 복잡한 객체를 단계별로 생성하기 위해 널리 사용되는 생성 디자인 패턴creational design pattern입니다. 여러 개의 생성자를 다양한 매개변수 조합으로 오버로딩하는 대신, 빌더 객체가 메서드 호출을 통해 설정...
Kotlin에서 companion object는 클래스 내부에 companion object 키워드를 사용하여 선언하는 싱글톤singleton 객체입니다. companion object의 멤버는 특정 인스턴스가 아닌 클래스 자체에 속하며, Java의 static...
구성 변경Configuration Changes이란 디바이스의 상태가 변화하여 사용 가능한 리소스에 영향을 미치는 상황을 말합니다. 화면 회전, 로케일언어 변경, 다크 모드 전환, 글꼴 크기 조절 등이 모두 구성 변경에 해당합니다. 기본적으로 안드로이드 시스템은...
코틀린에서 DSLDomain Specific Language, 도메인 특화 언어이란, 확장 함수와 수신자가 있는 람다lambda with receiver 등 코틀린 고유의 언어 기능을 활용하여 특정 문제 영역에 맞춤화된 미니 언어처럼 읽히는 API를 설계하는...
ANRApplication Not Responding은 앱이 메인 스레드를 너무 오랫동안 블로킹했을 때 안드로이드 시스템이 보여주는 응답 없음 경고입니다. 메인 스레드가 시스템이 정한 타임아웃 시간 내에 입력 이벤트를 처리하지 못하거나...
Jetpack Compose에서 사이드 이펙트side effect란, 컴포저블 함수의 범위를 벗어나 리컴포지션Recomposition 이후에도 지속되는 모든 작업을 의미합니다. 컴포저블 함수는 본질적으로 입력 상태에 대한 순수 함수여야 하며, 동일한 상태가...
옵저버 패턴Observer Pattern은 하나의 객체주체, Subject와 여러 의존 객체옵저버, Observer 사이에 일대다one-to-many 관계를 설정하여, 주체의 상태가 변경되면 등록된 모든 옵저버에 자동으로 알림을 보내는 디자인 패턴입니다....
리포지토리 패턴Repository Pattern은 데이터 접근 로직을 깔끔한 API 뒤에 추상화하는 디자인 패턴입니다. 애플리케이션의 나머지 부분이 데이터를 어떻게 가져오고, 캐싱하고, 영속화하는지에 대한 세부 구현에 의존하지 않도록 분리해 줍니다....
SaveableStateHolder는 고유 식별자를 키로 사용하여 컴포저블 하위 트리의 rememberSaveable 상태를 독립적으로 보존하고 복원하는 Compose 인터페이스입니다. rememberSaveable이 구성 변경configuration...
안드로이드 Activity 생명주기는 Activity가 생성부터 소멸까지 거치는 일련의 상태 전환을 정의합니다. 시스템은 각 전환 시점에 특정 콜백callback 메서드를 호출하며, 이를 통해 앱은 리소스를 초기화하거나, 상태를 저장하고, 리소스를 해제하며,...
상태 호이스팅state hoisting은 Jetpack Compose에서 하위 컴포저블composable이 보유한 상태state를 상위 호출자로 끌어올리는 패턴입니다. 이 패턴을 적용하면 하위 컴포저블은 상태를 소유하지 않는 무상태stateless 함수가 되며,...
코틀린 코루틴과 JVM 스레드는 모두 동시성concurrency 실행을 지원하지만, 근본적으로 서로 다른 추상화 수준에서 동작합니다. 스레드는 운영 체제가 관리하는 구조로 실제 커널 리소스를 소비하는 반면, 코루틴은 컴파일러가 생성한 상태 머신state...
Fragment는 호스트 Activity의 생명주기와 밀접하게 연결되어 있으면서도 독립적인 자체 생명주기lifecycle를 갖습니다. Fragment는 생성, 뷰 생성, 가시성 확보, 인터랙티브 상태, 소멸이라는 단계를 거치며, 각 단계마다 전용 콜백이...
모든 안드로이드 View는 생성부터 소멸까지 일련의 단계를 거칩니다. View가 윈도우에 연결되고, 측정measure되고, 배치layout되고, 그려진draw 뒤 최종적으로 분리detach되는 과정에서 시스템은 각 시점에 맞는 특정 메서드를 호출합니다. 이러한...
안드로이드의 뷰 시스템은 기본 View 클래스를 상속하고, 그리기drawing, 측정measurement, 레이아웃layout 메서드를 오버라이드하여 커스텀 UI 컴포넌트를 직접 만들 수 있도록 설계되어 있습니다. 여기에 커스텀 XML 속성attribute까지...
의존성 주입Dependency Injection은 객체가 필요한 의존성을 내부에서 직접 생성하지 않고, 외부로부터 전달받는 디자인 패턴입니다. 이 패턴을 통해 객체 생성에 대한 제어권이 소비 클래스에서 의존성 그래프dependency graph를 조립하는 별도...
안드로이드의 프로세스 간 통신IPC, Inter-Process Communication은 Parcel 클래스를 저수준 전송 컨테이너로 사용하며, Parcelable 인터페이스를 통해 객체가 자기 자신을 Parcel로 직렬화하는 계약contract을 정의합니다....
Jetpack Compose는 일반적인 리컴포지션Recomposition 과정에서는 동일하게 동작하지만, 시스템이 컴포저블의 호스트를 소멸시키고 다시 생성할 때 서로 다르게 동작하는 두 가지 상태 유지 메커니즘을 제공합니다. remember는 단일 컴포지션 수명...
코틀린의 sealed class는 컴파일 타임에 모든 서브타입이 확정되는 닫힌 집합closed set을 정의하며, 컴파일러가 패턴 매칭에서 가능한 모든 케이스를 처리했는지 검증할 수 있도록 합니다. 일반적인 open class와 달리 어떤 모듈에서든 새로운...
안드로이드는 객체를 전달 가능한 형태로 변환하기 위한 두 가지 메커니즘을 제공합니다. 하나는 Java 표준 라이브러리의 Serializable 인터페이스이고, 다른 하나는 안드로이드 고유의 Parcelable 인터페이스입니다. 두 방식 모두 Intent와...
안드로이드에서 Intent란 수행할 작업을 기술하는 메시징 객체입니다. 같은 프로세스 내의 컴포넌트든, 전혀 다른 애플리케이션에 속한 컴포넌트든, Intent는 이들 사이의 통신을 담당하는 핵심 메커니즘 역할을 합니다. Intent에는 수행할 액션action과...
Jetpack Compose는 입력값이 변경된 컴포저블 함수만 리컴포지션Recomposition하지만, 이 최적화는 컴파일러가 입력값의 안정성stability을 판별할 수 있느냐에 달려 있습니다. 컴파일러가 안정성을 증명하지 못하면 해당 매개변수를...
코틀린의 data class는 주 생성자primary constructor에 선언된 프로퍼티를 기반으로 equals, hashCode, toString, copy, componentN 함수를 컴파일러가 자동으로 생성하도록 지시하는 언어 기능입니다. 컴파일러가...
Kotlin의 위임 프로퍼티delegated properties를 사용하면 프로퍼티의 getter와 setter 로직을 by 키워드를 통해 별도의 위임 객체delegate object에 맡길 수 있습니다. 컴파일러는 프로퍼티 접근을 위임 객체의 getValue와...
더 많은 면접 질문과 답변을 받아보려면 Dove Letter를 구독하세요.