[Android] 안드로이드 개발자 기술 면접 질문 정리

안드로이드 개발자 기술 면접 질문을 정리했습니다.
Apr 18, 2024
[Android] 안드로이드 개발자 기술 면접 질문 정리
안드로이드 주요 기술 주제안드로이드의 4대 컴포넌트는 무엇이며, 각각의 역할을 간단히 설명해주세요.액티비티(Activity)서비스(Service)브로드캐스트 리시버(Broadcast Receiver)콘텐트 프로바이더(Content Provider)안드로이드 액티비티의 생명주기에 대해 설명해주세요. 주요 콜백 메서드호출 시점안드로이드 프래그먼트의 생명주기에 대해 설명해주세요. 주요 콜백 메서드호출 시점안드로이드 개발에서 주로 사용되는 아키텍처 패턴들(MVC, MVP, MVVM, MVI)에 대해 설명하고, 각각의 장단점을 비교해주세요.MVC (Model-View-Controller)MVP (Model-View-Presenter)MVVM (Model-View-ViewModel)MVI (Model-View-Intent)코틀린의 주요 특징과 자바와 비교했을 때의 장점에 대해 설명해주세요.안드로이드에서 비동기 프로그래밍을 위한 코루틴과 RxJava의 특징과 차이점에 대해 설명해주세요.코루틴 (Coroutines)RxJava차이점안드로이드에서 데이터를 저장하는 주요 방식들을 설명하고, 각각의 장단점을 비교해주세요.안드로이드에서 주로 사용되는 네트워크 통신 라이브러리인 Retrofit과 OkHttp에 대해 설명하고, 이들의 주요 특징과 사용 방법을 설명해주세요.RetrofitOkHttp안드로이드 개발에서 의존성 주입(Dependency Injection)이란 무엇이며, Dagger Hilt를 사용한 의존성 주입의 장점에 대해 설명해주세요.Dagger Hilt를 사용한 의존성 주입의 장점Dagger와 Hilt의 주요 차이점
 

안드로이드 주요 기술 주제

  1. 안드로이드 4대 컴포넌트 (Activity, Service, Broadcast Receiver, Content Provider)
  1. 액티비티 생명주기
  1. 프래그먼트 생명주기 및 통신 방법
  1. 안드로이드 아키텍처 패턴 (MVC, MVP, MVVM, MVI)
  1. 코틀린 특징 및 장점
  1. 비동기 프로그래밍 (코루틴, RxJava)
  1. 데이터 저장 방식 (SharedPreferences, Room 등)
  1. 네트워크 통신 (Retrofit, OkHttp)
  1. 의존성 주입 (Dagger, Hilt)
 
 

안드로이드의 4대 컴포넌트는 무엇이며, 각각의 역할을 간단히 설명해주세요.

각 컴포넌트는 독립적으로 존재하며, 고유한 기능을 수행합니다. 이들은 인텐트(Intent)를 통해 서로 상호작용하여 앱의 전체적인 기능을 구현합니다.

액티비티(Activity)

  • 사용자 인터페이스를 담당하는 화면 컴포넌트입니다. 사용자와 상호작용하는 단일 화면을 나타냅니다.

서비스(Service)

  • 백그라운드에서 실행되는 컴포넌트로, 오래 걸리는 작업이나 원격 프로세스를 처리합니다.

브로드캐스트 리시버(Broadcast Receiver)

  • 안드로이드 시스템으로부터 발생하는 이벤트와 정보를 수신하고 처리하는 컴포넌트입니다.

콘텐트 프로바이더(Content Provider)

  • 애플리케이션 간 데이터 공유를 관리하는 컴포넌트로, 주로 대용량 데이터 공유에 사용됩니다.
 
 
 

안드로이드 액티비티의 생명주기에 대해 설명해주세요.

주요 콜백 메서드

onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart()onDestroy()
 

