![[Android] 안드로이드 개발자 기술 면접 질문 정리](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BAndroid%255D%2520%25EC%2595%2588%25EB%2593%259C%25EB%25A1%259C%25EC%259D%25B4%25EB%2593%259C%2520%25EA%25B0%259C%25EB%25B0%259C%25EC%259E%2590%2520%25EA%25B8%25B0%25EC%2588%25A0%2520%25EB%25A9%25B4%25EC%25A0%2591%2520%25EC%25A7%2588%25EB%25AC%25B8%2520%25EC%25A0%2595%25EB%25A6%25AC%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Dcode-with-me&w=2048&q=75)
Android 핵심 질문1. 안드로이드 4대 Component와 각각의 역할에 대해서 설명해주세요.2. 안드로이드 액티비티의 생명주기에 대해 설명해주세요. 3. 안드로이드 프래그먼트의 생명주기에 대해 설명해주세요. 4. 안드로이드 개발에서 주로 사용되는 아키텍처 패턴에 대해 설명하고, 각각의 장단점을 비교해주세요.5. 안드로이드에서 비동기 프로그래밍을 위한 코루틴의 특징에 대해 설명해주세요.6. 안드로이드에서 데이터를 저장하는 주요 방식들을 설명하고, 각각의 장단점을 비교해주세요.7. 안드로이드에서 주로 사용되는 네트워크 통신 라이브러리인 Retrofit과 OkHttp에 대해 설명하고, 이들의 주요 특징과 사용 방법을 설명해주세요.8. Hilt 관련 질문9. Kotlin Special Classes(data class, sealed class, object, interface) 관련 질문10. XML, Jetpack Compose의 차이점과 장단점에 대해서 말씀해주세요.11. Jetpack Compose에서 성능을 강화하는 방법에 대해서 말씀해주세요.12. 동기 프로그래밍과 비동기 프로그래밍이 무엇인지 설명해주세요13. 안드로이드 아키텍처와 클린 아키텍처에 대해서 설명해주세요기본 프로그래밍 개념객체지향 프로그래밍에 대해서 설명해주세요.객체지향의 주요 개념 5가지에 대해서 설명해주세요
Android 핵심 질문
1. 안드로이드 4대 Component와 각각의 역할에 대해서 설명해주세요.
4대 컴포넌트에는 액티비티(Activity), 서비스(Service), 브로드캐스트 리시버(Broadcast Receiver), 콘텐트 프로바이더(Content Provider)가 있습니다.
각 컴포넌트는 독립적으로 존재하며, 고유한 기능을 수행합니다. 이들은 인텐트(Intent)를 통해 서로 상호작용하여 앱의 전체적인 기능을 구현합니다.
- 액티비티(Activity)는 사용자 인터페이스를 담당하는 화면 컴포넌트입니다. 사용자와 상호작용하는 단일 화면을 나타냅니다.
- 서비스(Service)는 백그라운드에서 실행되는 컴포넌트로, 오래 걸리는 작업이나 원격 프로세스를 처리합니다.
- 브로드캐스트 리시버(Broadcast Receiver)는 안드로이드 시스템으로부터 발생하는 이벤트와 정보를 수신하고 처리하는 컴포넌트입니다.
- 콘텐트 프로바이더(Content Provider)는 애플리케이션 간 데이터 공유를 관리하는 컴포넌트로, 주로 대용량 데이터 공유에 사용됩니다.
2. 안드로이드 액티비티의 생명주기에 대해 설명해주세요.
안드로이드 액티비티의 생명주기에는
onCreate()
, onStart()
, onResume()
, onPause()
, onStop()
, onRestart()
,onDestroy()
7개의 콜백 메서드가 있습니다.각 콜백 메서드의 호출 시점은 다음과 같습니다.
onCreate()
는 액티비티가 처음 생성될 때 호출됩니다. 여기서 레이아웃을 정의하고 초기화 작업을 수행합니다.
onStart()
는 액티비티가 사용자에게 보이기 직전에 호출됩니다.
onResume()
는 액티비티가 사용자와 상호작용을 시작할 때 호출됩니다. 이 상태에서 액티비티는 포그라운드에 있습니다.
onPause()
는 다른 액티비티가 포그라운드로 올라올 때 호출됩니다. 여기서 변경사항을 저장하고 리소스를 해제합니다.
onStop()
는 액티비티가 더 이상 사용자에게 보이지 않을 때 호출됩니다.
onRestart()
는 중지된 액티비티가 다시 시작되기 전에 호출됩니다.
onDestroy()
는 액티비티가 완전히 종료되기 전에 호출됩니다. 모든 리소스를 해제해야 합니다.
3. 안드로이드 프래그먼트의 생명주기에 대해 설명해주세요.
안드로이드 프래그먼트의 주요 콜백 메서드에는
onAttach
(Context context)
, onCreate
(Bundle savedInstanceState)
, onCreateView
(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
, onActivityCreated
(Bundle savedInstanceState)
, onStart
()
, onResume
()
, onPause
()
, onStop
()
, onDestroyView
()
, onDestroy
()
, onDetach
()
11개의 콜백 메서드가 있습니다.주요 콜백 메서드의 호출 시점은 다음과 같습니다.
onAttach(Context context)
는 프래그먼트가 액티비티에 연결될 때 호출됩니다. 이 메서드에서 액티비티와의 상호작용을 설정할 수 있습니다.
onCreate(Bundle savedInstanceState)
: 프래그먼트가 생성될 때 호출됩니다. 여기서 초기화 작업을 수행하고, 필요한 경우 인스턴스 상태를 복원합니다.
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
: 프래그먼트의 UI를 생성할 때 호출됩니다. 레이아웃을 인플레이트하여 반환합니다.
onActivityCreated(Bundle savedInstanceState)
는 액티비티의 onCreate()가 완료된 후 호출됩니다. UI 초기화 이후 추가적인 작업을 수행할 수 있습니다.
onStart()
는 프래그먼트가 사용자에게 보이기 직전에 호출됩니다.
onResume()
는 프래그먼트가 사용자와 상호작용을 시작할 때 호출됩니다.
onPause()
는 다른 프래그먼트나 액티비티가 포그라운드로 올라올 때 호출됩니다. 리소스를 해제하거나 데이터를 저장하는 작업을 수행합니다.
onStop()
는 프래그먼트가 더 이상 사용자에게 보이지 않을 때 호출됩니다.
onDestroyView()
는 프래그먼트의 UI가 제거될 때 호출됩니다. UI 관련 리소스를 해제하는 데 사용됩니다.
onDestroy()
: 프래그먼트가 완전히 종료되기 전에 호출됩니다. 모든 리소스를 해제해야 합니다.
onDetach()
: 프래그먼트가 액티비티와 연결이 끊어질 때 호출됩니다.
4. 안드로이드 개발에서 주로 사용되는 아키텍처 패턴에 대해 설명하고, 각각의 장단점을 비교해주세요.
패턴 | 장점 | 단점 | Model | View | 중재자 |
MVC | 구조가 단순하고 이해하기 쉽다. | View와 Controller의 결합도가 높아 유지보수가 어려울 수 있다. | 데이터와 비즈니스 로직을 관리 | 사용자 인터페이스를 표현 | Model과 View 사이의 상호작용 조정 |
MVP | View와 Model의 분리로 테스트가 용이하다. | Presenter가 복잡해질 수 있다. | 데이터와 비즈니스 로직을 관리 | 사용자 인터페이스를 표현 | View와 Model 사이의 중재자 역할 |
MVVM | 데이터 바인딩을 통해 View와 ViewModel의 결합도를 낮출 수 있다. | 복잡한 앱에서는 ViewModel이 비대해질 수 있다. | 데이터와 비즈니스 로직을 관리 | 사용자 인터페이스를 표현 | View에 필요한 데이터를 준비하고 상태 관리 |
MVI | 단방향 데이터 흐름으로 예측 가능성이 높다. | 상태 관리가 복잡해질 수 있고, 러닝 커브가 높다. | 앱의 상태를 나타냄 | 사용자 인터페이스를 표현 | 사용자 행동이나 시스템 이벤트를 나타냄 |
5. 안드로이드에서 비동기 프로그래밍을 위한 코루틴의 특징에 대해 설명해주세요.
안드로이드에서 코루틴(Coroutine)은 비동기 프로그래밍을 간결하고 효율적으로 처리할 수 있도록 도와주는 Kotlin의 기능입니다.
비동기 처리의 간소화
, 경량화된 스레드
, 스코프
, suspend 함수
, launch와 async
, 동시성 및 비차단성
, 에러 처리
, 취소와 타임아웃
, Flow와의 결합
이라는 특징이 있습니다.- 전통적인 비동기 프로그래밍에서는 콜백을 중첩하여 사용했는데, 코루틴은 직관적이고 간단하게 처리합니다. 비동기 작업을 마치 동기 코드처럼 작성할 수 있습니다.
suspend 함수
,launch와 async
등의 키워드를 사용하여 비동기 작업을 직관적으로 처리합니다.
- 코루틴은 경량 스레드로, 수천 개의 코루틴을 동시에 실행할 수 있습니다. 실제 스레드보다 훨씬 적은 메모리와 자원을 소비하여 효율적입니다. 스레드에 비해 빠른 생성 및 종료가 가능하고 여러 작업을 동시에 처리할 수 있어 안드로이드 앱에서 리소스 낭비를 줄이는 데 유리합니다.
- 코루틴은 특정 스코프(scope)내에서 실행됩니다. 스코프는 코루틴의 수명주기를 관리하여, 불필요한 리소스 낭비를 방지합니다.
- 예를 들어,
GlobalScope
나viewModelScope
,lifecycleScope
를 사용하여 UI 관련 작업을 안전하게 처리할 수 있습니다. lifecycleScope
와 같은 라이프사이클 기반 스코프를 사용하면 UI 관련 작업이 자동으로 관리되고, Activity나 Fragment가 종료될 때 관련된 코루틴도 취소됩니다.
suspend
키워드는 코루틴 내에서 비동기 작업을 수행할 수 있도록 하는 함수의 정의입니다.suspend
함수는 호출되면 즉시 결과를 반환하지 않고, 중단되었다가 나중에 결과를 반환합니다. 코루틴의 비동기 작업은suspend
함수를 사용하며 작성되며, 이 함수는Thread
를 차단하지 않고 효율적으로 작업을 기다립니다.
launch
는 코루틴을 비동기적으로 실행하는 함수입니다. 값을 반환하지 않으며, 실행된 코루틴은 종료될 때까지 계속 실행됩니다.async
는 코루틴을 실행하며 결과를 반환하는 함수입니다. 결과값을Deferred
객체로 받으며 이는await()
함수를 통해 비동기적으로 값을 받을 수 있습니다.
- 코루틴은 여러 작업을 동시에 실행할 수 있고, 비차단성을 유지합니다. 이는 UI 스레드를 차단하지 않고 비동기 작업을 처리하며 앱의 응답성을 높이는 데 유리합니다.
withContext
같은 함수를 사용하며 특정 스레드에서 비동기 작업을 실행할 수 있습니다. - 예를 들어, 네트워크 요청은 IO 디스패처를 사용하여 백그라운드 스레드에서 처리할 수 있습니다.
Coroutine Scope에서 Dispatcher에 대해 설명해주세요
- 코루틴 내에서 발생할 수 있는 예외를 try-catch 블록으로 처리할 수 있으며, 코루틴이 완료될 때까지 예외를 처리하여 앱의 안정성을 높입니다.
- 코루틴은 취소 가능하고, 특정 조건에서 취소할 수 있는 기능이 있습니다. 타임아웃 처리도 가능하여 네트워크 요청이나 긴 대기 작업에서 일정 시간이 지나면 자동으로 취소하도록 할 수 있습니다.
- 예를 들어,
Job.cancel()
을 사용하여 실행 중인 코루틴을 취소할 수 있습니다.
- 코루틴과 함께
Flow
를 사용하면 비동기 스트림 처리와 데이터 흐름을 관리할 수 있습니다.Flow
는 비동기적으로 데이터를 처리하며, 여러 값이 순차적으로 도착하는 스트림을 처리할 수 있게 해줍니다. - 상태 관리와 이벤트 처리를 구분하여 사용해야 하는 상황을 이해하고 있는지 확인하는 질문
StateFlow
와SharedFlow
의 차이를 명확히 알고, 상황에 맞는 선택을 할 수 있는지를 파악하는 질문- ‣
StateFlow
와 SharedFlow
는 상태 관리와 이벤트 전달을 위한 특별한 Flow 형태입니다.
StateFlow는 주로 상태 관리에 사용됩니다. 최신 상태 값을 구독자에게 항상 제공하는 특성이 있습니다. 예를 들어, UI에서 로딩 상태나 로그인 상태를 관리할 때 유용합니다.
StateFlow
는 구독자가 상태를 구독하면, 언제 구독을 시작하든 최신 상태를 즉시 받게 됩니다.반면에 SharedFlow는 이벤트 전달에 사용됩니다. 상태를 저장하지 않으며, 여러 구독자에게 이벤트를 전달할 수 있습니다. 예를 들어, 버튼 클릭 이벤트나 네트워크 요청을 처리할 때 사용할 수 있습니다.
SharedFlow
는 이벤트를 버퍼링할 수 있지만, 값은 저장하지 않기 때문에 구독자가 이벤트를 놓칠 수 있습니다.StateFlow와 SharedFlow의 차이점에 대해서 설명해주세요.
6. 안드로이드에서 데이터를 저장하는 주요 방식들을 설명하고, 각각의 장단점을 비교해주세요.
Datastore, Room을 사용하여 데이터를 저장하는 방식이 있습니다.
- DataStore는 SharedPreferences의 개선된 버전으로, 키-값 쌍으로 저장되는 작은 데이터 저장합니다. 간단한 데이터 저장에 최적화 되어있습니다.
- Room은 SQLite의 추상화 레이어로 안드로이드에서 관계형 데이터베이스를 쉽게 사용할 수 있게 해주는 라이브러리입니다.
- 복잡한 데이터 모델 및 관계형 데이터를 효율적으로 저장하고 처리할 수 있습니다.
- 대용량 데이터 처리 시 성능 저하됩니다. Room은 구성 과정이 비교적 복잡합니다. 기본적으로 비동기 처리가 필요합니다.
7. 안드로이드에서 주로 사용되는 네트워크 통신 라이브러리인 Retrofit과 OkHttp에 대해 설명하고, 이들의 주요 특징과 사용 방법을 설명해주세요.
Retrofit은 RESTful API와의 네트워크 통신을 쉽게 해주는 라이브러리입니다. 주로 서버와 데이터를 주고받을 때 사용되며, JSON 응답을 Java/Kotlin 객체로 변환하는 기능을 제공합니다.
- API 인터페이스 정의 후, 간단한 코드로 HTTP 요청을 보낼 수 있습니다.
- 응답 데이터를 자동으로 Java, Kotlin 객체로 변환합니다.
- Gson, Moshi 등의 라이브러리를 사용하여 JSON 파싱을 처리합니다.
enqueue()
메서드를 사용하여 비동기 요청을,execute()
메서드를 사용하여 동기 요청을 할 수 있습니다.
OkHttp는 HTTP 클라이언트 라이브러리로, 네트워크 요청과 응답 처리를 다루며, Retrofit이 내부적으로 사용하는 기본 HTTP 클라이언트입니다.
- 요청과 응답을 처리할 때 성능이 뛰어나고, 커넥션 풀링을 지원하여 효율적입니다.
- 핸드셰이크, 리다이렉션 등 다양한 HTTP 기능을 지원합니다.
- 요청이나 응답을 가로채고 수정할 수 있는 인터셉터를 지원합니다.
- 동기 및 비동기 요청 모두 지원합니다.
- OkHttp 인터셉터에 대해서 설명해주세요
8. Hilt 관련 질문
Hilt 관련해서 @Provides와 @Binds의 차이점, Singleton 객체 관리에 대한 질문을 받음
- Hilt에서 Scope는 무엇이며, 각 Scope의 역할은 무엇인가요?
- Hilt에서 제공하는 스코프 어노테이션(
@Singleton
,@ActivityScoped
,@ViewModelScoped
,@FragmentScoped
,@ApplicationScoped
)에 대한 이해 - ViewModelScope와 Hilt의 @ViewModelScoped는 어떻게 다르나요?
- Singleton 스코프의 객체는 언제 생성되고 언제 파괴되나요?
- Hilt에서 EntryPoint는 무엇이고, 언제 사용되나요?
@EntryPoint
의 역할과 주입을 위해 필요한 상황, 특히 DI 컨테이너 외부에서 객체를 주입해야 할 때 사용되는 경우- EntryPoint와 Module의 차이점은 무엇인가요?
- Hilt에서 Module과 Qualifier는 어떤 역할을 하고, Qualifier는 언제 필요할까요?
@Module
과@Provides
를 통해 종속성을 정의하는 방법@Qualifier
를 사용해 동일한 타입의 종속성을 구분하는 방식- Qualifier를 사용하지 않으면 어떤 문제가 발생하나요?
- Hilt에서 Assisted Injection은 무엇이고, 어떻게 사용하나요?
- Hilt에서 런타임 시에 외부에서 값이 주입되어야 하는 경우를 다룰 때 사용
- Assisted Injection과 일반 DI의 차이점은 무엇인가요?
- Assisted Factory는 어떤 상황에서 필요할까요?
- Jetpack Compose와 Hilt를 함께 사용할 때, Compose에서 Hilt를 통합하는 방법을 설명해주세요.
@HiltViewModel
을 사용하여 ViewModel을 Compose로 주입AndroidEntryPoint
로 Activity/Fragment에서 Hilt를 통합
- Hilt에서 @Provides를 사용할 때 Singleton 객체를 만드는 방법과 그 동작 원리에 대해 설명해주세요.
@Provides
와@Singleton
을 함께 사용해 객체를 생성할 때, Hilt가 싱글톤 생명주기를 어떻게 관리하는지 확인하려는 질문- @Singleton과 @Provides를 함께 사용할 때, 객체가 생성되는 시점은 언제인가요?
- 싱글톤으로 관리되지 않는 객체는 어떻게 동작하나요?
- @Provides와 @Binds의 차이점은 무엇이고, 각각 언제 사용하는 것이 적합한가요?
- Hilt에서 객체 생성 방식과 추상화된 클래스/인터페이스를 제공하는 방법을 구분할 수 있는지 평가
@Provides
: 생성자 호출로 구현체를 반환@Binds
: 기존 구현체를 제공할 때 사용(추상 클래스나 인터페이스)
- Hilt에서 @Singleton으로 정의된 객체의 생명주기는 어떻게 관리되나요? 예를 들어, 앱이 포그라운드에서 백그라운드로 전환될 때 어떤 동작을 하나요?
@Singleton
으로 정의된 객체가 Application Context에 묶여 관리되며, 앱이 종료되기 전까지 유지된다는 점을 이해하고 있는지 확인- Activity나 Fragment 수준에서 싱글톤 객체를 사용하면 어떤 문제가 있을까요?
- Hilt에서 @Inject와 @Provides는 어떤 차이가 있으며, 각각 언제 사용하는 것이 적합한가요?
- 간단한 객체의 생성은
@Inject
로, 복잡한 객체의 생성 로직은@Provides
로 관리하는 패턴을 알고 있는지 확인 @Inject
: 클래스 생성자에 바로 사용@Provides
: 특정 생성 로직이 필요한 경우
9. Kotlin Special Classes(data class, sealed class, object, interface) 관련 질문
- Kotlin에서 싱글톤은 어떻게 구현하나요? (
object
키워드의 동작 원리) object
키워드를 사용하여 구현할 수 있고, 클래스의 인스턴스를 자동으로 하나만 생성하여 그 인스턴스를 전역적으로 접근할 수 있도록 합니다.object
로 선언된 객체는 Lazy initialization(지연 초기화) 방식으로 처음 사용될 때 인스턴스가 생성됩니다. 즉, 해당 객체가 최초로 사용될 때 객체가 초기화됩니다.- 상속할 수 없고 클래스처럼 메서드와 프로퍼티를 가질 수 있어 일반적인 클래스와 동일하게 동작합니다.
- Kotlin에서 객체지향의 특성을 어떻게 지원하나요? (
data class
,sealed class
, 인터페이스 등) data class
에 대해 설명해주세요.data class
는 데이터 저장만을 목적하는 클래스를 정의할 때 사용합니다. 기본적으로equals()
,hashCode()
,toString()
,copy()
,componentN()
등의 메서드가 자동으로 생성되어 객체의 값 비교 및 복사 작업을 용이하게 만듭니다.sealed class
를 사용하는 이유에 대해 설명해주세요.sealed class
는 상속을 제한하여, 주어진 클래스 계층을 고정시킬 수 있습니다. 주로 상태나 결과를 표현할 때 유용합니다.sealed class
는 하위 클래스를 컴파일 시점에 모두 알고 있기 때문에,when
구문에서 모든 하위 클래스를 처리하도록 강제할 수 있습니다.- 상태 기반 처리(예: 네트워크 요청 결과, UI 상태 등)에 유용하며, 코드의 가독성 및 안전성을 높여줍니다.
Interface
가 객체지향을 지원하는 방식은 무엇인가요?- 인터페이스는 클래스가 구현해야 하는 메서드 시그니처를 정의하는 데 사용됩니다.
- Kotlin에서는 다중 상속을 지원하지 않지만, 인터페이스는 여러 개를 구현할 수 있어 다중 상속을 대체할 수 있습니다.
10. XML, Jetpack Compose의 차이점과 장단점에 대해서 말씀해주세요.
XML은 명령형 방식으로 UI를 구성하는 전통적인 방법입니다. XML 파일에 UI 요소를 정의하고, 이를 통해 화면을 그리도록 합니다. UI 요소의 상태 변화나 UI 구성 요소의 동작은 명령형 코드를 통해 수정하고 관리해야 합니다.
Jetpack Compose는 선언형 방식으로 UI를 구성하는 방법입니다. UI 요소를 화면에 어떻게 그릴지가 아니라 무엇을 그릴지 선언합니다. Compose는 UI의 상태 변화에 따라 자동적으로 화면을 갱신해주므로, 개발자가 상태 변화를 명시적으로 관리할 필요가 줄어듭니다.
특징 | XML (명령형) | Jetpack Compose (선언형) |
프로그래밍 스타일 | 명령형(Imperative) | 선언형(Declarative) |
UI 정의 | 각 UI 요소와 레이아웃을 명시적으로 정의 | UI를 어떻게 그릴지가 아니라 무엇을 그릴지 선언 |
상태 관리 | 상태 변화에 따라 UI 요소를 수동으로 업데이트 | 상태가 변화하면 Compose가 UI를 자동으로 갱신 |
코드 구조 | UI 요소와 코드가 분리되어, 코드에서 UI를 수정 | UI 코드와 로직이 같은 함수 내에 작성되며 직관적 |
장점 | 안드로이드 전통적인 방식으로 많은 예시와 자료가 있음 | 코드가 간결하고 UI가 자동으로 갱신되어 관리가 쉬움 |
단점 | UI 수정 시 코드가 복잡해질 수 있음 | 새로운 개념이라 학습 비용이 있음 |
11. Jetpack Compose에서 성능을 강화하는 방법에 대해서 말씀해주세요.
- Recomposition 최적화
- 불필요한 recomposition 방지합니다. Compose에서는 상태 변경 시
@Composable
함수가 다시 호출되며 UI가 재구성됩니다. 불필요한 recomposition을 방지하려면 상태가 변경된 부분만 재구성되도록 해야 합니다. remember
을 사용하여 상태를 캐시하거나derivedStateOf
로 계산된 상태를 메모리에서 유지하거나key
를 사용해LazyColumn
같은 리스트에서 항목을 식별하고 변경된 항목만 재구성하도록 할 수 있다.
- State 관리 최적화
State
와remember
: 상태 관리를 할 때 불필요하게 큰 상태를remember
로 저장하지 않도록 하고, 작은 단위로 관리하여 성능 저하를 방지합니다.rememberSaveable
: 화면 회전 등으로 상태를 유지하고 싶은 경우rememberSaveable
을 사용하여 상태를 저장합니다. 이 방법은 메모리 관리를 잘 할 수 있습니다.
- 불필요한 UI 요소 최소화
- 리스트가 길 경우
LazyColumn
,LazyRow
를 사용하여 화면에 보이는 항목만 렌더링하게 하여 성능을 향상시킵니다. Modifier.fillMaxWidth
와 같은 효율적인 레이아웃: 필요한 크기만 할당하여 무거운 레이아웃을 피하고 불필요한 마진/패딩을 최소화합니다.
- UI 업데이트 최적화
- 특정 이벤트나 상태 변화가 있을 때만 UI 업데이트를 유발하도록 함으로써 성능을 향상시킬 수 있습니다
- 예를 들어,
LaunchedEffect
는 특정 값에만 의존하여 작업을 처리하고,SideEffect
는 UI 외부의 효과적인 작업을 수행합니다. - SideEffect에 대해서 아는대로 말씀해주세요
Modifier
최적화- 최소한의 Modifier 사용: 너무 많은 Modifier를 중첩하는 것보다는 필요한 최소한의 Modifier만 사용하는 것이 성능에 도움이 됩니다.
- 효율적인
Modifier
체이닝: Modifier 체이닝을 할 때 불필요한 작업을 하지 않도록 최적화합니다. 예를 들어,padding
이나fillMaxWidth
등은 적절하게 사용해야 합니다.
- 작은 단위의 컴포저블 함수로 나누기
- 하나의 커다란 컴포저블 대신 작은 단위의 함수로 나누어 관리하면 불필요한 재구성을 방지할 수 있습니다.
- 작은 단위로 분리하면 상태 변경 시 재구성 범위를 최소화할 수 있습니다.
- Profile 사용 및 성능 분석
- Android Studio에서 제공하는 Profiler를 사용해 앱의 성능을 모니터링하고 어떤 부분에서 성능 문제가 발생하는지 확인할 수 있습니다.
androidx.compose.ui.tooling.preview.Preview
와compose.runtime.debug
를 사용하여 성능을 점검하고 최적화할 수 있습니다.
- Background 작업 및 Coroutines 활용
- 긴 작업은 UI 스레드에서 처리하지 않고 백그라운드에서
Coroutine
을 사용하여 실행하고, UI 스레드는 최대한 빠르게 응답할 수 있도록 유지합니다.
12. 동기 프로그래밍과 비동기 프로그래밍이 무엇인지 설명해주세요
동기 프로그래밍에서는 코드가 실행되는 순서대로 작업을 처리합니다. 즉, 한 작업이 완료될 때까지 다음 작업이 실행되지 않으며, 각 작업은 순차적으로 처리됩니다.
비동기 프로그래밍은 작업을 동시에 실행할 수 있도록 하여, 다른 작업이 끝날 때까지 기다리지 않고 다른 일을 처리할 수 있게 합니다.
13. 안드로이드 아키텍처와 클린 아키텍처에 대해서 설명해주세요
클린 아키텍처는 애플리케이션의 비즈니스 로직을 외부 시스템(사용자 인터페이스, 데이터베이스, 네트워크 등)과 분리하여 단일 책임 원칙(Single Responsibility Principle)과 의존성 규칙(Dependency Rule)을 준수합니다.
- 주요 계층으로는 Entities(엔티티), Use Cases(유즈 케이스), Interface Adapters (인터페이스 어댑터), Frameworks and Drivers (프레임워크 및 드라이버)가 있습니다.
- 안쪽 계층은 바깥쪽 계층에 의존할 수 없으며, 바깥쪽 계층은 안쪽 계층에 의존할 수 있는 의존성 규칙이 있습니다.
안드로이드 아키텍처는 계층화된 아키텍처를 권장합니다. 데이터 레이어, UI 레이어, 데이터 레이어는 저장소를 사용하여 애플리케이션 데이터를 노출해야 합니다. 코루틴 및 Flow를 사용하여 레이어 간에 통신합니다. 큰 앱인 경우 도메인 레이어를 사용합니다.
- UI 레이어에 관한 권장사항
- 단방향 데이터 흐름(UDF) 원칙 따르기
- 앱에 이점이 적용되는 경우 AAC ViewModel을 사용합니다
- 수명 주기 인식 UI 상태 컬렉션을 사용합니다
- ViewModel에서 UI로 이벤트를 전송하면 안 됩니다.
- 앱에 화면이 두 개 이상 있으면 Navigation Fragments 또는 Navigation Compose를 사용하여 화면 간에 이동하고 딥 링크로 앱에 연결합니다.
- Jetpack Compose를 사용합니다.
- ViewModel 권장사항
- ViewModel은 Android 수명 주기에 구애받지 않아야 합니다.
- 코루틴 및 Flow를 사용합니다.
- 화면 수준에서 ViewModel을 사용합니다.
- UI 로직 및 State Holder 클래스를 사용합니다.
기본 프로그래밍 개념
객체지향 프로그래밍에 대해서 설명해주세요.
- 객체지향 프로그래밍(OOP, Object-Oriented Programming)은 데이터를 객체라는 단위로 묶어서 관리하고, 이 객체들이 서로 상호작용하면서 프로그램을 구성하는 방식입니다.
- 객체는 상태(데이터)와 동작(메서드)을 함께 캡슐화하여 관리합니다.
- 객체지향 프로그래밍의 주요 개념은 클래스, 객체, 상속, 다형성, 캡슐화, 추상화입니다.
객체지향의 주요 개념 5가지에 대해서 설명해주세요
- 클래스(Class)는 객체가 가질 수 있는 속성(변수)과 동작(메서드)을 정의합니다.
- 객체(Object)는 클래스로부터 실제 인스턴스화된 실체입니다. 객체는 클래스를 기반으로 생성되며, 클래스에서 정의된 속성과 메서드를 가집니다.
- 상속(Inheritance)은 한 클래스가 다른 클래스의 특성과 동작을 물려받는 것입니다. 코드의 재사용성을 높이고 공통된 특성을 하나의 부모 클래스에 정의하여 자식 클래스에서 이를 상속받을 수 있습니다.
- 다형성(Polymorphism)은 동일한 이름의 메서드가 서로 다른 클래스에서 다르게 동작할 수 있게 하는 개념입니다. 오버로딩과 오버라이딩이 다형성의 예 입니다.
- 오버로딩 : 매개변수의 개수나 타입에 따라 메서드가 다르게 동작
- 오버라이딩 : 상속받은 클래스에서 부모 클래스의 메서드를 재정의
- 캡슐화(Encapsulation)는 객체의 내부 상태를 외부에서 직접 접근하지 못하게 하고, 이를 제어할 수 있는 방법(메서드)을 제공하는 원칙입니다. 객체의 상태는 private으로 선언하고, 그 상태를 변경하거나 조회하는 메서드(보통 getter와 setter)를 제공하여 외부에서 상태를 안전하게 다룰 수 있도록 합니다.
- 추상화(Abstraction)는 잡한 시스템을 단순화하여 필요한 부분만을 다루는 개념입니다. 추상화된 클래스나 인터페이스를 통해 구체적인 구현을 숨기고, 필요한 동작만을 정의합니다.
Share article