Android Manifest 란
모든 앱 프로젝트에 반드시 있는 파일이다
애플리케이션의 정보들을 가지고 있어 앱에 대한 필수적인 정보를 안드로이드 빌드 툴과 Android OS, 그리고 구글 플레이에 제공한다
컴파일 타임
소스코드를 컴파일을 통해 기계어코드로 변환해 실행 가능한 프로그램을 만드는 과정
런 타임
컴파일된 프로그램을 실행했을 때
제네릭 설명
Class 내부에서 사용할 데이터의 타입을 외부에서 지정을 하는 기법
MVVM ViewModel과 AAC ViewModel 차이점
MVVM ViewModel은 View와 Model을 바인딩해주는 역할을 하고 AAC ViewMdoel은 수명주기를 고려해 UI 관련 데이터를 저장하고 관리한다
생명주기 설명
상태변화가 생길때마다 생명주기 메서드를 호출해 알려줍니다
Activity
onCreate : 생성할 때
onStart : 시작됐을 때
onResume : 사용자와 상호작용할 때, 다시 재개되었을 때
onPause : 포커스가 떠났을 때
onStop : 완전히 화면을 가릴 때
onDestroy : 완전히 종료됐을 때
Fragment
onCreate : 생성할 때
onCreateView : 프래그먼트 인터페이스를 처음 그리기위해 호출
onStart : 시작됐을 때
onResume : 사용자와 상호작용할 때, 다시 재개되었을 때
onPause : 포커스가 떠났을 때
onStop : 완전히 화면을 가릴 때
onDestroy : 완전히 종료됐을 때
안드로이드 4대 컴포넌트 란
액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더
액티비티는 화면에 보여지는 view에 관련된 컴포넌트
서비스 - 사용자에게 인터페이스를 제공하지 않고 백그라운드에서 오래 실행되는 작업을 수행
브로드캐스트 리시버 - 단말기 안에서 이루어지는 수많은 일들을 대신해서 알려줌
콘텐트 프로바이더 - 앱과 앱 저장소 사이에서 데이터 접근을 쉽게 하도록 관리해주는 클래스
액티비티와 프래그먼트 설명
프래그먼트는 유연한 UI, UX 구현이 가능하고 관심사 분리를 통해 재사용성이 높아집니다.
또 프래그먼트는 액티비티에 비해 가볍고 데이터 공유가 쉽습니다.
하지만 프래그먼트 단독으로 존재할 수 없기때문에 액티비티와 적절히 사용하면 좋은 시너지를 낼수 있을겁니다
Room과 SharedPreferences 비교
SharedPreferencse는 key와 value로 이루어져 있고 중복 key값이 들어올수 없다, 단순한 정보에 적합하다
Room은 중복 키값을 가지는 정보를 여러개의 행으로 저장할 수 있다, 방대한 양의 정보에 적합하다
lateinit과 lazy 비교
둘다 초기화를 지연해 주는 용도입니다
lateinit은 var 프로퍼티만 사용 가능하고 그렇기 때문에 언제든 초기화를 변경할 수 있고 널을 통한 초기화를 할 수 없으며 원시타입에는 사용할 수 없습니다
lazy는 val 프로퍼티만 사용가능하고 그렇기 때문에 값 변경이 불가능하고 호출 시점에 초기화됩니다
Context 란
애플리케이션의 현재 상태를 나타내고 액티비티와 애플리케이션의 정보를 얻기 위해 사용할 수 있습니다
interface와 abstract class 비교
인터페이스와 추상클래스는 모두 구현부분이 없게 만들 수 있고 객체를 생성할 수 없습니다
둘 다 하나 이상의 추상 메서드나 프로퍼티를 가져 상속받았을 시 반드시 오버라이드 해야 합니다
차이점은 추상클래스는 생성자를 가질 수 있습니다 (클래스의 특징과 인터페이스의 특징을 각각 가지고 있음)
인터페이스는 다중 상속이 가능하지만 abstract class는 다중상속이 가능하지 않습니다
클래스, 오브젝트(객체), 인스턴스 설명
클래스는 오브젝트를 생성하기 위한 설계도입니다
오브젝트는 클래스에 선언된 그대로 생성된 실체입니다
인스턴스는 설계도에 의해 소프트웨어 세계에 구현된 구체적인 실체입니다
동시성(병행성), 병렬성 설명
동시성은 2개 이상의 작업을 교차하며 진행해 동시에 진행하는 것처럼 보이는 것을 의미합니다
병렬성은 실제로 2개의 작업을 같이 진행하는 것을 의미합니다
동기, 비동기 설명
동기는 함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속 확인하면서 신경쓰는 것 입니다
비동기는 함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행하지만 함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는 것 입니다
블로킹, 논블로킹 설명
블로킹은 A함수에서 B함수를 호출했을 때 코드의 제어권을 넘겨주어 A함수는 코드 실행을 멈추고 B함수가 실행됩니다. 그리고 B함수가 끝났을 때 제어권을 돌려받아 A함수 코드를 실행하는 것입니다.
논블로킹은 A함수에서 B함수가 호출되어도 제어권을 그대로 자신이 하던일을 하는것을 의미합니다
동기, 비동기와 블로킹, 논블로킹 차이 설명
동기와 비동기는 호출된 함수의 완료를 누가 신경쓰냐가 관심사입니다
블로킹과 논블로킹은 호출된 함수가 바로 리턴하냐 안하냐가 관심사입니다
동기, 비동기, 블로킹, 논블로킹 조합 설명 (어떤게 효율이 좋고 나쁜지도)
프로세스와 스레드 설명
프로세스는 운영체제로부터 자원을 할당 받은 작업 단위이고 스레드는 프로세스가 할당받은 자원을 이용하는 실행 단위입니다
교착 상태 설명
두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 의미합니다
Rx를 쓰면 좋은 점
반응형 프로그래밍을 사용할 수 있게 도와줍니다
비동기 처리를 효율적이게 할수 있습니다
콜백 지옥을 탈출할 수 있습니다
Rx를 쓰면 좋은 점 꼬리질문 - 반응형 프로그래밍 설명
주변 환경과 끊임없이 상호작용을 하는 프로그래밍을 의미합니다
환경이 변하면 이벤트를 받아 동작하는 프로그래밍 기법입니다
코루틴을 쓰면 좋은 점
동시성 프로그래밍을 지원합니다
비동기 처리를 쉽게 도와줍니다
경량 스레드라 불리며 가볍습니다
Rx, 코루틴 비교
코루틴은 Rx에 비해 이해하기 쉽다
만약 프로젝트가 kotlin으로만 이루어져 있으면 코루틴 사용
기존에 Rx를 사용하거나 java가 들어있거나 아키텍처가 리액티브 스트림 기반이라면 Rxjava 사용
라이브러리와 프레임워크 차이
라이브러리는 소프트웨어를 개발하기 쉽게 어떤 기능을 제공하는 도구들
프레임워크는 특정 프로그램을 개발하기 위한 여러 요소들과 메뉴얼인 룰을 제공하는 프로그램
비즈니스 로직이 뭔가?
UI를 제외하고 보이지 않는 곳에서 처리하는 로직을 뜻합니다
MVP Presenter와 MVVM ViewModel의 차이
Presenter는 인터페이스를 이용해 view를 직접 참조하고 ViewModel은 view를 직접 참조하지 않습니다(바인딩해줌)
Repository 패턴이란 무엇이고 장점은 무엇인가?
데이터의 출처와 관계없이 동일 인터페이스로 데이터에 접속할 수 있도록 만드는 것을 레포지토리 패턴이라고 한다
장점으로는 도메인과 연관된 모델을 가져오기 위해 dataSource가 몇 개가 필요한지 클라이언트는 알 필요가 없어 부담이 없다, 또한 DataSource의 변경이 일어나도 다른 계층은 영향을 받지 않는다
Intent란?
컴포넌트 간의 정보 전달 역할을 한다, 명시적 인텐트와 암시적 인텐트로 나뉘는데 명시적은 호출될 대상을 확실히 알 수 있는 경우이고 암시적은 호출될 대상이 달라질 수 있는 경우이다
리스트뷰와 리사이클러뷰 비교
리스트뷰는 아이템을 생성할때 각각 모두 바인딩 해 주는것이고 리사이클러뷰는 viewHolder를 강제해 아이템을 한번 바인딩해주고 그 뒤로 재활용해 사용한다
리사이클러뷰의 어댑터 란?
리사이클러뷰에 표시될 아이템 뷰를 생성하는 역할을 합니다
xml, view가 그려지는 과정은?
1. measure(매저) : 뷰의 크기를 결정합니다, onMeasure 호출
2. layout : 뷰와 자식뷰들의 크기, 위치를 결정합니다, onLayout 호출
List, Set, Map 비교
list는 순차적이며 중복이 허용합니다
Set은 순차적이지 않은 집합이고 중복을 허용하지 않습니다
Map은 key-value로 이루어져있고 key는 중복이 가능하지 않습니다
오버로딩 오버라이딩 설명
오버로딩은 같은 이름의 메소드가 2개이상 존재하여 서로 다른 타입의 파라미터를 가지게 하는것
오버라이딩은 상위 클래스에서 상속받은 메소드를 하위 클래스에서 재정의 하여 쓸수 있는것
Thread, Looper, Handler 설명
스레드는 하나의 독립적인 실행 흐름입니다
루퍼는 스레드에서 무한히 돌면서 메시지큐에 message나 runnable이 들어오면 차례대로(선입선출)로 핸들러에 전달합니다, 루퍼는 메인 스레드에는 자동 생성되지만 다른 새로 만든 스레드에는 자동 생성되지 않습니다
핸들러는 메시지큐로부터 받은 메시지나 런어블을 처리하거나 다른 스레드로부터 받은 message를 메시지큐에 넣습니다
Main 스레드만 UI를 접근 가능한 이유
스레드에서 동시에 UI를 컨트롤 하게 될경우 어느 스레드의 동작을 수행해야할지 예측할 수 없고, 둘 중 하나의 동작은 버려지기 때문입니다
Thread, Looper, Handler 설명 꼬리질문 - Message, Runnable 설명
메세지는 스레드 간 통신할 내용을 담는 객체이다
러너블은 해당 핸들러 스레드가 실행할 run() 메서드와 실행코드를 담는다
Task 설명
액티비티의 묶음이며 액티비티를 스택형태로 관리한다
Task 설명 꼬리질문 - 스택 설명
데이터의 입력과 출력의 순서가 후입선출입니다
ViewHolder 패턴 설명
각 뷰의 객체를 ViewHolder에 보관해 뷰의 내용을 업데이트하기 위한 findViewById 메소드 호출을 줄여 효과적으로 퍼포먼스 개선 을 할 수 있는 패턴입니다
쓰레드간 통신방법 설명
java IO에서 제공하는 파이프를 이용하는 방법
스레드간 공유 메모리를 통한 접근 방법
동기화를 이용한 시그널링
블로킹큐를 이용
dp, sp 설명
위젯은 dp를 사용하고 텍스트는 sp를 사용한다
TDD 설명
Test Driven Development의 약자, 테스트 주도 개발 방법론이다
선 테스트 코드 작성, 후 구현을 한다
CI/ CD 설명
CI는 지속적인 통합
CD는 지속적인 배포
REST API, Restful API 설명
REST API란 REST의 특징을 기반으로 서비스 API를 구현한 것입니다
REST란 자원을 이름으로 구분해 해당 자원의 정보를 주고 받는 모든 것을 의미합니다
Restful API는 REST의 설계 규칙을 잘 지켜서 설계된 API를 말합니다
플래그(flag) 설명
액티비티 중복과 같은 흐름제어를 하기위해 사용한다
객체지향 설명
필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다
구성요소는 객체, 클래스, 메소드로 이루어져있고 특징은 갭슐화, 추상화, 상속, 다형성이 있습니다
클래스 : 문제를 해결하기 위해 추상화를 거쳐 집단에 속하는 속성, 행위를 변수와 메서드로 정의한 것
객체(인스턴스) : 클래스에 정의된 것을 토대로 실제 메모리에 할당된 데이터
추상화 : 공통적인 특징을 뽑아서 그룹화 하는 것
(객체지향 3요소)
캘슐화 : 클래스 내에서 사용할 속성은 숨기고 객체가 수행할 기느은 공개하는 것
상속 : 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것
다형성 : 메소드나 클래스가 이용하는 방법에 따라 다양한 방법으로 동작하는 것을 의미 (오버로딩과 오버라이딩)
객체지향의 5원칙 SOLID(솔리드) 설명
SRP(Single Responsibility Principle): 단일 책임 원칙 - 모든 클래스는 각각 하나의 기능만 가진다는 의미입니다, 응집도는 높이고 결합도는 낮춥니다
OCP(Open Closed Priciple): 개방 폐쇄 원칙 - 요구사항의 변경이나 추가사항의 발생하더라도 기존 구성요소는 수정이 일어나지 말아야 하며 쉽게 확장이 가능하여 재사용할 수 있어야 한다
LSP(Listov Substitution Priciple): 리스코프 치환 원칙 -
ISP(Interface Segregation Principle): 인터페이스 분리 원칙 - 하나의 큰 인터페이스를 상속 받기 보다는 인터페이스를 작은 단위들로 분리해 필요한 인터페이스만 상속해 사용하지 않는 인터페이스는 구현하지 말아야한다는 원칙입니다
DIP(Dependency Inversion Principle): 의존관계 역전 원칙 - 자주변화하는것에 의존하지 말고 자주변하지않는것에 의존해야한다는 원칙입니다
GET, POST, PUT, PATCH, DELETE 각각 설명
GET : 말 그대로 가져오는 것을 의미이며 리소스를 전달만 받고 변경되지는 않습니다
POST : 서버에 리소스를 보내며 생성해 달라고 요청합니다
PUT : 리소스를 업데이트하거나 없다면 생성해 달라고 요청하고 PATCH와 비교하면 전체 데이터를 교체하는 차이점이 있습니다
PATCH : 리소스를 업데이트 하라고 요청합니다. PUT과는 달리 부분 데이터만 업데이트 합니다
DELETE : 말 그대로 리소스를 삭제 요청합니다
쿠키, 세션, 캐시 설명
쿠키 : 웹 브라우저에 저장되여 사용자의 컴퓨터가 있다면 누구나 데이터 확인이 가능합니다, 때문에 보안이 낮습니다
세션 : 클라이언트와 서버가 네트워크 연동이 지속적으로 유지되는 상태입니다, 때문에 보안이 높습니다
캐시 : 첫 번째 요청의 결과를 로컬 PC의 저장해둬 다음 요청 시 로컬 PC의 캐시를 꺼내는 것입니다, 때문에 서버에 요청하지 않아도 되기 때문에 속도가 빠릅니다
액티비티가 다시 재생성 되어질 때는 언제? 설명
의존성 주입 설명과 구체적 예
의존성 주입이란 외부에서 의존객체를 생성해 넘겨주는것을 의미합니다
장점으로는 Unit Test가 쉬워지고 코드의 재사용성과 가독성이 높아집니다, 또한 객체간의 의존성을 없애거나 줄일수있고 결합도를 낮출수 있습니다.
Main 스레드와 Work 스레드 설명