호출 시점

  1. onCreate() : 액티비티가 처음 생성될 때 호출됩니다. 여기서 레이아웃을 정의하고 초기화 작업을 수행합니다.
  1. onStart() : 액티비티가 사용자에게 보이기 직전에 호출됩니다.
  1. onResume() : 액티비티가 사용자와 상호작용을 시작할 때 호출됩니다. 이 상태에서 액티비티는 포그라운드에 있습니다.
  1. onPause() : 다른 액티비티가 포그라운드로 올라올 때 호출됩니다. 여기서 변경사항을 저장하고 리소스를 해제합니다.
  1. onStop() : 액티비티가 더 이상 사용자에게 보이지 않을 때 호출됩니다.
  1. onRestart() : 중지된 액티비티가 다시 시작되기 전에 호출됩니다.
  1. onDestroy() : 액티비티가 완전히 종료되기 전에 호출됩니다. 모든 리소스를 해제해야 합니다.
 
 

안드로이드 프래그먼트의 생명주기에 대해 설명해주세요.

주요 콜백 메서드

onAttach(Context context), onCreate(Bundle savedInstanceState), onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState), onActivityCreated(Bundle savedInstanceState), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDestroy(), onDetach()

호출 시점

  1. onAttach(Context context) : 프래그먼트가 액티비티에 연결될 때 호출됩니다. 이 메서드에서 액티비티와의 상호작용을 설정할 수 있습니다.
  1. onCreate(Bundle savedInstanceState) : 프래그먼트가 생성될 때 호출됩니다. 여기서 초기화 작업을 수행하고, 필요한 경우 인스턴스 상태를 복원합니다.
  1. onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) : 프래그먼트의 UI를 생성할 때 호출됩니다. 레이아웃을 인플레이트하여 반환합니다.
  1. onActivityCreated(Bundle savedInstanceState) : 액티비티의 onCreate()가 완료된 후 호출됩니다. UI 초기화 이후 추가적인 작업을 수행할 수 있습니다.
  1. onStart() : 프래그먼트가 사용자에게 보이기 직전에 호출됩니다.
  1. onResume() : 프래그먼트가 사용자와 상호작용을 시작할 때 호출됩니다.
  1. onPause() : 다른 프래그먼트나 액티비티가 포그라운드로 올라올 때 호출됩니다. 리소스를 해제하거나 데이터를 저장하는 작업을 수행합니다.
  1. onStop() : 프래그먼트가 더 이상 사용자에게 보이지 않을 때 호출됩니다.
  1. onDestroyView() : 프래그먼트의 UI가 제거될 때 호출됩니다. UI 관련 리소스를 해제하는 데 사용됩니다.
  1. onDestroy() : 프래그먼트가 완전히 종료되기 전에 호출됩니다. 모든 리소스를 해제해야 합니다.
  1. onDetach() : 프래그먼트가 액티비티와 연결이 끊어질 때 호출됩니다.
 
 
 

안드로이드 개발에서 주로 사용되는 아키텍처 패턴들(MVC, MVP, MVVM, MVI)에 대해 설명하고, 각각의 장단점을 비교해주세요.

MVC (Model-View-Controller)

장점: 구조가 단순하고 이해하기 쉽습니다.
단점: View와 Controller의 결합도가 높아 유지보수가 어려울 수 있습니다.
  • Model: 데이터와 비즈니스 로직을 관리
  • View: 사용자 인터페이스를 표현
  • Controller: Model과 View 사이의 상호작용을 조정

MVP (Model-View-Presenter)

장점: View와 Model의 분리로 테스트가 용이합니다.
단점: Presenter가 복잡해질 수 있습니다.
  • Model: 데이터와 비즈니스 로직을 관리
  • View: 사용자 인터페이스를 표현
  • Presenter: View와 Model 사이의 중재자 역할

MVVM (Model-View-ViewModel)

