개발/안드로이드

안드로이드 기술 면접에 좋을 자료

림쌍월 2020. 11. 19. 15:04

​뭐 굳이 안드로이드만 쓰는게 아닌 전반적인 개발 관련도 몇가지가 있네요 ..

참고로 안드로이드는 쥬니어만큼도 못하는 정도라 자신이 없습니다.

라떼는 말이야 다 이클립스로만 해서 .. 알아야 했거든!

 

 

[안드로이드의 4대컴포넌트]

> 액티비티(Activity) : 사용자가 앱과 상호작용하는 단일 화면 , UI를 담당하는 컴포넌트, 안드로이드 어플리케이션은 반드시 하나 이상의 액티비티를 가지고 있어야 한다, 두 개의 액티비티를 동시에 Display할 수 없음

> 서비스(Service) : 화면이 없고 백그라운드에서 돌아가는 컴포넌트, 모든 서비스는 Service 클래스를 상속받아서 사용한다. 네트워크를 통해서 데이터를 가져올 수 있다.

> 콘텐트 제공자(Content Provider ) : 데이터를 관리하고 다른 어플리케이션 데이터를 제공해 주는 컴포넌트, 주로 DB의 데이터를 전달할 때 많이 사용하고 생명주기가 없다

> 방송 수신자(Broadcast Receiver ) : 안드로이드에서 다양한 이벤트와 정보를 받아서 반응하는 컴포넌트, UI가 존재하지 않고 디바이스에서 발생하는 일 중에서 어플리케이션이 알아야 하는 상황이 발생하면 알려준다

a. 액티비티 : 화면 관리, 사용자와 상호작용, 이벤트 처리

b. 서비스 : UI 없이 백그라운드에서 기능 처리

c. 브로드캐스트 리시버 : 안드로이드에서 글로벌 이벤트와, 그로 인한 브로드캐스트 메시지를 처리

d. 콘텐츠 프로바이더 : 서로 다른 앱 사이의 데이터 공유를 위한 인터페이스


[객체지향 언어의 뜻과 객체지향의 4대 특징]

> 작은 모듈인 객체들을 조립/생성하여 프로그램을 작성 구현한 것, 객체는 정의 된 클래스를 기반으로 생성된 실체

> 구성요소는 객체, 클래스, 메소드

> 특징 : 캡슐화/추상화/상속/다형성(오버라이딩, 오버로딩)

추상화란 복잡한 현실의 문제를 공통적인 특징을 뽑아서 그룹화 하는 것을 의미합니다. (클래스)

캡슐화란 사용 방법만을 알려주고 내부 구조는 숨겨서 데이터를 보호하는 것을 의미합니다. (추상 클래스, 인터페이스)

상속성은 부모의 기능을 자식이 물려받는 것을 의미합니다.

다형성은 하나의 메소드나 클래스가 이걸 이용하는 방법에 따라서 다양한 방법으로 동작하는 것을 의미합니다.

(인스턴스 생성 후 부모 메소드로 사용하는 경우와 자식 메소드로 사용하는 경우를 예를 듬)


[안드로이드의 테스크]

Task는 어플리케이션에서 실행되는 Activity를 관리하는 스택입니다. 선입 후출의 형태로 나중에 적제된 액티비티가 가장 먼저 사용됩니다. 최초적재된 엑티비티는 Root Activity라고 하고 마지막에 적재된 Activity는 Top Activity라고 합니다.

Flag를 이용하여 엑티비티의 흐름을 제어 할 수 있습니다.


[TDD]

Test Driven Development의 약자, 테스트 주도 개발 방법론

테스트 코드 작성을 시작으로 짧은 개발 사이클을 반복하면서 진행한다.

선 테스트 코드 작성, 후 구현

목표 : 잘 동작하는 깔끔한 코드를 생산하자. 코드의 품질을 높이고 유지보수에 이득을 취하자


[REST]

HTTP란 ?

- HyperText Transfer Protocol의 준말로 링크 기반으로 데이터를 요청하고 받겠다는 것

- 클라이언트와 서버가 요청을 하고 응답을 하기 위해 따르는 프로토콜

- HTML 문서를 주고 받을 수 있음, 뿐만 아니라 이미지, 동영상, 오디오, 텍스트 문서 등을 주고 받을 수 있음

URI와 HTTP Methond를 이용해서 객체화된 서비스에 접근하는 것

서비스에 존재하는 모든 자원(resource 미지, 포스팅, 유저 정보 등)에서 고유한 URI을 부여해서 활용하는 것

