기술면접 02

DaY·2021년 4월 29일
1

기술면접

목록 보기
2/6
post-thumbnail

Reference

Kotlin

  • Java에 비해 훨씬 간결한 코드
  • 객체지향이면서 함수형 프로그래밍 언어
  • 자바와 상호운용 가능 (자바에서 코틀린으로 작성된 클래스를 부를 수 있으며 반대로도 가능)

반응형 프로그래밍 - RXJava

리액티브 프로그래밍은 데이터 흐름(data flow)과 변화 전파에 중점을 둔 프로그래밍 패러다임
프로그래밍 언어로 정적 또는 동적인 데이터 흐름을 쉽게 표현
데이터 흐름을 통해 하부 실행 모델이 자동으로 변화를 전파할 수 있는 것을 의미

Observable

  • 데이터 흐름
  • 주기적으로 데이터를 처리하고 변화를 방출하며 데이터 흐름을 다른 구성요소에게 전달

Observer

  • Observable이 방출한 데이터를 받아서 데이터 흐름의 변화를 관찰

  • Observable이 방출한 데이터를 메인 스레드나 UI에 전달하는 역할

    onComplete()
    Observable이 더 이상 방출할 데이터가 없을 때 호출

    onError(Throwable e)
    Error 발생 시 호출

    onNext(Object o)
    새로운 데이터가 방출될 때 호출
    방출된 데이터는 매개변수에서 찾을 수 있음

Schedulers

  • Rx의 핵심은 비동기 처리에 있음

  • Observable과 Observer가 어떤 스레드에서 작업을 수행할지 지정

    subscribeOn(Thread)
    Observable이 실행되어야 하는 스레드 지정

    observeOn(Thread)
    Observer가 실행되어야 하는 스레드 지정

Manifest file

  • 애플리케이션에 관한 정보를 입력하는 파일로 xml 형태
  • 패키지 이름, 앱 이름, 앱 설명, 아이콘, 앱이나 구성요서에서 필요한 권한, 앱에서 사용되는 액티비티, 서비스, 브로드캐스트에 대한 정보 등 전반적 앱 정보 저장

Activity

  • 화면에 UI를 표시하는 기본요소
  • 대부분의 경우 액티비티는 꽉찬 화면을 구성하지만, 예외적으로 floating windows, multi-window mode 처럼 화면의 일부를 차지하게 할수 있다.
  • Acitivty 의 종류 중 하나로 FragmentActivity가 있는데, nested fragment는 fragment 안에 다른 fragment가 있는 경우 고려
  • AppCompatActivity는 안드로이드 하위버전의 안드로이드를 지원하기 위해 사용
  • AppCompatActivity는 FragmentActivity를 상속

Activity Life Cycle

  • 재개 (create, start, resume)

  • 일시정지 (pause)

  • 멈춤 (stop, destroy)

    onCreate (액티비티 생성 직전)
    onRestart (액티비티가 stop상태에서 재시작될 경우)
    onStart (액티비티가 화면에 보여지기 직전)
    onResumed (액티비티가 사용자와 상호작용하기 직전)
    onPause (액티비티가 부분적으로 가려짐)
    onStopped (액티비티가 더 이상 보이지 않을때)
    onDestroy (액티비티가 소멸되기 직전)

Fragment

  • 프래그먼트는 액티비티의 부분부분을 동적으로 동작시키기 위해 생긴 개념
  • 탭레이아웃의 탭을 눌러서 다른화면으로 전환하는 앱의 경우, 한 액티비티안에서 탭을 눌렀을 때 보여지는 프래그먼트만 변경되며, 프래그먼트는 액티비티와 달리 스택에 쌓이지 않기 때문에 백버튼을 누른다고 해서 이전 프래그먼트로 돌아가지 않는다. (이는 BackStack을 추가하여 직접 구현)
  • 프래그먼트의 라이프사이클은 액티비티와 거의 동일한데, onAttach, onCreateView, onDestroyView, onDetach라는 콜백이 추가

Thread & Handler & Looper

Thread

  • 안드로이드는 기본적으로 하나의 메인 스레드로 작동
  • UI 조작은 메인 스레드만 가능 > 두 개 이상의 스레드가 UI에 동시에 접근 시 의도와 다르게 동작할 가능성이 크기 때문
  • 멀티 스레드 환경에서 동기화 이슈를 차단하고 스레드 간 통신을 위해 사용되는 것이 Handler & Looper
  1. Java IO에서 제공하는 파이프 이용
  2. 스레드 간 공유 메모리를 통한 접근
  3. Synchronized를 이용한 시그널링
  4. BlockingQueue를 이용한 방법

스레드 통신 메커니즘
핸들러 - 루퍼 - 메시지 큐 - 메시지

android.os.Looper - UI 스레드에 하나가 존재하며 소비자 스레드와 연관된 메시지 발송자 (데이터를 읽는 역활)

android.os.Handler - 큐에 메시지를 삽입하는 생산자 스레드를 위한 인터페이스와 소비자 스레드 메시지 처리, 하나의 Looper 객체는 많은 핸들러를 갖지만 모두 같은 큐에 삽입

android.os.MessageQueue - 소비자 스레드에서 처리할 메시지들이 담긴 무제한의 연결 리스트. 모든 루퍼와 스레드는 최대 하나의 메시지 큐를 가진다.

android.os.Message : 소비자 스레드에서 실행하는 메시지

Handler

  • 핸들러 생성 시 기본적으로 행들러를 생성한 스레드와 루퍼에 연결
  • postDelayed / postAtFrontOfQueue와 같이 메시지 순서나 보내는 시간 조작 함수 보유 > 스케줄링가능

Looper

  • MessageQueue의 메시지나 Runnable 객체를 꺼내 핸들러에게 전달
  • run() 메소드 내부에 MessageQueue 생성 > Looper.loop()를 통해 메시지 전달 대기

AsyncTask

  • 백그라운드에서 작업 수행 뒤 결과를 UI Thread에서 생신할때 주로 사용
  • 순차적으로 실행

단점

  • 액티비티 종료 시 따로 명시하지 않으면 메모리에 남아 Memory leak 발생
  • 한 번만 실행되고 재사용 불가
  • 처리 작업의 수가 1개
  • Configuration 변경 시 크래쉬 발생

대안으로 java.util.concurrent API / Kotlin coroutine / RxJAVA 사용 권장

Intent

  • 구성 요소 실행 & 구성 요소 간 데이터 전달
  • putExtra()를 통해 데이터 보관 > getExtra()로 전달 받을 수 있음

CustomView

  • 기존에 있는 View (ImageView, TextView 등)로 표현할 수 없는 모양의 View를 구현해야 할때 필요
  • View를 상속받는 자손 클래스를 만들어서 구현
  1. 기존 View 상속
  2. onDraw(), onMeasure(), onKeyDown() 처럼 'on'으로 시작하는 슈퍼클래스 메서드를 오버라이드
  • onDraw()
    • 뷰를 실제 그릴때 사용
    • Canvas 객체를 매개변수로 받음
      • Canvas 객체는 어떤 도형을 그릴지 설정
      • Paint 객체는 도형의 색, 스타일, 글꼴 등을 설정
    • protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
      • 뷰의 크기 설정 시 사용

0개의 댓글