장점: 데이터 바인딩을 통해 View와 ViewModel의 결합도를 낮출 수 있습니다.
단점: 복잡한 앱에서는 ViewModel이 비대해질 수 있습니다.
  • Model: 데이터와 비즈니스 로직을 관리
  • View: 사용자 인터페이스를 표현
  • ViewModel: View에 필요한 데이터를 준비하고 상태를 관리

MVI (Model-View-Intent)

장점: 단방향 데이터 흐름으로 예측 가능성이 높습니다.
단점: 상태 관리가 복잡해질 수 있고, 러닝 커브가 높습니다.
  • Model: 앱의 상태를 나타냄
  • View: 사용자 인터페이스를 표현
  • Intent: 사용자 행동이나 시스템 이벤트를 나타냄
 
 

코틀린의 주요 특징과 자바와 비교했을 때의 장점에 대해 설명해주세요.

  1. Null 안정성: 코틀린은 nullable 타입과 non-nullable 타입을 구분하여 NullPointerException을 컴파일 시점에 방지할 수 있습니다.
  1. 간결성: 자바에 비해 더 간결한 문법을 제공합니다. 예를 들어, 세미콜론을 생략할 수 있고, getter/setter를 자동으로 생성합니다.
  1. 확장 함수: 기존 클래스에 새로운 함수를 추가할 수 있어 코드의 재사용성과 가독성이 향상됩니다.
  1. 데이터 클래스: 모델 클래스 작성 시 equals(), hashCode(), toString() 등을 자동으로 생성해줍니다.
  1. 함수형 프로그래밍 지원: 람다 표현식, 고차 함수 등을 지원하여 함수형 프로그래밍을 쉽게 구현할 수 있습니다.
  1. 코루틴 지원: 비동기 프로그래밍을 위한 코루틴을 언어 차원에서 지원합니다.
  1. 스마트 캐스트: 타입 검사와 캐스트를 자동으로 수행하여 코드를 간결하게 만듭니다.
  1. 상호운용성: 자바와 100% 호환되어 기존 자바 프로젝트에 점진적으로 도입할 수 있습니다.
  1. 안전한 형 변환: 'as?' 연산자를 통해 안전한 형 변환을 지원합니다.
  1. 속성 위임: 속성의 getter와 setter 로직을 다른 클래스에 위임할 수 있습니다.
 
 
 

안드로이드에서 비동기 프로그래밍을 위한 코루틴과 RxJava의 특징과 차이점에 대해 설명해주세요.

코루틴 (Coroutines)

  1. 경량 스레드: 시스템 리소스를 적게 사용하며 많은 수의 동시 작업을 효율적으로 처리합니다.
  1. 구조화된 동시성: 코루틴 스코프를 통해 작업의 생명주기를 쉽게 관리할 수 있습니다.
  1. 순차적 코드 작성: 비동기 코드를 동기 코드처럼 작성할 수 있어 가독성이 향상됩니다.
  1. 취소 및 예외 처리: 작업의 취소와 예외 처리가 용이합니다.
  1. 안드로이드 생명주기와의 통합: LifecycleScope, ViewModelScope 등을 통해 안드로이드 컴포넌트의 생명주기와 쉽게 연동됩니다.

RxJava

  1. 반응형 프로그래밍: 데이터 스트림과 변화의 전파를 중심으로 한 프로그래밍 패러다임을 제공합니다.
  1. 풍부한 연산자: map, filter, combine 등 다양한 연산자를 제공하여 복잡한 데이터 처리를 간단히 할 수 있습니다.
  1. 스케줄러: 다양한 스케줄러를 통해 작업의 실행 컨텍스트를 쉽게 전환할 수 있습니다.
  1. 에러 처리: 스트림 내에서 에러를 쉽게 처리하고 전파할 수 있습니다.
  1. 백프레셔 지원: 데이터 생산과 소비 속도의 불일치 문제를 해결할 수 있습니다.

