ParkSangSun1 / 2022_Android_Interview

๐Ÿ˜ƒ ๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ๋งŒ๋“  ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฉด์ ‘ ์งˆ๋ฌธ ๋Œ€๋น„ ์ž๋ฃŒ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์•„๋ž˜ ๋งํฌ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค


์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋…์ ์ธ ๋ถ€๋ถ„

์•ˆ๋“œ๋กœ์ด๋“œ 4๋Œ€ ์ปดํฌ๋„ŒํŠธ

์•กํ‹ฐ๋น„ํ‹ฐ(Activity), ์„œ๋น„์Šค(Service), ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„(BroadCast Receiver), ์ฝ˜ํ…ํŠธ ํ”„๋กœ๋ฐ”์ด๋”(Content Provider)

๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ธํ…ํŠธ๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ


Context๋ž€?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ context์™€ ์•กํ‹ฐ๋น„ํ‹ฐ context๊ฐ€ ์กด์žฌ


์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context)๋ž€?

์‹ฑ๊ธ€ํ„ด ์ธ์Šคํ„ด์Šค์ด๋ฉฐ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ getApplicationContext()๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด๊ณผ ์—ฐ๊ฒฐ๋ผ ์žˆ์Œ

ํ˜„์žฌ์˜ ์ปจํ…์ŠคํŠธ์™€ ๋ถ„๋ฆฌ๋œ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ฐ€์ง„ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ


์•กํ‹ฐ๋น„ํ‹ฐ ์ปจํ…์ŠคํŠธ(Activity Context)๋ž€?

์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ

์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌ ๋˜๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด์ด ํ˜„์žฌ์˜ ์ปจํ…์ŠคํŠธ์— ๋ถ™์€ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ


์ƒ๋ช…์ฃผ๊ธฐ๋ž€?

์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด์— ๋ณด์ด๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์•Œ๋ ค์คŒ

onCreate : ๋งŒ๋“ค์–ด ์กŒ์„ ๋•Œ

onStart : ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ

onResume : ํฌ์ปค์Šค๊ฐ€ ๋– ๋‚œ ํ›„ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๋•Œ/ ํ˜„์žฌ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜ ์žˆ์„ ๋•Œ

onPause : ํ™”๋ฉด์˜ ์ผ๋ถ€๊ฐ€ ๊ฐ€๋ ค์งˆ ๋•Œ

onStop : ์™„์ „ํžˆ ๊ฐ€๋ ค์กŒ์„ ๋•Œ

onDestroy : ์ข…๋ฃŒ๋์„ ๋•Œ


์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€?

์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ๊ฒฐ์ •ํ•˜๊ณ  ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ


์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

Unit Test ์šฉ์ด

์ฝ”๋“œ์˜ ์žฌํ™œ์šฉ์„ฑ์„ ๋†’์—ฌ์คŒ

๊ฐ์ฒด๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ฑฐ๋‚˜ ์—†์—˜ ์ˆ˜ ์žˆ์Œ

๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ


XML์ด๋ž€?

AndroidManifest.xml, Layout ํŒŒ์ผ, Resource ํŒŒ์ผ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉ

XML์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ํ‘œํ˜„

Android OS๊ฐ€ XML์„ ํŒŒ์‹ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•จ


Activity vs Fragment ๋น„๊ต

๊ณตํ†ต์ 

๋‘˜ ๋‹ค View๋ฅผ ํ‘œํ˜„ํ•ด์คŒ


์ฐจ์ด์ 

Activity : ๊ฐ€์žฅ ๋ฐ”๋‹ฅ ์—ญํ• ์„ ํ•จ

Fragment : ์•กํ‹ฐ๋น„ํ‹ฐ์— ๋ถ™์Œ


Proguard๋ž€?

์ฝ”๋“œ ๋‚œ๋…ํ™” ํˆด


๋ฆฌํ”Œ๋ ‰์…˜์ด๋ž€?

๋Ÿฐํƒ€์ž„์— ํ”„๋กœ๊ทธ๋žจ์˜ ํด๋ž˜์Šค๋ฅผ ์กฐ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ 


