본문 바로가기
IT 지식

Android 관련 면접 질문 리스트

by 기계공학 주인장 2023. 3. 19.
반응형

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를 벗어났을 때 특정 행동을 해야한다면 아래와 같은 방법으로 안전하게 할 수 있다 
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가 완전히 소멸하기 직전에 호출된다.
    • 그렇기 때문에 여기서 모든 리소스를 해제해야한다.
반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글