장점 : HTTP기반으로 통일하기 때문에 HTTP환경에서는 모든 플랫폼에서 사용 가능

클라이언트와 서버 구조를 명확하게 분리

보안, 로드밸런싱, 암호화 계층을 추가하여 사용 가능(성능향상, 캐싱)

URI를 보고 나타내는바가 무엇인지 쉽게 이해 가능

단점 : 표준이 아니다, HTTP Method의 한계

쓰는 이유 : 다양한 클라이언트(android, ios)들의 등장, 애플리케이션에서 사용하는 자원에 대한 통일성을 위해

*RESTful은 일반적으로 REST 아키텍처를 구현하는 웹서비스를 나타내기 위해 사용 / 웹상에 존재하는 모든 자원에 URI를 부여하여 사용하는 방법이다.

*REST API : HTTP 요청을 보낼 수 있는 환경이라면 어디에서든 이용 가능 한 것


[안드로이드의 메모리 구조]

안드로이드의 메모리구조를 보면 램, 내장메모리, 외장메모리로 구분됩니다.

렘 : 프로그램이 실행될때 상주되는 공간입니다. 평상시에 하드에 저장되어있다가 런타임시에 차지되는 공간을 말합니다.

내장메모리 : 간단하게 하드디스크라고 생각해도 됩니다.

외장메모리 : 메모리가 더 필요할때 추가 할 수 있는 메모리입니다.


[SDK]

SDK, Software Development Kit 소프트웨어 개발 도구 모음

SDK 안에는 개발에 도움이 될 개발 도구 프로그램, 디버깅 프로그램, 문서, API 등이 있다.

EX) Eclipse를 시작하기 전에 JDK를 설치했었다. JDK도 또한 Java용 SDK이다.


[API]

어떠한 응용프로그램에서 데이터를 주고 받기 위한 방법을 의미합니다. 어떤 특정 사이트에서 특정 데이터를 공유할 경우 어떠한 방식으로 정보를 요청해야 하는지, 그리고 어떠한 데이터를 제공 받을 수 있을지에 대한 규격들을 API라고 하는것

EX) 기상청 API

구글에 접속하여 기상청 API라고 검색하면 아래의 그림과 같이 첫번째 페이지에 바로 기상청 오픈 API 제공 사이트가 화면에 노출됩니다. 기상청 API 말 그대로, 기상청에서 수집하고 있는 정보를 사용자에게 쉽게 제공하기 위한 목적으로 만들어진 사이트입니다.


[안드로이드에서는 enum의 사용을 자제시켰는데 그 이유와 장점]

> ENUM의 각 값은 객체이며 각 선언은 객체를 참조하기 위해 런타임 메모리를 사용합니다. 따라서 ENUM 값은 Integer 또는 String 상수보다 많은 메모리를 사용합니다. 단일 ENUM을 추가하면 최종 DEX 파일의 크기 가 증가합니다. 또한 런타임 오버 헤드 문제가 발생하고 응용 프로그램에 더 많은 공간이 필요합니다.

Android에서 ENUM을 과도하게 사용하면 DEX 크기가 증가하고 런타임 메모리 할당 크기가 늘어납니다.

응용 프로그램이 더 많은 ENUM을 사용하는 경우 ENUM 대신 정수 또는 문자열 상수를 사용하는 것이 좋습니다.


[dp와 sp 차이 (px등 도 있음)]

크기 단위의 차이

dp : 물리적인 픽셀의 밀도로부터 독립적 크기

sp : 독립적 크기이지만 텍스트에 적용하기 위해 만들어진 단위

쉽게 위젯의 크기는 dp 텍스트는 sp


[대용량 bitmap을 불러올 경우에 메모리 문제가 있기 쉬운데 이럴 때는 어떻게 처리?]

inJustDecodeBounds 설정하기 - Scaled Down된 버전의 이미지 메모리에 로딩하기 - 이미지 전처리 메소드 생성하기 - ImageView에 출력하기


[ArrayList vs linkedlist]

ArrayList - 데이터 검색에 유리하며, 추가/삭제 시에는 성능을 고려해야함

LinkedList - ArrayList 에 비해 데이터의 추가/삭제에 유리하지만 검색 시에는 성능을 고려해야함

