안드로이드 기술 면접 책 북 스터디를 하면서
보다 간결하게 실제 면접하는 것처럼 글을 정리해보려 한다.
Q1) 안드로이드란 무엇인가요?
안드로이드는 주로 모바일 기기를 위해 설계된 오픈소스 운영 체제
리눅스 커널에 기반하여 광범위한 하드웨어 구성과 기기를 지원하는 강력하고 유연한 플랫폼을 제공
안드로이드 아키텍처
안드로이드 플랫폼 아키텍처에는 모듈식으로 계층화되어 있으며, 여러 구성 요소로 이루어져 있음

- 리눅스 커널
안드로이드 운영체제의 기반을 형성함 하드웨어 추상화를 처리하며 소프트웨어와 하드웨어 간의 원활한 상호 작용을 보장 - 하드웨어 추상화 계층(Hardware abstraction layer (HAL))
안드로이드의 Java API 프레임워크를 기기 하드웨어에 연결하는 표준 인터페이스를 제공
라이브러리 모듈로 구성되어 있음(카메라, 블루투스)
프레임워크 API가 하드웨어 접근을 요청하면, 안드로이드 시스템은 해당 HAL 모듈을 동적으로 로드하여 요청을 처리함 - 안드로이드 런타임 및 코어 라이브러리(ART, Core Libraries)
Kotlin/Java 에서 컴파일된 바이트코드를 사용하여 애플리케이션을 실행
Dalvik -> JIT : 실행되는 시점에 필요한 코드만 컴파일 (런타임에 느리게 동작할 수 있음)
ART -> AOT : 애플리케이션이 실행되는 시점에 코드를 컴파일하고 미리 캐시해서 사용하는 방식 - 네이티브 C/C++ 라이브러리 모음
안드로이드는 중요한 기능을 지원하기 위해 C 및 C++로 작성된 네이티브 라이브러리 모음을 포함
OpenGL -> 그래픽 랜더링
SQLite -> 데이터베이스
안드로이드 프레임워크와 애플리케이션에서 성능 집약적인 작업을 위해 직접 사용합니다. - 안드로이드 프레임워크 (Android Frameworks (APIs))
애플리케이션 프레임워크 계층은 앱 개발을 위한 고수준 서비스와 API를 제공함
ActivityManager, NotificationManager - 애플리케이션
Q1) 인텐트란 무엇인가요?
인텐트란 수행할 작업에 대한 추상적인 설명입니다.
Activity, Service, BroadcastReceiver가 통신할 수 있도록 하는 메시징 객체역할을 합니다.
컴포넌트 간에 데이터를 전달할 수 있어 안드로이드의 시스템에서 근본이 되는 요소
인텐트는 두 가지 유형이 있음
- 명시적 인텐트 (Explict Intent)
- 명시적 인텐트는 호출할 컴포넌트를 직접 이름으로 지정하여 정확히 명시
- 명시적 인텐트는 대상 컴포넌트를 알고 있을 때 사용됨(앱 내의 특정 Activity 시작)
- 예) 동일한 앱 내에서 한 Activity에서 다른 Activity로 전환 - 암시적 인텐트 (Implicit Intent)
- 암시적 인텐트는 특정 컴포넌트를 지정하지 않고 수행할 일반적인 작업을 선언
- 액션, 카테고리, 데이터를 기반으로 어떤 컴포넌트가 Intent를 처리할 수 있는지 결정
- 명시적 인텐트는 다른 앱이나 시스템 컴포넌트가 처리할 수 있는 작업을 수행하려 할 때 유용함(URL 열기, 콘텐츠 공유)
명시적 인텐트와 암시적 인텐트의 차이점
명시적 인텐트는 실행해야 할 컴포넌트가 정확히 정해져 있는 경우
암시적 인텐트는 현재 작업하고자 하는 내용을 처리할 수 있는 컴포넌트를 호출하기 위한 용도
(특정 텍스트를 보내거나 특정 정보를 처리할 수 있는 컴포넌트)
안드로이드 시스템은 암시적 인텐트를 처리할 앱을 어떻게 결정하고, 적합한 애플리케이션이 없다면?
- 액션, 카테고리, 데이터를 기반으로 처리함
- 적합한 애플리케이션이 없다면 ActivityNotFoundException 예외가 발생하며 예외 처리 가능
인텐트 필터란?
앱 컴포넌트가 링크를 열거나 브로드캐스트 처리와 같은 특정 Intent에
어떻게 응답할 수 있는지를 정의처리할 수 있는 인텐트 유형을 선언하는 필터 역할을 하며
AndroidManifest.xml 파일에 명시 가능각 인텐트 필터는 들어오는 Intent와 정확히 일치시키기 위해
액션, 카테고리 및 데이터 유형을 포함할 수 있음
명시적 인텐트가 전송되면 안드로이드 시스템은 Intent와 속성을
비교하여 실행할 적절한 컴포넌트를 결정
Q2) PendingIntent의 목적은 무엇인가요?
PendingIntent는 인텐트를 지연(Pending) 시킬 수 있는 권한을 부여하는
또 다른 종류의 Intent
알림이나 서버와의 상호작용 같이 앱의 수명 주기를 벗어나 트리거되어야 하는 작업에 특히 유용함
PendingIntent의 주요 특징
일반 Intent의 래퍼 역할을 하여 앱의 생명주기를 넘어서 지속될 수 있도록 함
앱과 동일한 권한으로 다른 앱이나 시스템 서비스에 Intent 실행을 위임함
여러가지 플래그를 지원함
노티피케이션, 알람, 서비스를 위해 사용됩니다.
Q3) Serializable과 Parcelable의 차이점은 무엇인가요?
- Serializable
- 객체를 바이트 스트림으로 변환하여 컴포넌트 간 데이터 전달에 사용하는 표준 자바 인터페이스
- 리플렉션 기반, 런타임에 클래스와 필드를 동적으로 검사하여 객체를 직렬화
- 리플렉션은 느린 프로세스이기 때문에 Parcelable보다 느림, 임시객체 생성으로 메모리 오버헤드를 증가시킴
- 성능이 중요하지 않거나 안드로이드 특정 코드가 아닌 코드베이스를 다룰 때 유용함 - Parcelable
- Parcelable은 안드로이드 컴포넌트 내에서 고성능 프로세스 간 통신을 위해 설계된 안드로이드 특정 인터페이스
- 안드로이드에 최적화되어 있고 리플렉션을 사용하지 않으므로 빠르다
- 성능이 중요한 안드로이드 데이터 전달, IPC나 Activity 또는 Service 간 데이터 전달에 선호됨
Parcelable는 직렬화 역직렬화 로직을 구현해서 사용해야 하므로
보일러 플레이트 코드가 늘어나지만 성능은 빠르고 GC 부담이 줄어듦
최신 안드로이드 개발에서는 kotlin-parcelize plugin이 구현을 자동으로 생성하여
객체를 만드는 과정이 단순함
Q4) Context란 무엇이며 어떤 종류의 Context가 있나요?
Context란 애플리케이션의 환경 또는 상태를 나타내며
애플리케이션별 리소스 및 클래스에 대한 접근을 제공한다.
앱과 안드로이드 시스템 간의 브릿지 역할을 함
예) Activity 실행, 에셋 접근, 레이아웃 인플레이션
Application Context
애플리케이션의 라이프 사이클과 연결되어 있다.
기존의 컴포넌트보다 전역적이고 오래 지속되는 Context가 필요할 때 사용됨
예)
- sharedPreference, 데이터베이스와 같은 애플리케이션 전체 리소스가 접근하는 경우
- 앱 생명주기 동안 유지되는 라이브러리나 컴포넌트를 초기화하는 경우
Activity Context
Activity의 생명주기와 연결되어 있습니다.
Activity에 특별한 리소스 접근, 다른 Activity 시작, 레이아웃 인플레이션에 사용됨
Service Context
Service의 생명주기와 연결되어 있습니다.
네트워크 작업 수행이나 음악 재생과 같은 백그라운드에서 실행되는 작업에 사용됩니다.
Broadcast Context
BroadcastReceiver가 호출될 때 제공됩니다.
수명이 짧으며 일반적으로 특정 브로드캐스트에 응답하는 데 사용됩니다.
Context의 일반적인 사용 사례
- 리소스 접근
- 레이아웃 인플레이션
- 액티비티 및 서비스 시작
- 시스템 접근 시작
- 데이터베이스 및 SharedPreference 접근
왜 올바른 Context를 사용하는 게 중요한가
Context의 종류에 따라 수명과 역할이 다르기 때문에
잘못된 Context를 사용하면 메모리 누수, 예기치 못한 동작, 앱 크래시 등 다양한 문제가 발생할 수 있습니다.
Application Context : 앱 전체의 라이프사이클에 연결되어 있음
-> UI 관련 작업에는 부적합
Activity Context : 해당 Activity가 살아있는 동안만 유효
-> UI 작업, Activity 관련 리소스 접근에 적합
AAC ViewModel은 Activity보다 생명주기가 길기 때문에
Activity의 Context를 AAC ViewModel에 저장한다면
Activity가 종료되더라도 메모리가 회수되지 않음(메모리 누수 발생)
Q5) Application 클래스란 무엇인가요?
전역 애플리케이션 상태와 생명 주기를 유지하기 위한 역할을 합니다.
다른 컴포넌트보다 가장 먼저 초기화되는 앱의 프로세스 진입점 역할을 합니다.
앱의 전체 생명주기에 사용 가능한 Context를 제공하므로 앱 전역에 걸쳐 공유되는 리소스 및 인스턴스를 초기화하는 데 이상적입니다.
Application 클래스의 주요 메서드
- onCreate()
앱의 프로세스가 생성될 때 호출됩니다.
일반적으로 데이터베이스 인스턴스, 네트워크 라이브러리, Firebase 애널리틱스와 같은 것들을 초기화 하는 곳
애플리케이션 생명주기 동안 단 한번만 호출됩니다. - onTerminate()
애플리케이션이 종료될 때 호출됩니다.
안드로이드가 호출을 보장하지 않으므로 실제 기기의 프로덕션 환경에서는 호출되지 않습니다. - onLowMemory(), onTrimMemory()
시스템이 메모리 부족 상태를 감지할 때 트리거됩니다.
Application 클래스의 사용 사례
- 전역 리소스 관리
DB, SharedPreference 또는 네트워크 를라이언트 같은 리소스를 초기화, 전역에 걸쳐서 재사용 가능 - 컴포넌트 초기화
Firebase Analytics, Timber 등과 같은 도구는 앱 생명주기 전역에서 사용되는 경우가 다분하므로 적절하게 초기에 초기화 - 의존성 주입
Dagger 또는 Hilt와 같은 프레임워크를 초기화하여 앱 전체에 의존성을 제공할 수 있습니다.
Q6) AndroidManifest 파일의 목적은 무엇인가요?
안드로이드 운영 체제에 애플리케이션에 대한 필수 정보를 정의하는 중요한 구성 파일입니다.
애플리케이션과 OS 간의 브릿지 역할을 하며, 컴포넌트, 권한, 하드웨어 및 소프트웨어 기능 들을 정의하고 있습니다.
AndroidManifest.xml의 주요 기능
- 애플리케이션 컴포넌트 선언
필수 컴포넌트를 등록하여 안드로이드 시스템이 이를 시작하거나 상호 작용하는 방법을 알 수 있도록 합니다. - 권한
INTERNET, ACCESS_FINE_LOCATION과 같은 권한을 선언하여 사용자가
앱이 접근할 리소스를 알고 이러한 권한을 부여하거나 거부할 수 있도록 합니다. - 하드웨어 및 소프트웨어 요구 사항
카메라, GPS 또는 특정 화면 크기와 같이 앱이 의존하는 기능을 명시하여
요구 사항을 충족하지 않는 기기를 필터링합니다. - 앱 메타 정보
앱의 패키지 이름, 버전, 최소 및 대상 API 레벨, 테마, 스타일 같은 필수 정보를 제공합니다. - 인텐트 필터
컴포넌트에 대한 인텐트 필터를 정의합니다. - 앱 구성 및 세팅
메인 런처 Activity 정의, 백업 동작 구성, 테마 지정과 같은 구성을 포함합니다.
액티비티 클래스가 AndroidManifest에 등록되어 있지 않으면 어떻게 되나요?
외부에서 특정 인텐트가 발생하면 안드로이드 시스템은 모든 앱의 AndroidManifest.xml을 확인하여
해당 인텐트에 반응할 수 있는 컴포넌트를 찾습니다.
액티비티 클래스를 AndroidManifest.xml에 등록하지 않는다면
앱이 빌드/실행은 되지만 런타임에서 해당 액티비티를 실행하려 할때 앱이 강제 종료됩니다.
Q7) Activity 생명주기를 설명해주세요
Activity 생명주기는 Activity가 생성되고 소멸까지 거치는 다양한 상태를 나타냅니다.

