[Android] 기술면접 질문 정리해보기

moKo·2022년 6월 28일
3

Android

목록 보기
12/13
post-thumbnail

여러 블로그의 정보와 실제로 면접을 보면서 받았던 질문들을 바탕으로 안드로이드 직군으로 면접을 보게 되었을 때, 알아두면 좋을만한 내용을 정리했습니다 🙌

Thread

프로세스 내에서 실행되는 실행 단위이다. 다수의 스레드를 사용하여 하나의 프로그램을 동시에 처리하는 것을 다중 스레딩, 멀티 스레드라고 한다.

Program

컴퓨터가 특정 동작을 수행하기 위해 작성된 실행가능한 코드이다. 프로그램 자체는 생명이 없고 보조 기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이다.

OS

컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 프로그램의 모임이다. 처리능력 향상, 신뢰도 향상, 반환시간 단축등의 목적으로 사용한다.

Process

컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이다.

OOP (Object Oriented Programming)

객체지향 프로그래밍을 말한다. 여러 개의 독립된 단위인 객체들간의 상호작용을 통해 프로그램을 만드는 방식으로 코드 재사용이 용이하고 유지보수가 쉽다. 추상화, 캡슐화, 상속화, 다양화의 특징을 가진다.

  • 추상화 : 객체의 관련 속성만 표시하고 불필요한 정보는 숨겨서 인터페이스와 구현을 분리하는 것
  • 캡슐화 : 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것
  • 상속화 : 기존 클래스를 재사용하는 것으로 상위클래스를 하위클래스에서 물려받게 되면 상위클래스의 멤버변수나 메소드를 그대로 물려받아 사용할 수 있게 된다.
  • 다양화 : 부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리

interface

모든 메서드가 추상 메서드로 이뤄진 일종의 클래스를 말한다. 표준화가 가능하고 클래스간 결합도를 감소시킬 수 있어서 사용한다. 정보를 교환하기 위한 수단이나, 방법을 의미한다.

객체

변수, 자료구조, 함수, 메서드, 식별자에 의해 참조된 메모리 상의 값

클래스

멤버 변수와 메서드를 가지는 객체를 만들기 위한 확장이 가능한 코드 양식으로 객체를 정의하는 틀 또는 설계이다.

Instance

클래스의 정의를 통해 만들어진 객체.

Context

Android 시스템에서 구현체를 제공하는 추상클래스로, 애플리케이션 별 리소스 및 클래스 접근에 사용된다. 애플리케이션의 현재 상태를 나타내고, 액티비티와 어플리케이션의 정보를 얻기위해 사용한다.

REST

HTTP URI를 통해 자원을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것. 자원과 자원에 대한 행위, 자원에 대한 행위의 내용으로 구성된다.

HTTP의 인프라를 그대로 사용하여 별도의 인프라를 구축 할 필요가 없고 서버와 클라이언트의 역할을 명확하게 분리한다. 표준이 존재하지 않는다는 단점을 가진다. 다양한 클라이언트의 등장과 여러 디바이스에서도 통신하기 위해 사용한다.

stateless하여 요청간에 클라이언트 정보가 저장되지 않고, 각 요청이 분리되어 있으며 서로 연결되지 않는 특징을 가진다. HTTP 프로토콜을 그대로 사용하므로 HTTP의 특징 중 하나인 캐싱기능을 적용할 수 있다. URI로 지정한 리소스에 대한 조작을 통일되고 한정적 인터페이스로 수행한다.

API

개발자와 api 제공자 사이에 프로그램을 작성하기 위해 만든 인터페이스이다.

REST API

REST를 기반으로 API를 구현한 것으로, 요청을 보내는 주소만으로도 대략 이게 뭘 원하는 요청인지를 알아볼 수 있도록 만든 API이다. 계층관계를 나타낼 때는 슬래시 구분자를 사용하여야 하고, 밑줄은 URI에 사용하지 않고 파일확장자는 URI에 포함하지 않는 등의 규칙을 가진다.

RESTful