LinkedList는 ArrayList와 비교하여 여러가지 장점을 지니고 있습니다. LinkedList는 몇 개의 참조자만 바꿈으로써 새로운 자료의 삽입이나 기존 자료의 삭제를 위치에 관계없이 빠른 시간안에 수행 할 수 있습니다. ArrayList 같은 경우는 O(N)만큼의 연산 속도가 걸리기 때문에 자료의 최대 개수에 영향을 받지만, LinkedList는 그런 제약을 받지 않습니다. 또한 LinkedList는 무한 개수의 자료를 삽입할 수 있는 반면 (메모리의 용량이 무한정하다고 가정할 때), ArrayList는 크기가 한정되어 있기 때문에 결국 포화 상태에 이르게 됩니다. ArrayList의 크기를 재조정하는 연산을 수행하여 크기를 늘릴 수도 있지만, 상당한 연산량이 요구됩니다.

> ArrayList와 비교한 LinkedList의 장/단점

장점

단점

자료의 삽입과 삭제가 용이하다.

포인터의 사용으로 인해 저장 공간의 낭비가 있다.

리스트 내에서 자료의 이동이 필요하지 않다.

알고리즘이 복잡하다.

사용 후 기억 장소의 재사용이 가능하다.

특정 자료의 탐색 시간이 많이 소요된다.

연속적인 기억 장소의 할당이 필요하지 않다.


[프로세스와 스레드의 차이]

프로세스는 운영체제로 부터 자원을 할당받는 작업의 단위이고 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다.

프로세스는 자신만의 고유 공간과 자원을 할당 받아 사용하지만 그에 반해 스레드는 다른 스레드와 공간과 자원을 공유하여 사용하는 차이가 있습니다.


[listview 와 recyclerview의 차이점]

둘 다 리스트를 나타내는 뷰라는 점은 동일하다. 데이터가 저장되어 있는 아이템들을 화면에서 리스트로 출력해주며 스크롤 기능을 통해 모든 데이터들을 보여준다. RecyclerVIew는 뷰를 재활용한다는 특징을 가지고 있다. ListView는 스크롤을 내려서 새로운 아이템이 화면에 출력될 때마다 새 객체를 생성해야하고 이로 인해 과부하가 온다는 단점이 있어 RecyclerView가 이 단점을 보완하고자 만들어진 뷰이다. 새로운 아이템이 화면에 등장하면 이전에 사용했던 ( 화면 밖으로 사라진) 객체를 재활용하는 방식으로 이 문제를 해결


[멀티스레드]

하나의 프로그램에 동시에 여러개의 일을 수행할 수 있도록 해주는 것

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것

사용 이유

>메모리 공간과 시스템 자원 소모를 줄이기 위해


[onpause/onstop 함수의 차이점]

onPause()는 Activity위에 다른 Activity가 올라오거나 하여 focus를 잃었을 때

onStop()은 Activity가 완전히 화면을 벗어날 때 불린다. 예를 들어 홈키를 눌러 홈화면으로 이동하거나 전화가 와서 화면을 완전히 덮는 경우


[Handler, Thread, Looper]

>백그라운드 처리라는 공통점

Handler란 안드로이드에서 사용할 수 있는 스레드 통신 방법, 핸들러(Handler)는 스레드의 루퍼(Looper)와 연결된 메시지 큐로 메시지를 보내고 처리할 수 있게 만들어줍니다. 메인 스레드의 메시지 처리 흐름에서, 메시지 전달과 처리를 위해 개발자가 접근할 수 있는 창구 역할을 수행한다고 할 수 있죠. 스레드와 연관된 핸들러를 얻기 위해서는, 간단하게 new 키워드를 사용하여 Handler 클래스 인스턴스를 생성하기만 하면 됩니다. 그러면 새로운 Handler 인스턴스는 자동으로 해당 스레드와 메시지 큐에 연결(bound)되고, 그 시점부터 핸들러를 통해 메시지를 보내고 처리할 수 있게 됩니다.

Thread란 프로세스 내에서 "순차적으로 실행되는 실행 흐름"의 최소 단위를 말합니다. 프로그램의 main()함수로부터 시작되는 최초 실행 흐름 또한 하나의 스레드이며, 이를 메인 스레드라고 부릅니다.

Looper는 MessageQueue가 비어있는 동안은 아무 행동도 안하고 메시지가 들어오면 해당 메시지를 꺼내 적잘한 Handler로 전달합니다. 계속 반복적으로 수행하는 동작 때문에 Looper라는 이름이 붙여졌다고 합니다.


[Android APK 구조]

안드로이드 어플리케이션 패키지의 확장자.

lib, res, manifest 등이 존재한다


