카테고리 없음

Android 기본개념 2

728x90
반응형

1. Android Recyclerview

  • ListView와 RecyclerView의 차이가 무엇인가요?
    • 둘 다 리스트를 나타내는 뷰라는 점은 동일하다. 데이터가 저장되어 있는 아이템들을 화면에서 리스트로 출력해주며 스크롤 기능을 통해 모든 데이터들을 보여준다.
    • RecyclerVIew는 강제로 ViewHolder를 사용하여 뷰를 재활용함
      • ListView는 스크롤을 내려서 새로운 아이템이 화면에 출력될 때마다 새 객체를 생성해야하고 이로 인해 과부하가 온다는 단점이 있어 RecyclerView가 이 단점을 보완하고자 만들어진 뷰이다. 새로운 아이템이 화면에 등장하면 이전에 사용했던 ( 화면 밖으로 사라진) 객체를 재활용하는 방식으로 이 문제를 해결
    • RecyclerVIew는 ArrayAdapter가 아닌 Adapter를 따로 만들어 다양한 화면 가능
      • Item에 대한 뷰의 변형이나 애니메이션할 수 있는 개념이 추가됨
  • ListView에 ViewHolder를 넣을 수 있을까요?
    • YES!! 리스트뷰에서 뷰홀더(ViewHolder Pattern) 패턴을 사용하면
    • 리스트뷰에서 리스트의 개수가 많은 상황에서 findViewById를 통한 XML 리소스 접근이 빈번할 경우 성능저하가 발생하기 때문에 View 객체를 ViewHolder에 홀드시켜 성능을 개선
  • Adapter
    • ListView는 ArrayAdapter 제공, Recyclerview는 강제로 adapter 만들어야함
    • 기존의 ListView에서 사용하는 Adapter와 같은 개념으로 데이터와 아이템에 대한 View 생성
  • ViewHolder