REST 원리를 따르는 시스템을 RESTful이란 용어로 지칭한다. CRUD를 모두 POST로만 처리하는 API나 route에 resource, id외의 정보가 들어가는 경우는 RESTful하지 못하다.

CRUD

데이터 처리 기능인 CREATE, READ, UPDATE, DELETE를 묶어서 일컫는 말이다.

URI, URL, URN

리소스를 구분할 수 있는 식별자로 리소스를 식별 할 수 있는 방식은 URL과 URN이 있다. URL은 리소스를 리소스의 경로를 기반으로 식별하는 것이고 URN은 리소스를 리소스의 이름을 기반으로 식별하는 것이다. URL은 스키마라 불리는 프로토콜, 호스트네임, 포트, 추가정보로 이뤄져 있다.

HTTP (Hyper Text Transfer Protocol)

인터넷에서 데이터를 주고받을 수 있는 프로토콜이다. 클라이언트가 브라우저를 통해서 어떠한 서비스를 URI를 통해 서버에 요청하면 서버에선 해당 요청에 대한 결과를 응답하는 형태로 동작한다. 요청 메서드로는 POST(생성), GET(읽기, 받기), PUT(수정), DELETE(삭제)가 있다.

Protocol

통신을 원활하게 수용할 수 있도록 하는 통신 규약

open class

코틀린에서는 클래스와 메서드가 기본적으로 final이기 때문에, 상속이 불가하다. 따라서 어떤 클래스의 상속을 허용하려면 해당 클래스앞에 open 변경자를 붙여야 한다. 그와 더불어 오버라이드를 허용하고싶은 메서드나 프로퍼티 앞에도 open 변경자를 붙여야 한다.

internal class

패키지 전용 가시성에 대한 대안으로 코틀린에서 새롭게 도입한 가시성 변경자로, 같은 모듈 내에서만 볼 수 있으며, 모듈은 한꺼번에 컴파일되는 코틀린 파일들을 의미한다.

data class

데이터 보관 목적으로 만든 클래스를 말한다. 필요한 메서드를 컴파일러가 자동으로 만들어준다.

enum class

열거형 클래스로 서로 연관되거나 관련이 있는 상수들의 집합이다. 자바의 final static과 같은 방식으로 코드의 가독성을 높이고, 구현 의도를 명확히 하기 위해 사용한다.

inner class

클래스안에 또 클래스를 정의하는 것으로, 외부 클래스를 참조할 수 있는 클래스이다. 코틀린에서 클래스안에 다른 클래스를 정의하면 기본적으로 중첩 클래스가 되고, inner를 붙여야 내부 클래스가 된다.

object

코틀린에서 object는 싱글턴 패턴을 적용하여 객체를 한번만 생성하도록 하기 위해 사용하거나 익명 클래스의 생성을 위해 사용한다.

sealed class

추상 클래스로 상속 받는 자식 클래스의 종류를 제한하는 특성을 가진다. 컴파일러에서 sealed class의 자식 클래스가 어떤 것이 있는지 알 수 있다.

접근제한자

코틀린의 접근제한자는 private, public, protected, internal로 이뤄진다.

  • private : 해당 파일이나 클래스에서만 사용을 가능하게 함
  • public : 어디서나 접근할 수 있는데, 함수나 클래스 앞에 아무것도 붙이지 않으면 자동으로 디폴트로 지정되어서 따로 붙일 필요가 없다.
  • protected : 상속받는 인터페이스, 클래스 또는 자식클래스에서만 접근이 가능
  • internal : 같은 모듈 안에서는 다 접근이 가능

property

필드와 접근자를 통칭하는 말로 코틀린에서는 클래스의 변수를 프로퍼티라고 부른다. getter(), setter() 함수가 내장되어 있으며 var로 선언 시, get과 set이 추가되며, val로 선언시 get만 추가된다. 변수에 getter와 setter로 접근하는 이유는 객체지향의 특성인 캡슐화를 지키기 위해 사용한다.

queue