[

백키로 앱을 종료했을 때 프로세스는 종료되나요 ? 되지 않나요?

종료되면 왜 종료되는지? 종료되지 않으면 왜 종료되지 않는지?

]

종료된다.


[일반 뷰와 SurfaceView의 차이]

SurfaceView는 View를 상속받는 클래스이고 애니메이션이나 동영상같이 연산처리가 많이 필요한 뷰를 위해 사용된다.


[RxJava 간단한 개념]

RxJava란 Reactive Programming 을 하기 위한 라이브러리인 Rx(Reactive Extensions)의 JVM 판 입니다.

RxAndroid

기존 안드로이드 개발에서 큰 문제였던 복잡한 스레드의 사용을 해결하기 위해 사용하는 것

수많은 핸들러와 콜백 떄문에 발생하는 디버깅, 이벤트 중복, 2개의 비동기 처리 후 결과를 하나로 합성하는 작업 등등등... 이 문제점이였음. 하지만 RxJava를 사용하면 간단한 코드로 복잡한 병행 프로그래밍이 가능하며 비동기 구조에서 에러를 다루기가 쉽다.


[Runtime Permission]

마시멜로 이상 단말에서는 앱을 사용하기 전, 해당앱에서 사용 하는 기능들에 대한 사용자의 승인을 받아야 한다. 사용하는 기능이 여러가지가 있으나 그 중 한가지 이상의 사용자 승인을 받지 않거나 사용자가 승인을 거부 했을 경우 해당 기능을 사용하려 할 경우 오류 발생으로 인한 강제 종료 현상이 발생할 수도 있다. 물론, 승인 거부를 한 경우에 해당 기능을 앱 내부에서 사용하지 못하도록 막을 경우 오류로 인한 강제 종료 현상이 발생하지 않는다.

위험한 권한그룹에는 주소록 접근, 카메라 접근, 외부 저장소 접근 등이 있다.


[백그라운드 작업을 할 때, 안드로이드에서 사용할 수 있는 방법]

Handler, AsyncTask


[Activity Class를 이용해서 백그라운드 스레드를 돌릴 수 있는 방법]

runOnUIThread


[오버로딩/오버라이딩 차이점]

오버로딩은 같은 메소드 이름으로 둘 이상의 메소드를 만들어 다른 타입의 파라미터를 가지도록 하여 기능을 적재하는 기법.

예를 들어 우리가 쉽게 쓰는 System.out.println을 생각해보자. 우리는 파라미터로 String, int 등 다른 타입의 변수를 넣었을 떄도 모두 출력할 수 있다. 굳이 System.out.printlnString, System.out.printInt 이렇게 된 메소드를 사용해야하면 귀찮을 것이다. 따라서 System.out.println 이라는 하나의 메소드로 그 안에는 다양한 기능이 오버로딩 되어있고, 우리는 편하게 하나의 메소드 이름으로 쓸 수 있는 것이다.

오버라이딩은 상위 클래스를 상속받아 하위 클래스에서도 그 메서드를 재정의하여 쓸 수 있는 기법이다. 예를 들어 object에서 toString을 오버라이딩하여 사용하는 것!

쉽게 말해 오버로딩은 메소드 중복 선언, 오버라이딩은 상위 클래스에서 하위 클래스로 상속된 메소드의 재정의라고 볼 수 있다.


[github 사용하시나요 ? 사용하면 어떤 프로젝트를 진행했나요]

Yes


[액티비티를 실행했을 때 호출되는 생명주기]

온크리에잇 온스타트 온리쥼

onCreate(최초로 생성될 때1번 호출) -> onStart(뷰가 화면에 보이기 직전) -> onResume(사용자 상호작용을 하기 직전, 혹은 화면이 다시 포커스를 얻었을 때) -> Running -> onPause(일부 타 UI에 의해 화면이 가려져 해당 액티비티가 포커스를 잃었을 때) -> onStop(화면이 완전히 가려졌을 때) -> onDestory(액티비티의 종료 직전)


[ FrameLayout, LinearLayout, RelativeLayout, TableLayout, GridLayout, ConstraintLayout ]

FrameLayout : 무조건 좌측 상단에서 시작해서 레이아웃을 겹쳐서 보이게 하는 레이아웃

LinearLayout : 위젯의 배치의 자유도는 떨어지는 대신의 모바일 특유의 깔끔한 배치를 사용가능(orientation)

RelativeLayout : 특정 위젯과 위젯의 관계를 정하고 그 차이를 정해서 레이아웃을 배치한다.