- onCreate()
Activity가 생성될 때 호출되는 메서드
Activity를 초기화하고, UI 컴포넌트를 설정하며, 저장된 인스턴스 상태를 복원하는 곳
Activity가 소멸되고 재생성되지 않는 한 Activity의 생명주기 동안 단 한 번만 호출됩니다. - onStart()
Activity가 사용자에게 보이지만 아직 상호 작용할 수는 없습니다.
onCreate() 이후와 onResume() 이전에 호출됩니다. - onRestart()
Activity가 중지되었다가 다시 시작되는 경우 이 메서드가 onStart() 전에 호출됩니다. - onResume()
Activity가 포그라운드에 있으며 사용자가 상호작용 할 수 있습니다.
일시 정지된 UI 업데이트, 애니메이션 도는 입력 리스너를 재개하는 곳입니다. - onPause()
다른 Activity에 의해 Activity가 부분적으로 가려잘 때 호출됩니다.
Activity는 여전히 보이지만 포커스 중인 상태는 아니빈다. (애니메이션, 센서 업데이트, 데이터 저장 일시중지) - onStop()
Activity가 더 이상 사용자에게 보이지 않을 때 호출됩니다.
Activity가 중단된 동안 필요하지 않은 리소스를 해제해야 합니다. - onDestroy()
Activity가 완전히 소멸되고 메모리에서 제거되기 전에 호출됩니다.
남아있는 모든 리소스를 해제하기 위한 최종 메서드 입니다.
onPause()와 onStop()의 차이점은?
- onPause()
- Activity가 부분적으로 가려질 때 호출됨
- 빠르게 복구해야 하는 작업, UI 관련 리소스 해제, 임시 저장
- 예) 동영상 일시정지, 재생 위치 임시 저장 - onStop()
- Activity가 완전히 가려질 때 호출됨
- 무거운 리소스 해제, 장시간 점유하면 안되는 작업을 처리해야 함
- 동영상 디코더 해제, 네트워크 스트림 연결 해제
Q8) Fragment의 생명 주기를 설명해주세요
Fragment는 Activity와 다르게 자체적인 생명주기를 가집니다.
추가되거나, 제거되거나, 화면 안팎으로 이동될 떄와 같이 다양한 생명 주기를 가집니다.