선입선출의 구조를 가지는 자료구조로, 삭제연산만 수행되는 곳을 front, 삽입연산만 이뤄지는 곳을 rear로 정하여 각각의 연산작업만 수행한다. 삽입은 인큐, 삭제는 디큐라고 부른다.

stack

후입선출의 구조를 가지는 자료구조로, 차곡차곡 쌓아올린 형태의 자료구조를 말한다. 같은 구조와 크기의 자료를 정해진 방향으로만 쌓을 수 있고, top으로 정한 곳을 통해서만 접근이 가능하다. 스택이 넘치는 경우를 stack overflow라고 한다.

Mutable과 Immutable 의미와 존재 이유

코틀린의 콜렉션에서 제공하는 두 가지 타입의 interface로, mutable은 변경가능하고, immutable은 변경이 불가능하다. 코틀린은 불변성을 권장하고, 불변성이 중요한 함수형 프로그래밍을 돕기위해서 사용이 된다.

Collection

데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다. map, set, list 등으로 구성되며 mutable과 immutable을 구분하여 지원한다. map은 key와 value값으로 생성할 수 있는 콜렉션이고, set은 순서는 가지지 않지만 중복되는 아이템이 없는 콜렉션이다. list는 데이터가 저장하거나 삭제될 때 순서를 지키는 콜렉션이다.

const val

val은 런타임에 할당되는 반면, const val은 컴파일 시간에 할당되는 상수로 함수나 어떤 클래스의 생성자에도 할당될 수 없고 문자열이나 기본 자료형으로 할당되야 한다.

companion object

동반 객체라는 뜻으로 객체 생성 없이 변수와 메서드등을 선언하여 사용하기 위해 코틀린에서 자바의 static과 같은 역할로 사용하기 위해 쓰인다.

singleton

객체의 인스턴스가 오직 1개만 생성되는 패턴을 말한다. 생성된 객체는 어디서든참조할 수 있다. 메모리 낭비를 방지할 수 있고, 데이터 공유에 용이하여 성능이 향상에 도움이 되어 사용한다. 너무 많은 일을 위임하거나 공유할경우 결합도가 높아진다.

Coupling, Cohesion

결합도와 응집도를 나타내는 단어로, 결합도는 모듈간 상호 의존하는 정도 또는 연관된 관계를 의미한다. 다른 클래스끼리 연관된 정도가 높으면 결합도가 높다고 한다. 결합도는 낮을수록 좋다.

응집도는 모듈 내부의 처리 요소들이 서로 관련있는 정도를 말한다. 즉, 모듈이 독립적 기능을 수행하는지, 하나의 기능을 중심으로 책임이 잘 뭉쳐있는지 나타내며 높은 응집도를 가질수록 좋다.

모듈화

소프트웨어를 각 기능별로 나누는 것을 말하고, 각각의 기능별로 나눠진 모듈화의 결과를 모듈이라 한다. 좋은 모듈화라 함은, 목적에 맞는 기능만으로 모듈을 나누는 것이다. 모듈의 독립성이 높을수록 좋은데 독립성은 결합도가 낮고 응집도가 높을수록 좋다.

생성자

새로운 인스턴스를 만들기 위해 호출하는 함수로 클래스의 인스턴스를 만들어 반환받을 수 있다.

init

매개변수가 없고 반환되는 값이 없는 함수로 생성자를 통해 인스턴스가 만들어질때 호출되는 함수이다.

constructor

보조 생성자로 인스턴스 생성 시 추가적인 구문을 실행할 수 있게 해준다. 사용 시 반드시 기본생성자을 호출하여 초기화하여야 한다.

parameter

함수를 정의할 때 사용되는 변수

메서드

클래스의 행위를 표현하는 것으로, 클래스 내의 함수로 볼 수 있다.

Runnable

실행해야할 메서드를 표현하기 위한 목적으로 만들어진 인터페이스

Handler

특정 메세지를 Looper의 messageQueue에 넣거나, Looper가 messageQueue에서 특정 메세지를 꺼내어 전달하면 이를 처리하는 기능을 수행한다.

Looper

