반응형
Android(안드로이드)에 대한 면접 질문 리스트입니다.
Contex란 무엇인가?
- 어플리케이션 환경과 관련된 정보를 제공하는 클래스이며 앱 자체의 상태 정보를 제공하기도 함.
- 애플리케이션 컴포넌트 (예 : Activity, Service, BroadcastReceiver 등)는 Context를 통해 다양한 시스템 리소스에 액세스하고, 리소스를 사용하거나 변경할 수 있습니다.
- 예를 들어, Context를 사용하여 애플리케이션의 리소스 (레이아웃, 문자열, 그림 등)를 가져올 수 있습니다.
- Context는 애플리케이션의 전반적인 라이프사이클과 관련이 있기 때문에, 메모리 누수와 같은 문제를 발생시키지 않도록 조심해야 합니다.
- 예를 들어, Activity의 인스턴스를 참조하는 Context를 정적 변수에 저장하면, Activity가 종료되어도 Context가 메모리에 남아서 메모리 누수가 발생할 수 있습니다. 따라서 Context를 사용할 때에는 이러한 문제를 고려하여 적절하게 처리해주어야 합니다.
안드로이드 4대 컴포넌트란 무엇인가?
- Activity: 사용자 인터페이스 화면을 제공하는 애플리케이션 구성 요소입니다.
- 예를 들어, 로그인 화면, 설정 화면 등 사용자가 상호작용하는 화면을 구현하는 데 사용됩니다.
- Service: 백그라운드에서 실행되는 애플리케이션 구성 요소입니다.
- 예를 들어, 음악 재생, 데이터 동기화, 네트워크 작업 등 애플리케이션에서 오랫동안 실행해야 하는 작업을 구현하는 데 사용됩니다.
- BroadcastReceiver: 시스템 및 다른 애플리케이션으로부터 전송되는 브로드캐스트 메시지를 수신하는 애플리케이션 구성 요소입니다.
- 예를 들어, 배터리 부족 알림, 네트워크 연결 변경 알림 등 다양한 시스템 이벤트를 수신하는 데 사용됩니다.
- ContentProvider: 애플리케이션 간 데이터 공유를 위한 인터페이스를 제공하는 애플리케이션 구성 요소입니다.
- 예를 들어, 주소록, 사진, 비디오 등 다양한 데이터를 다른 애플리케이션에서 공유하거나, 애플리케이션 내에서 데이터를 관리하는 데 사용됩니다.
각 컴포넌트는 서로 다른 생명주기를 가지고 있기 때문에, 적절히 조합하여 사용해야 합니다.
안드로이드에서 발생할 수 있는 문제 ANR 이란?
- ANR (Application Not Responding)은 안드로이드에서 발생할 수 있는 오류로, 사용자 인터페이스가 블로킹되거나 애플리케이션이 응답하지 않는 상황을 말합니다.
- 예를 들어 다음과 같은 원인으로 발생할 수 있습니다.
- 애플리케이션에서 시간이 오래 걸리는 작업을 메인 스레드에서 실행
- 메모리 누수가 발생하여 시스템 자원을 과도하게 사용
- 외부 리소스에 대한 액세스가 블로킹되어 응답하지 못함
안드로이드에서 말하는 Thread와 Process의 차이점은?
- 프로세스는 운영체제에서 할당되는 작업 단위로, 독립된 메모리 공간과 자원을 갖고, 실행 중인 프로그램을 의미합니다.
- 쓰레드는 하나의 프로세스 내에서 실행되는 실행 단위로, 프로세스의 자원을 공유하며, 프로세스 내에서 동시에 실행될 수 있습니다.
- 프로세스는 운영체제가 할당하는 메모리, 파일, 소켓 등의 자원을 독립적으로 가집니다.
- 쓰레드는 부모 프로세스의 자원을 공유하기 때문에, 쓰레드를 생성하는 데 드는 비용은 적지만, 쓰레드 간 자원 공유를 위한 동기화 등을 위한 비용이 발생할 수 있습니다.
- 프로세스는 각각 독립적인 주소 공간에서 실행되므로, 다른 프로세스의 메모리에 직접 접근할 수 없습니다.
- 쓰레드는 동일한 주소 공간을 공유하기 때문에, 각 쓰레드는 다른 쓰레드의 변수에 직접적으로 접근할 수 있습니다. 이는 멀티쓰레딩을 통한 프로그래밍에서 상호작용이 필요한 경우에 유용합니다.
- 프로세스는 운영체제에 의해 생성되며, 각각 독립적인 프로세스에 대한 제어는 운영체제에 의해 이루어집니다.
- 쓰레드는 프로그램에서 직접 생성하고, 각각의 쓰레드에 대한 제어는 부모 프로세스에서 이루어집니다.
즉, 쓰레드는 프로세스 내에서 실행되며, 동시성 및 병렬성을 구현하는 데 중요한 역할을 합니다. 반면에, 프로세스는 독립적으로 실행되며, 각각의 프로세스는 독립적인 환경에서 실행되기 때문에, 안정성과 보안성 등의 측면에서 유리합니다.
안드로이드 Activity의 UI의 라이프 사이클은 어떻게 되는가?
- Activity의 라이프 사이클은 다음과 같은 6가지로 구분된다.
- onCreate
- onStart
- onResume
- onPause
- onStop
- onDestroyd
- onCreate()
- 라이프 사이클이 돌고 있을 때 반드시 딱 1번만 실행된다.
- Activity가 생성됐음을 의미한다.
- activity의 기본 로직이 시작할 때 해야하는 것들을 여기에 정의한다.
- savedInstanceState 매개변수를 수신하는데 이는 이전 Activity 저장 상태가 포함된 Bundle 객체를 갖고 있다.
- 최초 값은 null이다.
- 다음과 같은 코드를 사용하여 savedInstanceState에 값을 넣고 꺼낼 수 있다.
lateinit var textView: TextView
// 액티비티 인스턴스의 일시적인 상태
var gameState: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
// 뷰 계층 구조와 같은 액티비티 생성을 완료하기 위해 수퍼 클래스의 onCreate를 호출
super.onCreate(savedInstanceState)
// 인스턴스 상태를 복구
gameState = savedInstanceState?.getString(GAME_STATE_KEY)
// 이 액티비티의 UI 레이아웃을 설정
// 레이아웃 파일은 프로젝트 res/layout/main_activity.xml 파일에 정의됨
setContentView(R.layout.main_activity)
// 이후에 텍스트뷰를 조작할 수 있도록 멤버 텍스트뷰를 초기화
textView = findViewById(R.id.text_view)
}
// 이 콜백은 onSaveInstanceState()를 사용하여 이전에 저장된 저장된 인스턴스가 있을 때만 호출됩니다.
// onCreate()에서 상태를 복원합니다.
// onStart()가 완료된 후에 사용 가능한 추가 상태를 선택적으로 여기에 복원할 수 있습니다.
// savedInstanceState Bundle은 onCreate()에서 사용한 것과 동일합니다.
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
textView.text = savedInstanceState?.getString(TEXT_VIEW_KEY)
}
// 액티비티가 일시적으로 파괴될 때 호출되며, 여기서 인스턴스 상태를 저장합니다.
// 액티비티가 파괴될 때 저장해야할 값이 있다면 여기서 bundle에 저장해야한다.
override fun onSaveInstanceState(outState: Bundle?) {
outState?.run {
putString(GAME_STATE_KEY, gameState)
putString(TEXT_VIEW_KEY, textView.text.toString())
}
// 뷰 계층 구조를 저장하기 위해 수퍼 클래스를 호출
super.onSaveInstanceState(outState)
}
- onStart()
- Activity가 사용자에서 표시된다.
- 매우 빠르게 완료된다.
- 그렇기 때문에 여기에 오랜 시간이 걸리는 동작을 지정해선 안된다.
- onResume()
- Activity가 포그라운드에 들어가고 호출되는 함수
- 해당 Activity에 포커스가 떠날 때까지 이 상태에 머무른다.
- 그렇기 때문에 다른 화면에서 해당 Activity로 돌아왔을 때 반복적으로 해야하는 행동이 있다면 여기에 정의해야한다.
- 다음과 같은 코드로 onResume 상태에 왔을 때 안전하게 동작을 지정할 수 있다.
class CameraComponent : LifecycleObserver {
...
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun initializeCamera() {
if (camera == null) {
getCamera()
}
}
...
}
- onPause()
- 사용자가 Activity의 포커스를 벗어났을 때 호출된다
- 포커스를 벗어났다는 말을 해당 Activity를 떠났거나 Activity 위에 다른 view가 온 것을 의미
- 해당 Activity를 벗어났을 때 특정 행동을 해야한다면 아래와 같은 방법으로 안전하게 할 수 있다
- 사용자가 Activity의 포커스를 벗어났을 때 호출된다
class CameraComponent : LifecycleObserver {
...
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun releaseCamera() {
camera?.release()
camera = null
}
...
}
- onStop()
- Activity가 완전히 가려지거나 보이지 않게 됐을 때 호출된다.
- 그렇기 때문에 사용자가 해당 화면을 보지않고 있을 때 리소스를 사용하지 않게 여기서 처리할 수 있다.
override fun onStop() {
// call the superclass method first
super.onStop()
// define here some actions
}
- onDestroy()
- Activity가 완전히 소멸하기 직전에 호출된다.
- 그렇기 때문에 여기서 모든 리소스를 해제해야한다.
반응형
'IT 지식' 카테고리의 다른 글
갤럭시 S펜 간섭 없이 맥세이프 케이스 쓰기 (4) | 2024.01.06 |
---|---|
효율 높은 보조 배터리 추천 및 효율 계산 방법 (0) | 2023.11.04 |
윈도우11에서 분할화면, 멀티태스킹 창 끄는 방법 (0) | 2023.11.03 |
구글 캘린더 iCal을 사용하여 iCloud 캘린더에서 구독 or 동기화 (0) | 2023.11.03 |
변경한 깃 ignore 적용해서 깃 허브에 이미 업로드된 파일 제거하기 (0) | 2023.06.11 |
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글