์ปดํŒŒ์ผ ํƒ€์ž„, ๋Ÿฐ ํƒ€์ž„ ์ด๋ž€?

์ปดํŒŒ์ผ ํƒ€์ž„์€ ์ž‘์„ฑ๋œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ ๋˜์–ด ์‹คํ–‰๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •

๋Ÿฐ ํƒ€์ž„์€ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์‹คํ–‰๋˜์–ด ๋™์ž‘ํ•  ๋•Œ


์ปดํŒŒ์ผ, ๋นŒ๋“œ ๋ž€?

์ปดํŒŒ์ผ์€ ์ž‘์„ฑ๋œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด์ฝ”๋“œ๋กœ ๋ณ€ํ™˜

๋นŒ๋“œ๋Š” ์ปดํŒŒ์ผํ•œ ํ›„ ์‹คํ–‰ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •



Kotlin ๋ฌธ๋ฒ•์ ์ธ ๋ถ€๋ถ„

ํด๋ž˜์Šค๋ž€?

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„


๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ž€?

์„ค๊ณ„๋„(ํด๋ž˜์Šค)๋กœ ์ฐ์–ด๋‚ธ ์‹ค์ฒด


์ถ”์ƒํ™”(abstract)๋ž€?

์–ด๋–ค ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•จ์— ์žˆ์–ด ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ผ์ • ๋ถ€๋ถ„ ํŠน์ง•๋งŒ์„ ํ‘œํ˜„

๋ชฉ์ ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ


๋ถˆ๋ณ€์„ฑ(Immutability)์ด๋ž€?

๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

๋ถˆ๋ณ€ ๋ณ€์ˆ˜ -> ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜

val : ์™„์ „ํ•œ ๋ถˆ๋ณ€์„ฑ X

const val : ์™„์ „ํ•œ ๋ถˆ๋ณ€์„ฑ


Collection์ด๋ž€?

Generic์œผ๋กœ ๊ตฌํ˜„์ด ๋˜์–ด ๋‹ค์–‘ํ•œ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ

๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„ ๊ด€๋ฆฌ์™€ ์‚ฌ์šฉ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ”„๋ ˆ์ž„์›Œํฌ

๊ธฐ๋ณธ์ ์œผ๋กœ Mutable(๋ณ€๊ฒฝ ๊ฐ€๋Šฅ - ์ถ”๊ฐ€, ์‚ญ์ œ ๊ฐ€๋Šฅ)๊ณผ Immutable(๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ - ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ)์„ ์ง€์›

List, Set, Map ์กด์žฌ


List vs Set vs Map ๋น„๊ต

๊ณตํ†ต์ 

๋ชจ๋‘ Collection, ๋ชจ๋‘ Mutable๊ณผ Immutable์„ ์ง€์›


์ฐจ์ด์ 

List : ์ค‘๋ณต ํ—ˆ์šฉO, ์ˆœ์ฐจ์ 

Set : ์ค‘๋ณต ํ—ˆ์šฉX, ์ˆœ์ฐจ์ ์ด์ง€ ์•Š์€ ์ง‘ํ•ฉ

Map : Key-Value ๋‘ ๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ ํŽ˜์–ด๋กœ ๋‚˜ํƒ€๋ƒ„, key ์ค‘๋ณต ๋ถˆ๊ฐ€๋Šฅ, value ์ค‘๋ณต ๊ฐ€๋Šฅ


Kotlin DSL์ด๋ž€?

DSL์ด๋ž€ ํŠน์ • ๋ถ„์•ผ์— ์ตœ์ ํ™”๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋œปํ•จ

์ƒ์šฉ๊ตฌ ์ฝ”๋“œ(๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ)๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…๋ นํ˜• ์ฝ”๋“œ ๋Œ€์‹  ์„ ์–ธ์  ์ฝ”๋“œ ํ˜•์‹์„ ๋”ฐ๋ฆ„

๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๊ฐ„๋žตํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Gradle ์Šคํฌ๋ฆฝํŒ… ํ•จ