각 쓰레드의 내부에는 messageQueue라는 것이 존재하는데, 해당 쓰레드가 처리해야할 동작들이 메세지라는 형태로 쌓인다. 이 messageQueue에 들어오는 메세지들을 하나씩 꺼내어 이를 적절한 Handler로 전달하는 역할을 한다.

Listener

특정 이벤트를 처리하는 인터페이스로 이벤트 발생 여부를 기다리다가 이벤트 발생 시 해당 이벤트에 맞는 처리를 수행하는 객체. 이벤트 리스너는 사용자와 상호작용하는 이벤트 발생 시 안드로이드 프레임워크의 인터페이스를 호출한다.

Dispatcher

안드로이드 코루틴에서의 dispatcher는 코루틴을 dispatcher에 전송하면 dispatcher가 자신이 관리하는 스레드풀 내의 스레드 부하 상황에 맞춰 코루틴을 배분하는 역할을 한다.

  • Dispatchers.Main : UI와 상호작용하는 작업을 실행하기 위해 메인스레드에서 실행시키는 역할을 한다.
  • Dispatchers.IO : 네트워크 I/O 작업을 실행하는데 최적화 되어있다.
  • Dispatchers.Default : 는 cpu를 많이 사용하는 작업을 기본 스레드 외부에서 실행하도록 최적화 되어 있다.

Coroutine

쓰레드와 기능적으로 유사하지만 좀 더 가볍고 유연한 병렬 프로그래밍 기술이다. 동시성 프로그래밍을 kotlin에 도입한것으로 비동기적으로 실행이 되며, 기존 다중 스레드보다 더 효율적으로 동작한다.

sharedpreference

로컬에 데이터를 저장하기 위해 사용하는데, 대용량은 Room을 사용하고 간단한 것들은 sharedPreference로 저장을 한다. 주로 간단한 로그인이나 테마설정 등에 사용한다.

Clean Architecture

로버트 마틴이 만든 아키텍쳐로, presentation과 domain, data 레이어 아키텍쳐 기반으로 만들어졌다. 서호 의존 관계에 대해 규칙이 정해져 있고 이 규칙은 반드시 외부에서 내부로 향해야 한다. 이렇게 구성함에 따라 각 레이어의 의존성이 낮아져 결합성이 낮아지고 테스트가 쉬워지며 유지보수에 이점이 생긴다.

Presentation에는 화면과 입력에 대한 처리 등 UI관련된 부분을 담당한다. Activity, Fragment, View, Viewmodel을 포함한다. 안드로이드 의존성이 높다.

Domain에는 안드로이드 프레임워크에 의존하지 않는 순수한 모듈이다. Entity, Repository(행동을 담고있는), usecase(행동들의 최소 단위)를 담고있다.

Data에는 domain에서 설계한 repository를 실제로 구현하며, data를 가져오는 api나 room, sharedpreference, entity와 data model의 mapper등을 포함한다.

디자인 패턴

프로그래밍 과정에서 발생하는 문제에 대해 재사용 가능한 해결책을 말한다. 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 템플릿이다.

아키텍쳐

최적화를 목표로 두고 시스템 구성과 동작원리 그리고 시스템의 구성환경등을 설명 및 설계하는 설계도이다.

MVVM

디자인 패턴의 일종으로 model-view-viewmodel로 이루어진다.

view에는 activity와 fragment등이 속한다. 사용자의 action(텍스트입력, 버튼터치)을 받고 viewmodel의 데이터를 관찰하여 ui를 갱신한다.

viewmodel은 view가 요청한 데이터를 model로 요청하고, model한테 요청한 데이터를 받는다.

model은 viewmodel이 요청한 데이터를 반환하고, room등의 db사용이나 retrofit을 이용한 api호출등을 담당한다.

기능별 모듈화가 잘 되어 유지보수에 용이하고 UI업데이트가 간편하다.

ViewModel

라이프 사이클을 고려하여 UI관련된 데이터를 저장, 관리하기 위해 사용한다. 화면 전환과 같이 설정이 변경되는 상황에서도 Data를 유지시킨다. 액티비티가 끝날 때까지 사라지지 않고 view의 생명주기와 별개로 흘러간다.