TableLayout : Table을 만드는 레이아웃, 행만 자유도가 있다. 테이블 열을 넣어준 후 위젯을 넣어준다. (layout_column이용)

GridLayout : TableLayout 이랑 거의 흡사하다. 다르점은 행과 열 모두 자유도가 높다.

ConstraintLayout : RelativeLayout과 거의 흡사. 더 직관적이고 무조건 연결해야함.

가로축과 세로축을 한개씩은 연결해줘야만 오류가 안 난다.


[모바일 앱 개발시 데이터를 현재 Activity에서 이전 Activity로 값을 어떻게 보내야하는가?]

onActivityResult함수 생성해서 put.Extra로 보냅니다.


스트링을 파라미터로 받아서, 그것을 역순으로 리턴하는 함수를 코딩해보세요.

 


[만약 앱을 사용하는 도중에 카카오톡 메시지가 온다면 사용하던 앱의 TopActivity의 생명주기는 어떤 상태가 되나요?]

- onPause 상태가 됩니다.


[onRestart는 언제 호출이 되나요?]

Activity가 중지 상태에서 다시 화면에 표시되기 직전에 호출됩니다.

onRestart->onStart->onResume-> ActivityRunning..


[ 리스트뷰에서 사용되는 뷰홀더(ViewHolder Pattern) 패턴에 대해서 아시는 만큼 설명해주세요. ]

리스트뷰에서 리스트의 개수가 많은 상황에서 findViewById를 통한 XML 리소스 접근이 빈번할 경우 성능저하가 발생하기 때문에 View 객체를 ViewHolder에 홀드시켜 성능을 개선하기 위한 패턴입니다.


[인텐트(Intent)에 대해서 설명해주세요. ]

- 인텐트는 안드로이드 시스템에서 커뮤니케이션을 담당하는 역할로

컴포넌트간(Activity, ContentProvider, BroadcastReceiver, Service) 의

호출과 메시지 전달에 이용한다. 쉽게 말해서 값을 주고 받는

전달자 정도로 생각 하시면 됩니다.


[프로젝트 진행시 활용한 오픈소스나 라이브러리는 어떤 것들이 있나요?]

NEWS OPEN API


[REST API]

>REST 기반으로 서비스 API를 구현한 것

>최근 OpenAPI(누구나 사용할 수 있도록 공개된 API: 구글 맵, 공공 데이터 등), 마이크로 서비스(하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처) 등을 제공하는 업체 대부분은 REST API를 제공한다.


[OpenAPI]

OpenAPI는 주로 지도 앱, 로그인, 연락처 갱신 등 여러 유형으로 활용할 수 있기에 OpenAPI를 사용할 수 있냐 없냐에 다라서 개발을 진행하는 안드로이드 앱의 퀄리티가 달라진다.


[Call by Value와 Call by Reference란 무엇인지에 대해 설명해주시고 자바는 Call by Value인지 Call by Reference인지 설명해주세요.]

- 기본형을 넘겨줄 경우에는 Call by Value가 발생하며 배열이나 클래스객체 경우에는 Call by Reference가 발생합니다.


[Context의 의미]

안드로이드 시스템 상, 어플리케이션과 관련된 정보를 관리하는 주체는 ActivityManagerService라는 독립된 또 다른 어플리케이션인데, 이 어플리케이션은 특정 앱에 대한 정보를 key:value 쌍으로 구성한다. 이 때 ActivityManagerService에서 내 앱과 관련된 value값을 찾기 위한 key를 알아야 하는데, 이 값이 Context이다. 즉, 내가 어떤 어플리케이션을 나타내고 있는지 알려주는 ID 역할을 한다고 보면 된다.


[ListView와 RecyclerView의 차이점]

ListView의 경우 각각의 item이 스크롤을 통해 inflate될 때마다 view의 create가 발생, findViewById가 함께 호추되어, 메모리 및 성능에 악영향을 끼칠 수 있다. 반면 RecyclerView의 경우 viewHolder 패턴을 강제해 itemview가 root로 단 1번만 생성되어 view의 재사용을 가능하게 해주며, item의 Animator를 이용할 수 있도록 해준다.


[쓰레드간 통신]

a. Java IO에서 제공하는 파이프를 통한 방법 : 파이프는 정확히 말하면 '프로세스'간 통신 방법에 해당

b. 쓰레드는 프로세스 내부에서 data와 heap 메모리 영역을 공유하므로, 해당 영역에 할당된 변수를 활용해 통신.