2. Android HTTP 통신

  • Restful API란?
    • Representation State Transfer의 약자
    • 웹상에 존재하는 모든 자원에 URI를 부여하여 사용하는 방법이다. (비연결성, URI로 자원에 접근)
    • HTTP 웹 표준을 이용하며 http의 캐싱을 활용 할 수 있다는 장점이 있다. 그리고 구조가 명확하여 클라이언트와 서버에서 개발해야할 부분이 명확해지고 Uri만 봐도 어떤 요청인지 파악될 수 있게직관적이다라는 특징이 있습니다.
  • RESTful API 이용한 통신 에러 발생 시 retry 등은 어떻게 처리하셨나요?
  • RESTful API 의 정의와 활용법에 대해 설명해주세요.
  • OkHttp와 Retrofit 차이점, 장단점
  • Http vs. Https*Http **: Hypertext transfer protocol, 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위한 통신규약. 인터넷에서 하이퍼텍스트를 교환하기 위해 사용되는 통신규약.Https : http하고 거의 같지만 모든 통신 내용을 암호화. s가 secure socket, 안전한 통신망을 뜻함.암호화는 TLS라고 하여 Transport계층에서 이루어짐. L4의 전송계층에서 암호화가 이루어짐.https암호화를 하려면 웹 서버에 부하가 생김(암호화 과정 때문에 https가 더 느림), 비용이 비쌈.그래서 아무나 봐도 상관없는 페이지는 http로, 남에게 보이면 안되는 금융 정보나 메일 등 중요한 것은 https로 하는 것이다. GMail은 https를 지원한다.
  • http는 비연결형으로 웹 페이지를 보는 중 인터넷 연결이 끊겼다가 다시 연결되어도 페이지를 계속 볼 수 있지만 https는 소켓(데이터를 주고받는 경로) 자체에서 인증을하기 때문에 인터넷 연결이 끊기면 소켓도 끊어져서 다시 https 인증을 해야한다. 그래서 시간이 또 걸린다.
  • 근데 왜 http써?
  • 패킷이 암호화 되어 있기 때문에 패킷캡쳐 프로그램으로 캡쳐를 해도 암호화된 내용만 보임.
  • http에는 사용할 수 있는 메소드가 여러 가지 있다. HEAD, GET, POST, DELETE, OPTION등
  • 공통점: 둘다 인터넷을 이용하는 프로토콜
  • POST vs. GET
    • GET : URL 마지막단에 ‘?’ 문자를 기준으로 모든 파라미터를 전달, 주소창에 값이 노출되기에 PW와 같은 민감한 정보를 전송하면 안됨,
    • POST : 전달하려는 정보가 HTTP body 에 포함되어 전달 -> 사용자에게 직접적으로 파라미터 노출 X
    • 길이에 제한 없음, 서버 혹은 DB의 값이나 상태를 바꿀 때 사용
  • Sdk, Rest Api 차이 (카카오지도, 카카오로컬)
    • SDK는 Software Development Kit
      • 일반적으로 소프트웨어 기술자가 사용하여 특정한 소프트웨어 꾸러미
      • SDK에는 소프트웨어를 개발하기 위한 실제 코드가 있으며 사용자가 사용할 수 있다.
    • API는 Application Programming Interface
      • 응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스(환경)
      • 쉽게 데이터베이스나 기능을 사용할 수 있도록 모듈화하여 만들어 두었다. API 사용자는 (아마도 개발자) A에 대한 정보가 필요할 때 DB에 접속하여 정보를 가져오는 것이 아닌 getInfo같은 API를 통해 정보를 가져오게 된다(수정, 삭제 등)
      • B의 상황에선 가 API를 등 코드를 작성하는 방법, 정보를 받기 위해선 어떤 매개변수를 넘겨야 하는 지 등에 대한 정보를 제공하며 그 이후에 어떤 작업을 진행해야 하는지는 사용자의 몫
    • REST
      • HTTP 프로토콜의 모범사례
      • HTTP URI를 통해 서버의 주소에 접근하고, HTTP Method 행위을 적용하여, 적절한 표현으로 응답받음
        • 자원: HTTP URI를 통해 자원(Resource)을 명시하고
        • 행위: HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미
        • 표현(json, xml): 서버의 응답방식
  • REST API
    • 남의 컴퓨터를 실행시키는 방법
    • HTTP 프로토콜의 모범사례를 사용하는방법
  • 등록된 키 해시와 일치하는 앱에서만 지도 API를 사용할 수 있기 때문에 반드시 등록해주세요 라고 나와있는데 여기서 키 해시를 등록하는 이유는?
    • 민감한 정보일 수도 있는 앱의 사이닝 키(signing key)값이 아닌 그 값을 해시한(특히 SHA-1 함수를 통해) hash key를 통해 인증된 사용자인지 여부를 판단(무분별한 트래픽을 방지)
    • 해시를 통한 사용자 인증의 장점은 해시값이 노출되어도 해시값만 가지고는 원본 데이터를 추론할 수 없기 때문
    출처:[생각하는 개발자]
  • https://manorgass.tistory.com/76
  • Retrofit ?
    • REST API 통신을 위해 구현된 OkHttp 라이브러리의 상위 구현체
    • Callback을 통해 Main Thread에서 UI 업데이트 가능
    • 장점
      • 빠른 성능
        • Okhttp는 AsyncTask를 사용 (AsyncTask의 3~10배의 성능차이)
      • 간단한 구현
        • HttpUrlConection : Connection / Input&OutputStream / URL Encoding 생성 및 할당의 반복작업
        • OkHttp : 쿼리스트링, Request / Response 반복 설정 작업
      • 가독성
      • 동기/비동기 쉬운 구현
  • Retrofit 장점
  • Retrofit 구성요소
    • DTO (POJO) : 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델(Model) / JSON 타입변환에 사용
    • Interface : 사용할 HTTP CRUD동작(메소드) 들을 정의해놓은 인터페이스
      • CRUD (Create/Read/Update/Delete) -> HTTP Method ( POST / GET / PUT / DELETE )
    • Retrofit.Builder 클래스 - Interface를 사용할 인스턴스, baseUrl(URL) / Converter(변환기) 설정
  • Json
    • 데이터를 표현 표준
    • 중괄호(객체), 대괄호(배열) 콜론(키, 벨류)
  • Gson
    • json object → Java object, Java object → json object 를 쉽게 해줌

 

 