차이점

  1. 학습 곡선: 코루틴이 RxJava에 비해 학습이 쉽고 직관적입니다.
  1. 메모리 사용: 코루틴이 RxJava보다 일반적으로 메모리를 적게 사용합니다.
  1. 유연성: RxJava는 더 다양한 연산자와 기능을 제공하여 복잡한 비동기 작업에 더 유연합니다.
  1. 언어 지원: 코루틴은 코틀린 언어 자체에서 지원하는 반면, RxJava는 라이브러리 형태로 제공됩니다.
  1. 취소 메커니즘: 코루틴은 구조화된 동시성을 통해 더 쉽게 작업을 취소할 수 있습니다.
 
 
 

안드로이드에서 데이터를 저장하는 주요 방식들을 설명하고, 각각의 장단점을 비교해주세요.

  1. SharedPreferences
      • 키-값 쌍으로 간단한 데이터를 저장합니다.
      • 주로 사용자 설정이나 상태 데이터를 저장하는 데 사용됩니다.
      • 장점: 간단하고 빠르며 소량의 데이터에 적합합니다.
      • 단점: 구조화된 데이터나 대량의 데이터를 저장하기 어렵습니다.
  1. Internal Storage
      • 앱 전용 파일을 내부 저장소에 저장합니다.
      • 외부 접근이 불가능하여 보안성이 높습니다.
      • 장점: 보안성이 뛰어나고 간단한 파일 입출력에 적합합니다.
      • 단점: 저장 공간이 제한적이며, 다른 앱과 데이터 공유가 어렵습니다.
  1. External Storage
      • 외부 저장소(SD 카드 등)에 데이터를 저장합니다.
      • 사진, 동영상 등 대용량 데이터를 저장할 때 사용됩니다.
      • 장점: 대용량 데이터 저장 가능, 다른 앱과 데이터 공유 가능.
      • 단점: 보안성이 낮고 사용자가 외부 스토리지를 제거하면 데이터가 손실될 수 있습니다.
  1. SQLite Database
      • SQL을 사용하여 구조화된 데이터를 로컬 데이터베이스에 저장합니다.
      • 장점: 복잡한 데이터 구조를 관리할 수 있으며, 쿼리를 통해 효율적으로 데이터를 검색할 수 있습니다.
      • 단점: 설정 및 관리가 복잡하며, 쿼리 작성이 필요합니다.
  1. Room Persistence Library
      • SQLite 위에 추상화를 제공하는 라이브러리입니다.
      • 장점: SQLite보다 사용이 간편하며, 컴파일 타임에 쿼리를 검증하여 안정성을 높입니다. LiveData와 ViewModel과 같은 아키텍처 컴포넌트와 쉽게 통합됩니다.
      • 단점: 초기 설정이 필요하며, 학습 곡선이 있을 수 있습니다.
  1. Content Provider
      • 앱 간 데이터 공유를 위해 사용됩니다.
      • 장점: 표준화된 API를 통해 다른 앱과 안전하게 데이터를 공유할 수 있습니다.
      • 단점: 설정이 복잡하며, 보안 설정을 신경 써야 합니다.
  1. DataStore
      • SharedPreferences의 대체 기술로, 프로토콜 버퍼 또는 키-값 쌍으로 데이터를 저장합니다.
      • 장점: 비동기 작업 지원, 타입 안정성 제공, 데이터 손실 방지 기능 강화.
      • 단점: 기존 SharedPreferences보다 초기 설정이 복잡할 수 있습니다.
 
 

안드로이드에서 주로 사용되는 네트워크 통신 라이브러리인 Retrofit과 OkHttp에 대해 설명하고, 이들의 주요 특징과 사용 방법을 설명해주세요.

Retrofit

Retrofit은 REST API 통신을 위한 고수준 라이브러리로, OkHttp를 기반으로 구축되었습니다.
 