c. Synchronized를 활용한 시그널링 : 동기화 문제를 해결하기 위한 lock(semaphore)과 같은 느낌.

d. BlockingQueue를 이용.


[Looper / Handler]

a. 멀티 쓰레드 환경에서, 쓰레드간 통신은 송신자가 송신처리를 하는 그 순간 처리될 수가 없다. 복수의 쓰레드로부터 동시다발적으로 생성되는 메시지의 동기화 문제가 발생하기 때문이다. 따라서 안드로이드에서는 송신자 쓰레드로부터 sendMessage()가 발생하면, 해당 메시지를 메시지 큐(Message Queue)에 넣고 처리한다.

b. Looper : 이 때 무한 루프를 돌면서 큐의 상태와, 현재 시스템 리소스의 점유 상태를 지속적으로 체크하고 조건이 맞을 때 마다 큐에서 pop하여 처리해주는 역할을 하는 주체가 필요한데, 이를 Looper라고 부른다.

c. handler : 쓰레드로부터 송신받은 Message, 혹은 Runnable 객체를 수신하고 관리하는 역할을 한다.


[Manifest 파일]

a. manifest 태그 : 앱 패키지명, 버전 등

b. application : 앱 이름, 앱 아이콘 등

c. activity : 액티비티 명, 액티비티 이름, 하위 태그로는 intent-filter 태그로 액티비티 인텐트 작업에 대한 action과 category를 사전 정의 -> 묵시적 인텐트 호출 및 서비스에서 활용.

d. permission : 앱에서 필요로 하는 권한 정의


[Fragment 생명 주기]

onAttach -> onCreate -> onCreateView(LayoutInflater가 xml파일을 찾아서 view들을 java.R파일에 주소로 맵핑시키고, 바인딩시켜줌) -> onPause -> onStop -> onDestoryView


[안드로이드 태스크(Task)란?]

액티비티의 묶음 이며 액티비티를 Stack형태로 관리

- 최초의 액티비티 RootActivity

- 마지막 액티비티 TopActivity(화면에 보여지는 액티비티)

- 서로다른 어플리케이션의 액티비티가 혼합될 수 있어 어플리케이션의 경계가 없음

- Flag를 사용하여 Task내의 액티비티 흐름을 제어


[플래그 (Flag)]

액티비티 중복과 같은 흐름을 제어 하기 위해서 사용

- Manifest 에서 사용

android:launchMode = ["standard" | "singleTop" | "singleTask" | "singleInstance"]

- 소스코드(Intent addflag)에서 사용

FLAG_ACTIVITY_SINGLE_TOP FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_MULTIPLE_TASK

- FLAG_ACTIVITY_NEW_TASK

새로운 태스크를 생성하여 그 태스크안의 액티비티를 추가

But 동일한 어피니티가 있다면 새로 생성하지 않고 존재하는 태스크안에 추가

- FLAG_ACTIVITY_MULTIPLE_TASK

FLAG_ACTIVITY_NEW_TASK와 함께 사용해야하며 무조건 새로운 TASK를 생성하며 그 안에 root 액티비티가 활성화

- FLAG_ACTIVITY_SINGLE_TOP & launchMode = "singleTop"

하나의 인스턴스만 사용 한다는 뜻 , 활성화될 task의 top에 같은 액티비티가 존재할경우 액티비를 탑으로 올리지 않고 기존의 탑을 재사용


1. 액티비티 생명주기에 대해 말씀해보시겠어요?

 

onCreate() -> onStart() -> onResume()

- (액티비티 미실행 상태) – 앱아이콘 클릭 – 액티비티 최초 실행

- (최근 앱 목록 표시 중, 액티비티는 미실행 상태) – 액티비티 선택 – 액티비티 실행

onRestart() -> onStart() -> onResume()

- (액티비티 foreground 상태에서 화면 잠김 상태) – 화면 잠금 해제(홈이나 전원 버튼, 필요하다면 비밀번호 입력

등) – 액티비티 실행

- (액티비티를 실행한 적이 있으며 숨겨져 있는 상태) – 액티비티 실행(앱 아이콘 클릭 등) – 액티비티 실행

onPause()만 호출되는 경우

- (액티비티 foreground 상태) – 다른 액티비티 실행

onPause() -> onStop()

(액티비티 foreground 상태) – 전원 버튼 누르기 – 화면 잠금

(액티비티 foreground 상태) – 홈 버튼 누르기 – 런쳐 홈으로 이동

onPause() -> onStop() -> onDestroy()