3. Android 스레드 통신

  • 스레드를 사용해야하는 이유
    • 외부 Thread 가 없이 Main Thread 만으로만 구현하게 된다면, 이러한 문제가 생긴다. 어떠한 버튼을 눌렀을 때 Main Thread 내부적으로 10초 이상이 걸리는 작업을 한다고 치면, 사용자는 그 일이 끝날 때까지 멈춰있는 화면만 보고 있어햐 한다. 그렇기 때문에 개발자는 오래 걸리는 작업들을 외부 Thread를 통해 백그라운드 처리하지 않으면 ANR(Android Not Responding)을 보게 될 것이다.
  • 스레트 통신종류
    • AsyncTask
    • Thread(Looper, Handler)
    • Thread풀
    • 코루틴
    • rxjava
  • AsyncTask deprecated 된 이유 - here
    • 메모리누수(액티비티 종료시점과 어싱크가 끝나는 시점이 다르) 순차 실행으로 인한 속도저하 예외처리 메서드 없음 실행 순서가 보장되지 않음
  • Thread간 통신방법에 대해 설명두 개 이상의 스레드를 사용할 때의 동기화 이슈를 차단하기 위해 Looper와 Handler를 사용
  • Handler를 이용
  • Thread 와 AsyncTask 의 다른점은 무엇인가?
    • 스레드가 수행되기 위해서는, 메인 스레드에서 분리하여 실행된다. 그러나 스레드를 취소하는 것은 우아하게(elegantly) 되지 않는 경우가 많고, 안드로이드 설정이 변경되는 것을 처리할 수 없다. 또한 스레드에서는 UI를 변경할 수 없다. 자바의 메소드이다.
    • AsyncTask 는 5ms 보다도 짧은 작업을 처리 할 수 있다. 또한 스레드와는 다르게 UI를 업데이트 할 수 있는 부분이 있다. 하지만 무겁고 다양한 작업들을 수행한다면 퍼포먼스는 저하된다. 안드로이드 라이브러리에 있는 메소드이다.
  • Handler란?
    • 핸들러는 스레드를 관리하기 위한 객체이다. 핸들러는 메세지를 받거나 처리하는 방법을 정의할 수 있다. 그들을 액티비티 라이프사이클 외에서 사용할 때에는 사용한 뒤 적절히 해제(Cleaned up) 시켜줘야 한다. 그렇지 않으면 메모리 누수(thread leaks)가 발생할 것 이다.
    • 핸들러는 메인스레드와 백그라운드 스레드 혹은 백그라운드 스레드 사이의 커뮤니케이션을 가능하게 한다.
    • 핸들러는 몇초나 몇분 단위로 정기적으로 해야하는 백그라운드 작업을 수행하는데 선호된다.
  • Looper란?
    • Looper는 스레드간의 신호이므로 handler에 보낸다고 해서 곧바로 처리되는 것이 아닙니다. 동시다발적으로 메세지가 발생할 수 있기 때문에 메세지 큐(Message Queue)에 쌓았다가 처리합니다. 큐(Queue)에 들어있는 내용을 하나하나 꺼내 처리하는 놈이 바로 루퍼입니다.
    • 핸들러 스레드인 메인 스레드가 looper를 가지고 있으며 무한 루프를 돌며 큐의 내용을 처리합니다.
  • Thread Pool 이란 ?
    • new Thread() 생성해서 사용
    • 개의 분리된 스레드에서 사용할 때 효율적으로 하는 방법은 무엇일까요 ?
    • Executor의 클래스를 통해 thread 기능별 분리하여 처리
  • background thread 에서 UI thread 접근하는 방식
    • 1) Handler + Looper.getMainLooper()
      • 일반적인 쓰레드간 상호작용하는 방법인 Handler/Looper 이용
      • new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { // UI 스레드 작업 imageView3.setImageBitmap(bitmap); } });
      • 람다식으로 간단하게 표현하면 다음과 같다
      • new Handler(Looper.getMainLooper()).post(() -> imageView3.setImageBitmap(bitmap));
    • 2) Activity.runOnUiThread
      • UI 쓰레드의 메시지큐에 작업을 전달(post)하는 방법 activity 인스턴스에 액세스할 수 있는 경우에 사용
      • runOnUiThread(new Runnable() { @Override public void run() { // UI 스레드 작업 imageView3.setImageBitmap(bitmap); } });
      • 람다식으로 간단하게 표현하면 다음과 같다
      • runOnUiThread(() -> imageView3.setImageBitmap(bitmap));
    • 3) View.post(Runnable) API
      • UI 쓰레드의 메시지큐에 작업을 추가
      • 해당 view 객체에 접근가능한 경우 사용
    • 4) AsyncTask
      • 쓰레드나 Handler에 대한 지식없이 백그라운드 작업 후 UI 쓰레드에서 화면갱신 작업을 처리할 수 있게 코드를 단순화해주는 유틸리티 클래스
      • 이제 안쓰는 방식
  • 서비스와 스레드의 차이점 - here
  • Process LifeCycle - here
  • 멀티스레드를 사용할 때 주의할 점에 대해 설명해주세요.
  • 레드간 통신방법에 대해 설명해보세요.

 

  •  
728x90
반응형