주요 특징
  1. 인터페이스를 통한 API 정의: HTTP API를 Java 인터페이스로 정의할 수 있습니다.
  1. 어노테이션 기반 요청 설정: @GET, @POST 등의 어노테이션으로 HTTP 메소드를 지정합니다.
  1. 자동 JSON 변환: Gson, Moshi 등의 컨버터를 사용하여 JSON 응답을 자동으로 객체로 변환합니다.
  1. 동기/비동기 요청 지원: Call 객체를 통해 동기 또는 비동기 요청을 할 수 있습니다.
  1. 요청/응답 인터셉터: 요청이나 응답을 가로채어 수정할 수 있습니다.
interface ApiService { @GET("users/{user}") fun getUser(@Path("user") user: String): Call<User> } val retrofit = Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build() val service = retrofit.create(ApiService::class.java) val call = service.getUser("username") call.enqueue(object : Callback<User> { override fun onResponse(call: Call<User>, response: Response<User>) { // 성공 처리 } override fun onFailure(call: Call<User>, t: Throwable) { // 실패 처리 } })
 

OkHttp

OkHttp는 효율적인 HTTP 클라이언트 라이브러리입니다.
 
주요 특징:
  1. 연결 풀링: 동일한 주소로의 요청을 위해 연결을 재사용합니다.
  1. GZIP 압축: 응답 크기를 줄이기 위해 자동으로 요청을 압축합니다.
  1. 응답 캐싱: 반복되는 요청의 네트워크 사용을 줄입니다.
  1. 실패 시 자동 재시도: 연결 문제 발생 시 자동으로 다른 주소로 재시도합니다.
  1. 인터셉터: 요청과 응답을 모니터링, 재작성, 재시도할 수 있습니다.
val client = OkHttpClient() val request = Request.Builder() .url("https://api.example.com/users") .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 실패 처리 } override fun onResponse(call: Call, response: Response) { // 성공 처리 } })
 
 

안드로이드 개발에서 의존성 주입(Dependency Injection)이란 무엇이며, Dagger Hilt를 사용한 의존성 주입의 장점에 대해 설명해주세요.

의존성 주입(Dependency Injection)은 객체 간의 의존 관계를 외부에서 주입하는 디자인 패턴입니다.
 

Dagger Hilt를 사용한 의존성 주입의 장점

  1. 보일러플레이트 코드 감소: Hilt는 의존성 주입을 위한 반복적인 코드를 크게 줄여줍니다.
  1. 안드로이드 생명주기 관리: Hilt는 안드로이드 컴포넌트의 생명주기를 고려한 의존성 주입을 자동으로 처리합니다.
  1. 컴파일 타임 검증: Hilt는 컴파일 시점에 의존성 그래프를 검증하여 런타임 오류를 방지합니다.
  1. 테스트 용이성: Hilt를 사용하면 의존성을 쉽게 교체할 수 있어 단위 테스트가 용이해집니다.
  1. 안드로이드 프레임워크 통합: Hilt는 안드로이드의 주요 컴포넌트(Activity, Fragment, ViewModel 등)와 원활하게 통합됩니다.
  1. 확장성: Dagger를 기반으로 하여 복잡한 의존성 그래프도 효율적으로 관리할 수 있습니다.
 

Dagger와 Hilt의 주요 차이점

  1. 복잡성: Hilt는 Dagger를 기반으로 하지만, 설정과 구성 과정을 단순화했습니다. Dagger에 비해 사용하기 쉽고 유지보수가 용이합니다.
  1. 보일러플레이트 코드: Hilt는 Dagger에 비해 보일러플레이트 코드를 크게 줄여줍니다.
  1. 안드로이드 통합: Hilt는 안드로이드 컴포넌트(Activity, Fragment, ViewModel 등)에 대한 의존성 주입을 더 쉽게 만들어줍니다.
    1. Dagger는 안드로이드 통합이 가능합니다. 그러나 Hilt와 비교했을 때, Dagger는 안드로이드 통합을 위해 더 많은 설정과 보일러플레이트 코드가 필요합니다.
  1. 학습 곡선: Hilt는 Dagger에 비해 학습 곡선이 낮아 초보자가 접근하기 더 쉽습니다.
 
Share article

code-with-me