LiveData

observer패턴을 활용하여, 라이프사이클에 따르며 데이터를 관리해주는데 사용한다. 항상 최신 데이터를 보증한다. 데이터의 변화를 실시간으로 구독자에게 통지할 수 있고 액티비티나 프래그먼트의 라이프사이클을 따라 메모리 릭이 발생하지 않는다.

Observer 패턴

어떤 이벤트가 일어나는 것을 감시하여 특정 이벤트 발생시 어떠한 동작을 즉각 수행하게 해준다. 다른 객체의 상태 변화를 별도의 함수호출 없이 즉각적으로 알 수 있어 효율적인 프로그래밍이 가능하다.

Databinding과 viewBinding

ViewBinding은 레이아웃 내의 위젯에 접근하기 위한 방법으로 기존에 불편했던 findViewById의 대체격으로 사용된다. 뷰의 갯수대로 코드를 추가할 필요가 없어서 편리하고, null safety하다. Databinding에 비해 간단하고 효율이 좋고 용량도 절약되어서 단순히 findViewById를 대체하기 위함이라면 viewbinding을 사용하는게 좋다.

Databinding은 viewbinding의 역할을 하면서 추가로 동적 ui선언, 양방향 데이터 결합도 지원할 수 있는 바인딩이다. 데이터와 뷰를 연결하는 작업을 레이아웃에서 처리한다.

Android 4대 컴포넌트

Android 앱은 컴포넌트로 구성되어 있다. Activity, Service, Broadcast Receiver, Content provieder 이렇게 4가지로 구성된다.

  • Activity : 실제 화면에 보이는 것으로 사용자와 상호작용을 하는 컴포넌트이다. 같은 앱 내의 다른 액티비티 뿐만 아니라 완전히 분리된 다른 앱의 액티비티와도 상호작용이 가능햐다.
  • Service : 화면에 보이지 않고 백그라운드에서 실행된다. 액티비티와 달리 UI도 갖지 않는다. 음악서비스등을 이용할 때, 앱을 계속 켜놓지 않는 것처럼 백그라운드에서 활동하는 역할을 수행한다. Foreground, Background, bound service로 구성된다.
  • Broadcast Receiver : 어떤 이벤트가 발생할 때 시스템 전역에 이를 알리는 것을 브로드캐스트라 하는데 이 브로드캐스트를 수신하는 구성요소를 Broadcast Receiver라 한다.
  • Content Provider : 앱이 자체적으로 저장된 데이터나, 다른 앱들이 저장한 데이터에 대한 액세스 권한을 관리하도록 도와주고 다른 앱들과 데이터를 공유할 수 있도록 해주는 구성요소이다. 다른 앱이 앱 데이터에 안전하게 액세스하고, 이를 직접 수정할 수 있다는 장점을 가진다.

ANR

Application not responding의 약자로 어플리케이션이 응답하지 않는 오류이다. UI쓰레드가 오랫동안 블로킹되면 발생한다. 5초 이상 키 이벤트가 지연되거나 메세지 처리중 사용자가 화면을 두 번 이상 터치하면 발생한다.

JVM

자바 가상 머신으로 자바 기반 어플리케이션을 위해 이식 가능한 실행 환경을 제공한다.

안드로이드 SDK

안드로이드 소프트웨어를 개발하기 위한 툴 킷으로 안드로이드 api와 응용 프로그램 개발에 필요한 각종 도구, 샘플 코드, 관련 문서들이 포함된다.

Garbage Collection (GC)

메모리 관리 기법 중 하나로 프로그램이 동적 할당했던 메모리영역 중 필요없게 된 영역을 해제하는 기능이다. 메모리 영역 가운데 어떤 변수도 가리키지 않는 메모리 영역을 탐지하여 자동으로 해제한다. 메모리 릭을 막을 수 있다.

Activity와 Fragment의 차이점