๋žŒ๋‹ค์‹์ด๋ž€?

ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ด๋ก ์  ๊ธฐ๋ฐ˜์„ ์„ธ์šฐ๋Š” ์ˆ˜ํ•™์  ์ถ”์ƒํ™”๋ฅผ ๋œปํ•จ, ์ด๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋ฉด ๋žŒ๋‹คํ‘œํ˜„์‹



๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ€๋ถ„

Retrofit์ด๋ž€?

์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ http ํ†ต์‹ ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

OKhttp๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง


Okhttp๋ž€?

RESP API, HTTP ํ†ต์‹ ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ์„ ์ œ๊ณต

Retrofit์˜ ๋ฒ ์ด์Šค๊ฐ€ ๋จ


Okhttp vs Retrofit ๋น„๊ต

๊ณตํ†ต์ 

๋‘˜๋‹ค HTTP ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


์ฐจ์ด์ 

Retrofit : HTTP client ์—ญํ• ์„ ์ˆ˜ํ–‰

Okhttp : ํ†ต์‹ ์„ ํ•˜๋Š”๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก


Dagger hilt๋ž€?

Dagger์˜ ๋†’์€ ๋Ÿฌ๋‹์ปค๋ธŒ๋ฅผ ๋ณด์•ˆํ•˜๊ณ  ์ดˆ๊ธฐ ๊ตฌ์ถ• ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


Koin์ด๋ž€?

Kotlin DSL๋กœ ๋งŒ๋“ค์–ด์ง

Dagger์— ๋น„ํ•ด ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ์Œ

๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•ด ๋Ÿฐํƒ€์ž„์— ์˜ค๋ธŒ์ ํŠธ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋จ


Jetpack Compose๋ž€?

Native UI๋ฅผ ์ฝ”๋“œ๋ ˆ๋ฒจ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ํˆดํ‚ท

ํ•„์š”ํ•œ ์˜์—ญ์˜ ๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…

์ฝ”๋“œ ๊ฐ์†Œ, ์ง๊ด€์ , ๋น ๋ฅธ ๊ฐœ๋ฐœ ๊ณผ์ •, ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ ๋“ฑ์˜ ์ด์ ์ด ์žˆ์Œ


DataBinding์ด๋ž€?

xmlํŒŒ์ผ์— Data๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์คŒ

๊ธ€๋ฃจ์ฝ”๋“œ(ํ”„๋กœ๊ทธ๋žจ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๊ตฌํ˜„์—๋Š” ๊ธฐ์—ฌํ•˜์ง€ ์•Š์ง€๋งŒ, ๋ณธ๋ž˜ ํ˜ธํ™˜์„ฑ์ด ์—†๋Š” ๋ถ€๋ถ„๋ผ๋ฆฌ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ) ์ตœ์†Œํ™”


ViewBinding์ด๋ž€?

View์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ


Glide๋ž€?

์ด๋ฏธ์ง€ ๋กœ๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์–ด๋–ค ์ข…๋ฅ˜์˜ ์ด๋ฏธ์ง€๋ผ๋„ ๋น ๋ฅด๊ณ  ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ 

๋ถ™์ด๊ธฐ, ๋ฆฌ์‚ฌ์ด์ฆˆ, ๋””์Šคํ”Œ๋ ˆ์ด์— ํšจ๊ณผ์ 


Glide vs Picasso ๋น„๊ต

๊ณตํ†ต์ 

๋‘˜ ๋‹ค ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


์ฐจ์ด์ 

Picasso : Bitmapํฌ๋งท์„ ARGB_8888๋กœ ์‚ฌ์šฉ (ํ™”์งˆ ์ข‹์Œ)

Picasso : Bitmapํฌ๋งท์„ RGB_565๋ฅผ ์‚ฌ์šฉ (๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰ ์ ์Œ)

Picasso๋Š” 1920x1080ํฌ๊ธฐ์˜ ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์™€์„œ GPU์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฆฌ์‚ฌ์ด์ง•

Glide๋Š” ๋ฐ”๋กœ 768x432ํฌ๊ธฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ€์ ธ์™€์„œ ImageView๋กœ ํ• ๋‹น ์‹œํ‚ค๊ธฐ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์Œ