- onAttach() : Fragment가 부모 Activity에 연결될 때 호출되는 첫 번째 콜백입니다.
- onCreate() : Fragment를 초기화하기 위해 호출됩니다. fragment는 생성되었지만 UI는 아직 생성되지 않았습니다.
- onCreateView() : Fragment의 UI가 처음으로 그려질 때 호출됩니다. 이 메서드에서 레이아웃의 루트 뷰를 반환합니다.
- onViewStateRestored() : Fragment의 뷰 계층이 생성되고 저장된 상태가 뷰에 복원된 후 호출됩니다.
- onViewCreated() : 이 메서드는 Fragment의 뷰가 생성된 후 호출됩니다.
- onStart() : Fragment가 사용자에게 보이게 됩니다.
- onResume() : 완전히 활성 상태이며 포그라운드에서 실행 중이므로 사용자와 상호 작용이 가능합니다.
- onPause() : Fragment가 더 이상 포그라운드에 있지 않지만 여전히 화면에 보이는 경우 호출됩니다.
- onStop() : 더 이상 보이지 않습니다.
- onSaveInstanceState() : Fragment가 소멸되기 전에 UI 관련 상태 데이터를 저장합니다.
- onDestroyView() : Fragment의 뷰 계층이 제거될 때 호출됩니다.
- onDestroy() : Fragment 자체가 소멸될 때 호출됩니다. 여전히 부모 Activity에 연결되어 있습니다.
- onDetach() : Fragment가 부모 Activity에서 분리되어 더 이상 연결되지 않습니다.
onCreateView()와 onDestoryView()의 목적은 무엇이며 왜 해당 메서드를 올바르게 처리해야 하는가
- onCreateView() : Fragment의 UI를 생성하는 메서드
- onDestroyView() : Fragment의 뷰가 소멸될 때 뷰 관련 리소스를 해제하는 메서드
뷰 관련 리소스를 올바르게 해제하지 못하면 메모리 누수 발생
fragmentManager와 childFragmentManager의 차이점은?
- fragmentManager
- fragmentActivity 또는 fragment와 연결되어 있으며
Activity 수준에서 Framgent를 관리하는 역할을 함
- 부모 Activity에 직접 연결된 Fragment를 추가하거나 교체 또는 제거하는 동작이 포함됨
- 여기서 관리하는 fragment는 구조적으로 형제 관계이며 동일한 계층 수준에서 작동합니다. - childFragmentManager
- 하나의 Fragment에 속하며 해당 Fragment의 자식 Fragment를 관리합니다.
- 부모 Fragment의 생명주기 내에서 Fragment를 정의합니다.
- 생명주기가 부모 Fragment에 연결됩니다. 가령, 부모 Fragment가 소멸되면 자식 Fragment도 소멸됩니다
viewLifecycleOwner 인스턴스의 역할은?
viewLifecycleOwner는 Fragment의 뷰 계층과 관련된 LifecycleOwner
Fragment의 생명주기가 아닌 Fragment 뷰 계층 생명주기에 바인딩하여 잠재적인 메모리 누수와 같은 문제를 방지할 수 있음
- lifecycleOwner (Fragment의 생명주기) : Fragment의 전체 생명주기를 나타내며 상대적으로 생명주기가 더 길고
호스팅 Activiy에 연결됩니다. - viewLifecycleOwner (Fragment 뷰의 생명주기) : Fragment 뷰의 생명주기를 나타내며
onCreateView에서 시작하며 onDestroyView에서 종료됩니다.
Q9) Service란 무엇인가요?
사용자 인터페이스 없이 백그라운드에서 장기 작업(음악 재생, 파일 다운로드 등)을 수행하는 컴포넌트
- Started Service
- startService()로 시작, 명시적으로 중지될 때까지 실행
- 예: 음악 재생, 파일 다운로드 - Bound Service
- bindService()로 시작, 클라이언트가 바인딩되어 있는 동안만 실행
- 예: 데이터 제공, 백그라운드 연결 관리 - Foreground Service
- 알림(Notification)과 함께 실행, 사용자가 인지해야 하는 작업에 사용
- 예: 네비게이션, 실시간 위치 추적
생명주기
- Started : onCreate -> onStartCommand -> onDestory
- Bound : onCreate -> onBind/onUnbind -> onDestory