(액티비티 foreground 상태) – 뒤로가기 버튼 눌러 액티비티 나가기

onDestroy()만 호출되는 경우

(최근 앱 목록 표시 중) – 액티비티 제거하기(밀어내기나 ‘X’ 버튼)

액티비티를 실행한 적이 있다는 말의 의미는, 액티비티 컴포넌트가 소멸되지 않고 메모리에 상주하고 있어

재사용될 수 있다는 의미다.

하지만 많은 앱을 실행시켜 메모리에 과부하 위협이 있으면 OS 자체에서 오래된 앱 순서대로 강제 종료시킨다.

메소드

설명

다음 메소드

onCreate()

액티비티가 생성될 때 호출되며 사용자 인터페이스 초기화에 사용됨.

onStart()

onRestart()

액티비티가 멈췄다가 다시 시작되기 바로 전에 호출됨.

onStart()

onStart()

액티비티가 사용자에게 보여지기 바로 직전에 호출됨.

onResume() 또는 onStop()

onResume()

액티비티가 사용자와 상호작용하기 바로 전에 호출됨.

onPause()

onPause()

다른 액티비티가 보여질 때 호출됨. 데이터 저장, 스레드 중지 등의 처리를 하기에 적당한 메소드.

onResume() 또는 onStop()

onStop()

액티비티가 더이상 사용자에게 보여지지 않을 때 호출됨. 메모리가 부족할 경우에는 onStop() 메소드가 호출되지 않을 수도 있음.

onRestart() 또는 onDestroy()

onDestroy()

액티비티가 소멸될 때 호출됨. finish() 메소드가 호출되거나 시스템이 메모리 확보를 위해 액티비티를 제거할 때 호출됨.

없음


[프래그먼트와 액티비티의 차이점]

액티비티는 어플리케이션의 컴포넌트로 앱이 사용자에게 보이도록 구성되는 화면이고

프래그먼트는 동작 또는 액티비티 내에서 사용자 인터페이스의 일부로 분할된 화면들을 독립적으로 구성하거나 분할된 화면들의 상태를 관리하기 위해 사용한다. 프래그먼트는 항상 액티비티 위에 올라가있어야 한다.

프래그먼트는 동작 또는 액티비티 내에서 사용자 인터페이스의 일부를 나타낸다. 여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러개인 UI를 구축할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있다. 자체 수명 주기를 가지고, 자체 입력 이벤트를 받으며, 쉽게 말하자면 액티비티 실행 중에 추가 및 제거가 가능한 액티비티의 모듈식 섹션이라고 생각하면된다.

하나의 액티비티에서 여러가지의 화면을 보여주고 싶을 때 사용되는게 프레그먼트로 태블릿화면 구현하거나 여러 프래그먼트를 혼합하여 페이지 하나를 구성, 액티비티를 분할하여 화면의 일정부분은 프래그먼트로 구현하는 등 재 사용성이 높다.


​[어댑터와 뷰홀더]

Adapter(어댑터) : 데이터의 원본을 받아서 관리하고, 뷰가 출력할 수 있는 형태로 데이터를 가공한 뒤 뷰에 제공하는 중간 객체

ViewHolder(뷰홀더) : 각 뷰들을 보관하는 홀더 객체, convertView를 처음 생성할 때, 미리 뷰를 전개하여 View의 태그에 참조객체를 저장


[스레드에 대해 설명해보시겠어요?(AsyncTask나 AsyncLoader에 대해 설명해보시겠어요?)]

스레드란?

하나의 프로세스(프로그램 실행 단위)에서 동작하는 여러 실행 흐름으로 하나의 프로세스에선 기본 한개의 스레드가 존재하고 그걸 메인스레드라 칭한다.

안드로이드의 메인 스레드는 ui 구성에만 사용되기 때문에 네트워킹(api호출), 이미지 다운로드 상황에선 메인스레드를 이용하면 anr이 발생되게 된다. 그러므로 별도의 쓰레드를 실행시켜서 사용해야한다.

AsyncTask는 그러한 백그라운드 스레드를 좀 더 쉽게 구현하기 위한 클래스로 AsyncTask를 상속받아

doinBackground()함수를 통해 execute()로 호출하여 스레드를 생성할 수 있다.


[퍼미션에 대해 설명해보세요]

안드로이드 6.0 마시멜로우 버전 이후부터 생긴 정책으로 사용자의 개인정보에 해당 될 수 있는