액티비티는 독립적으로 사용할 수 있지만 프래그먼트는 액티비티에 종속된다. 액티비티는 자동적으로 스택에 넣어지고 프래그먼트는 트랜잭션을 통해서 요청해야 한다.

Annotation

주석이라는 의미를 가지는 것으로, 특정 클래스나 변수, 메소드 등에 붙여서 해당 타겟의 기능을 좀 더 명확히 해주는 역할을 한다.

LayoutInflater

XML에 정의된 자원을 View형태로 반환한다.

Intent

어플리케이션 컴포넌트 간에 작업 수행을 위한 정보를 전달하는 역할로 액티비티간의 화면 전환 작업에도 많이 사용한다.

명시적 인텐트와 암시적 인텐트로 구분할 수 있는데 명시적 인텐트는 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출대상을 확실히 알 수 있는 경우를 말하고 암시적 인텐트는 호출대상의 속성들을 지정했지만 대상은 달라질 수 있는 경우를 말한다.

Bundle

Map형태로 구현된 데이터의 묶음이다. 데이터의 저장 객체로 상태 저장 및 복구에 사용한다. Intent에서 사용하는 putExtra의 Extra가 번들이다.

Android Architecture

안드로이드 아키텍쳐는 Linex Kernel, Libraries, Android Framework, Android Applications의 4가지로 key components로 이뤄진다.

  • Linux Kernel : 메모리 관리, 보안설정, 네트워크 시스템 관리등을 함
  • Libraries and Runtime : 안드로이드 기능 라이브러리와 가상머신의 역할을 하고 모바일 db, 그래픽 등을 담당
  • Android Framework : 생명주기, 환경설정등의 역할을 한다. 대표적으로 GPS, 리소스 관리 등이 있다.
  • Android Applications : 안드로이드에서 기본제공하는 역할을 한다. 전화걸기, 웹브라우저 등

parcelable

Intent를 사용할 때 기본 타입 뿐만 아니라 커스텀 클래스나 오브젝트를 넘겨야할 경우가 많은데 그 경우 단순히 putExtra로 넣어줄 수 없기 때문에 parcelable로 만들어 사용한다.

Manifest

앱의 메인 환경 파일로 앱의 패키지명, 앱에 사용하는 컴포넌트, 권한 등으로 정의된다. 안드로이드의 모든 핵심 구성요소가 정의되며 정의되지 않은 것들은 구성요소로 인식하지 않아 사용할 수 없다.

ORM

ORM은 Out Of Memory의 약자로 메모리 릭이 발생하여 계속 증가하면 발생하는 오류이다. 카비지 컬렉션으로 메모리 릭을 계속 방지해야 발생하지 않는다.
메모리 릭은 액티비티에서 inner class를 사용하거나 handler를 액티비티가 종료된 후에도 사용하는 경우 발생한다.

APK

Android 플랫폼에 배포할 수 있도록 설계된 파일 형식

Application Class

안드로이드의 기본 클래스로 앱에 대한 모든 컴포넌트, 액티비티와 서비스를 포함하는 클래스이다.

View.GONE과 View.INVISIBLE의 차이

GONE은 뷰를 그리지 않고 레이아웃에 공간을 차지하지 않는 상태이고, INVISIBLE은 뷰는 그려져 있고 공간도 차지하지만 보이지만 않는 상태이다.

Gradle

애플리케이션 빌드를 생성하는 자동화 도구이다. 안드로이드 스튜디오는 코드의 편집만 담당하는 것이고 빌드는 Gradle을 통해 모두 수행된다.

DI

의존성 주입이라는 뜻으로, 하나의 객체가 다른 객체의 의존성을 제공하는 기술이다. test를 용이하게 하고 가독성을 높이고 의존도를 낮추기 위해 사용한다.

socket

네트워크를 경유하는 프로세스 간 통신의 접속점으로, 소켓을 통해 클라이언트와 서버 프로그램 사이에 데이터를 송수신할 수 있다.

참고한 블로그 🤝 ( 클릭 시 이동됩니다 )

profile
🔥 Feelings fade, results remain

0개의 댓글