AAC๋ž€?

ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์•ฑ์„ ๋””์ž์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ์Œ


MVVM ViewModel vs AAC ViewModel ๋น„๊ต

์ฐจ์ด์ 

MVVM ViewModel : View์™€ Model ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๊ณ  ๋ฐ”์ธ๋”ฉ ํ•ด์ฃผ๋Š” ์—ญํ• 

AAC ViewModel : ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ UI ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ



๋””์ž์ธ ํŒจํ„ด, ์•„ํ‚คํ…์ฒ˜ ๋ถ€๋ถ„

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€?

ํ•ด๋‹น ํด๋ž˜์Šค์— ํ•œ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋งŒ์„ ๊ฐ–๊ฒŒํ•˜๊ณ  ์ „์—ญ ๋ฒ”์œ„์—์„œ ์ด ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•ด ์‚ฌ์šฉ


MVVM ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

MVP์—์„œ ํŒŒ์ƒ๋จ

๋ชจ๋ธ - ๋ทฐ - ๋ทฐ๋ชจ๋ธ ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ


๊ฐœ๋…์ ์ธ ์˜๋ฏธ

Model : ๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ์— ๊ด€๋ จ๋œ ํ–‰์œ„๋ฅผ ๋ชจ๋‘ ํ•ฉ์ณ Model ์ด๋ผ ๋ถ€๋ฆ„

View : ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™”๋ฉด์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ๋ชจ๋“  ๊ตฌ์กฐ, ๋ ˆ์ด์•„์›ƒ์„ ์˜๋ฏธ

ViewModel : View ์˜ ์ถ”์ƒํ™”๋œ ํ˜•ํƒœ, View ์— ๋ณด์—ฌ์ ธ์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ช…๋ น๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ


์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ์˜ ์˜๋ฏธ

Model : Network, DB, SharedPreferences ๋“ฑ ๋‹ค์–‘ํ•œ Data Source ๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„

View : Activity, Fragment, CustomView, Dialog, Toast, Snackbar, Menu ๋“ฑ์˜ UI ์ปดํฌ๋„ŒํŠธ

ViewModel : View ์™€ Model ์‚ฌ์ด์˜ ๋งค๊ฐœ์ฒด ์—ญํ• ์„ ํ•จ


MVP ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

๋ชจ๋ธ - ๋ทฐ - ํ”„๋ ˆ์  ํ„ฐ๋กœ ๊ตฌ์„ฑ

UI(View)์™€ ๋กœ์ง(Model)์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์„œ๋กœ ๊ฐ„์— ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ค๋ฅธ ๊ฐ์ฒด(Presenter)์— ๊ทธ ์—ญํ• ์„ ์คŒ์œผ๋กœ์จ, ์„œ๋กœ์˜ ์˜ํ–ฅ(์˜์กด์„ฑ)์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ

MVC์™€ ๋‹ค๋ฅด๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง

Model๊ณผ View์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„ ํ™•์žฅ์„ฑ์ด ๊ฐœ์„ ๋จ

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก View์™€ Presenter ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ๊ฐ•ํ•ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ


๊ฐœ๋…์ ์ธ ์˜๋ฏธ

Model : ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)

View : UI๋ฅผ ๋‹ด๋‹น (Activity, Fragment ๋“ฑ)

Presenter : Model๊ณผ View์‚ฌ์ด์˜ ๋งค๊ฐœ์ฒด, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ


MVC ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

๋ชจ๋ธ - ๋ทฐ - ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๊ตฌ์„ฑ

์ปจํŠธ๋กค๋Ÿฌ์™€ View๋Š” 1:n ๊ตฌ์กฐ

์ปจํŠธ๋กค๋Ÿฌ๋Š” View๋ฅผ ์„ ํƒํ•  ๋ฟ ์ง์ ‘ ์—…๋ฐ์ดํŠธ ํ•˜์ง€๋Š” ์•Š์Œ (View๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ชจ๋ฆ„)

View์™€ Model ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ๋†’์•„ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›€