gps, 카메라, 핸드폰 내,외부 저장소 접근, 주소록 등에 앱이 접근하기 위해선 사용자로부터 권한을 획득 해야합니다.

1. contextCompat.checkSelfPermission() 함수를 통해 과거에 권한획득을 했었는지의 여부를 체크한 뒤

2. shouldShowRequestPermissionRationale() )를 통해 사용자로부터 권한 여부에 대한 ui를 제공하고 그로부터 획득하거나 거절된

정보를

3. requestPermissions()에서 처리합니다.


[서버와 통신할 때 POST나 GET 이라는 말을 들어보셨나요? 혹시 설명하실 수 있나요? (HTTP 통신에

대해 설명해보세요)]

get과 post는 http 프로토콜을 이용해서 서버에 전달할 때 사용되는 방식으로

get은 정보들을 요청 url에 붙여서 전송하는 방식,

post는 정보들을 요청 url의 body에 붙여서 전송하는 방식으로

post방식은 보통 로그인등과 같이 보안이 요구되는 상황에 사용된다.

get과 post가 url body에 정보를 입력하거나 안하거나 차이이기도 하지만

처음 생성목적은 get은 서버로부터 db정보를 select 처럼 가져오기만 하는 방식에 추천되는 방식이고,

post는 서버로부터 db 정보들을 변경하거나 삭제, 삽입 insert, delete, update를 하기 위해 추천되는 방식이다.

서로의 역할에 충실하면 좀 더 나은 퍼포먼스를 가질 수 있다.


[사용해본 라이브러리가 있다면 이야기하고 대략적으로 설명해보세요]

- Retrofit 2

REST API와의 인터페이스를 위한 자신만의 Type-Safe HTTP 라이브러리를 개발하는것은 정말 고통스러울 수 있습니다. Connection 만들기, 캐싱, 실패한 요청 다시 시도, 스레딩, Response 파싱, 에러 핸들링등과 같은 많은 기능을 처리해야합니다. 반면, Retrofit은 매우 좋은 설계가 되어있고 문서화, 테스트가 되어있어 귀중한 시간과 고통을 줄여주는 검증 된 라이브러리입니다.

출처: https://yoo-hyeok.tistory.com/79 [유혁의 엉터리 개발]

retrofit은 앱과 서버 간의 http 접근을 위해 사용되는 라이브러리로 안드로이드에선 외부 db에 접근이 불허되어 있어 retrofit을 사용해서 서버를 통해 db에 접근합니다.

retrofit을 활용하여 비동기, 동기로 서버에 접근하기 용이하며, retrofit의 enqueue함수를 통해 비동기처리가 편리하게 가능합니다. 또한 request, response방식은 json구조로 진행되며 retrofit에서 제공되는 gson을 활용하여 dto형태로 json정보들을 처리할 수 있습니다.

-Glide

안드로이드에서 url 이미지를 띄워주기 위해선 따로 url 이미지를 비트맵으로 변환해주는 과정이 필요하다

하지만 그 비트맵으로 변환해주는 과정도 백그라운드 스레드를 사용해야하며 만약 url주소가 변경되어 이미지의 위치를 알 수 없을 때는 에러를 발생시키기도 한다

이러한 복잡한 상황을 해결하기 위한 라이브러리로 자체 함수를 통해 백그라운드 실행해서 비트맵으로 변환해주고 메모리 초과를 방지해준다.


[SharedPreference에 대해 설명해보세요]

개발을 진행하다 보면, 앱의 데이터들을 저장하여 관리해야 할 상황에 직면하게 되는데요. 데이터의 양이 많거나 중요한 데이터라면 서버나 DB, 파일의 형태로 저장을 하면 되겠지만, 간단한 설정 값이나 문자열 같은 데이터들은 DB에 저장하기에는 부담스럽고 애매한 경우가 있습니다. 이런 경우 안드로이드에서 기본적으로 제공되는 SharedPreferences를 사용하여 데이터를 관리한다면 좀 더 편리하게 사용이 가능합니다.

SharedPreferences는 데이터를 파일로 저장을 하는데요, 파일이 앱 폴더 내에 저장되므로 앱을 삭제하시면 당연히 데이터도 삭제됩니다.

앱에 저장되는 것으로 앱을 삭제시엔 저장된 내용이 삭제되고 또한 보안에도 매우 취악하기 때문에 정말 간단한 정보만 담고 있는 게 좋습니다

저장 위치 :

data/data/(package_name)/shared_prefs/SharedPreference


[출처] Android 기술 면접 대비 FAQ 정리|작성자 디어