๊ฐœ๋…์ ์ธ ์˜๋ฏธ

Model : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

View : UI๋ฅผ ๋‹ด๋‹น (Activity, Fragment ๋“ฑ)

Controller : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ(Action)์„ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„



์ฝ”๋ฃจํ‹ด(Coroutine) ๋ถ€๋ถ„

Coroutine์ด๋ž€?

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์“ฐ๋ ˆ๋“œ์— ๋น„ํ•ด ๊ต‰์žฅํžˆ ๊ฐ€๋ฒผ์›€


Coroutine vs Thread ๋น„๊ต

๊ณตํ†ต์ 

๋™์‹œ์„ฑ (Interleaving) ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ 


์ฐจ์ด์ 

Coroutine : ๊ฐ ์ž‘์—…์— ๋Œ€ํ•ด Object ๋ฅผ ํ• ๋‹น/ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ฝ”๋”ฉ์„ ํ†ตํ•ด Switching ์‹œ์ ์„ ๋งˆ์Œ๋Œ€๋กœ ์ •ํ•จ/ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ Object๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ฒผ์›€

Thread : ๊ฐ ์ž‘์—…์— ๋Œ€ํ•ด Thread ๋ฅผ ํ• ๋‹น/ OS Kernel ์— ์˜ํ•œ Context Switching์„ ํ•จ/ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— Stack์ด ๋Š˜์–ด๋‚˜ ๋ฌด๊ฑฐ์›€


๋™๊ธฐ vs ๋น„๋™๊ธฐ ๋น„๊ต

๋™๊ธฐ : ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐ(ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ๋ฐ ์ข…๋ฃŒ๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹ ๊ฒฝ์”€)

๋น„๋™๊ธฐ : ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Œ(ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ๋ฐ ์ข…๋ฃŒ๋ฅผ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ํ˜ผ์ž ์ง์ ‘ ์‹ ๊ฒฝ ์“ฐ๊ณ  ์ฒ˜๋ฆฌ)


Blocking vs Non-blocking ๋น„๊ต

Blocking : ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ํ•  ์ผ์„ ๋ชจ๋‘ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ์ œ์–ด๊ถŒ์„ ๊ณ„์† ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—๊ฒŒ ๋ฐ”๋กœ ๋Œ๋ ค์ฃผ์ง€ ์•Š์Œ

Non-blocking : ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ํ•  ์ผ์„ ๋‹ค ๋งˆ์น˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋ฐ”๋กœ ์ œ์–ด๊ถŒ์„ ๊ฑด๋„ค์ฃผ์–ด(return) ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด


Blocking vs ๋™๊ธฐ, Non-blocking vs ๋น„๋™๊ธฐ ๋น„๊ต

์„œ๋กœ ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฆ„(์œ„์— ์ •๋ฆฌ๋œ ๋‚ด์šฉ ์ฐธ๊ณ )


launch vs async ๋น„๊ต

๊ณตํ†ต์ 

Main Thread ๋ฅผ Unblocking ํ•œ ์ฑ„ { } ๊ตฌ๋ฌธ ๋‚ด ์ž‘์—…์„ ์ˆ˜ํ–‰


์ฐจ์ด์ 

launch : ๋ฐ˜ํ™˜๊ฐ’ ์—†์Œ

async : ๋ฐ˜ํ™˜๊ฐ’์ด ์กด์žฌ(Deferred)


join vs await ๋น„๊ต

๊ณตํ†ต์ 

์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ์ฝ”๋ฃจํ‹ด์—๊ฒŒ ๊ธฐ๋‹ค๋ฆฌ๋ผ๊ณ  ๋ช…๋ นํ•˜๋Š” ํ•จ์ˆ˜


์ฐจ์ด์ 

join : Job(launch) ํƒ€์ž…์—์„œ ์‚ฌ์šฉ

await : Deferred(async) ํƒ€์ž…์—์„œ ์‚ฌ์šฉ


About

๐Ÿ˜ƒ ๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ๋งŒ๋“  ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฉด์ ‘ ์งˆ๋ฌธ ๋Œ€๋น„ ์ž๋ฃŒ