ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์‹ค์ œ๋กœ ๋ฉด์ ‘๊ณผ์ •์—์„œ ๋ฐ›์•˜๋˜ ์งˆ๋ฌธ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. 

์ด์ค‘์—์„œ๋Š” ๋Œ€๋‹ตํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ๋“ค๋„ ์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๋ฉฐ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

Computer Sience


ArrayList์™€ LinkedList์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์žฅ๋‹จ์ ์— ๋”ฐ๋ฅธ ์ ์ ˆํ•œ ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š”?

 

์ž๋ฃŒ๊ตฌ์กฐ: Linked List ๋Œ€ ArrayList

2014๋…„ ๋ชจ๋‘๋“ค ์–ด๋–ค ๋ชฉ์ ๊ณผ ๊ณ„ํš์„ ๊ฐ–๊ณ  ์‚ด๊ณ  ๊ณ„์‹ ์ง€์š”? ์ €๋Š” ์˜ฌ ํ•œํ•ด “Go to the Base”๋ฅผ ๋ชฉํ‘œ๋กœ ์—ฌ๋Ÿฌ ๊ณ„ํš์„ ์„ธ์› ๋Š”๋ฐ์š”. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ณผ๊ฑฐ 5๋…„ ๋™์•ˆ ์ €๋ฅผ ๋˜ ๋Œ์•„ ๋ณด๊ณ  ๋ถ€์กฑํ–ˆ๋˜ ๊ธฐ๋ณธ ์ง€์‹์„ ํƒ„

www.nextree.co.kr

  • ArrayList : ๋ฐ์ดํ„ฐ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ์ญ‰ ๋Š˜์–ด์„  ๋ฐฐ์—ด์˜ ํ˜•์‹์œผ๋กœ ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค
  • LinkedList : ๋ฐ์ดํ„ฐ๋“ค์ด ์ž๋ฃŒ์˜ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ํ˜•์‹

LinkedList๋Š” ์œ„์น˜์— ๊ด€๊ณ„ ์—†์ด ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ์˜ ์‚ญ์ œ, ์‚ฝ์ž…์ด ๋น ๋ฅด๊ฒŒ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ฉด ArrayList๋Š” O(N)๋งŒํผ์˜ ์†๋„๊ฐ€ ์†Œ์š”๋จ

๋นˆ๋ฒˆํ•œ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ Linked ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ›จ์”ฌ ๋” ์ข‹์ง€๋งŒ ํŠน์ • ์ž๋ฃŒ์˜ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ›จ์”ฌ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

 

HashTable์€ ๋ฌด์—‡์ธ๊ฐ€?

(Key, Value)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜. ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

 

HashTable๊ณผ HashMap์˜ ์ฐจ์ด?

๋™๊ธฐํ™” ์ง€์› ์—ฌ๋ถ€์˜ ์ฐจ์ด. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ž์›์˜ ๋™๊ธฐํ™”๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด HashTable (put ํ•จ์ˆ˜์˜ synchronized), ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋™๊ธฐํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด HashMap. 

 

Process Thread์—์„œ critical section๊ณผ race condition์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ผ

  • Critical section(์ž„๊ณ„์˜์—ญ) : ๋ณ‘๋ ฌํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ 2๊ฐœ ์ด์ƒ์˜ thread๊ฐ€ ํ•˜๋‚˜์˜ ์ž์›์— ์ ‘๊ทผํ•˜๋Š” ๋ช…๋ น๋ฌธ, ํ˜น์€ ์ฝ”๋“œ์˜ ์ผ๋ถ€
  • Race condition : 2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณ‘ํ–‰์ ์œผ๋กœ(concurrently) ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋™์ž‘์„ ํ•  ๋–„ ์„œ๋กœ ๊ฒฝ์Ÿํ•˜๋Š” ์ƒํ™ฉ

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” synchronized(๋™๊ธฐํ™”)์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ์ž„๊ณ„์˜์—ญ์—์„œ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ๋Š” lock์„ ํš๋“ํ•˜๊ฒŒ๋˜๋Š”๋ฐ, ์ด lock์€ ์˜ค์ง ํ•˜๋‚˜์˜ thread๋งŒ ๊ฐ–์„ ์ˆ˜ ์žˆ๋‹ค. 

Semaphore, Mutex์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ผ

๊ฒฝ์Ÿํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง๋ฉดํ•˜๋Š” Mutual exclusion, deadlock, starvation์˜ ์ƒํƒœ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค.

  • Semaphore : ๊ณต์œ ๋œ ์ž์›์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ
  • Mutex : ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋“ค์˜ critical section์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๊ฒน์น˜์ง€ ์•Š๋„๋ก 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ

Semaphore์™€ Mutex์™€์˜ ์ฐจ์ด๋กœ๋Š” Semaphore๋Š” 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด Mutext๋Š” 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฎคํ…์Šค(Mutex)์™€ ์„ธ๋งˆํฌ์–ด(Semaphore)์˜ ์ฐจ์ด

์ด ๊ธ€์€ Medium์— ๊ฐœ์‹œ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. Medium์—์„œ ๋ณด์‹œ๋ฉด ์ข€ ๋” ์œ ์พŒํ•œ ํ™˜๊ฒฝ์—์„œ ๊ธ€์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฎคํ…์Šค(Mutex)์™€ ์„ธ๋งˆํฌ์–ด(Semaphore)์˜ ์ฐจ์ด Toilet problem ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ€์žฅ ํฐ ์ˆ™์ œ๋Š” ‘๊ณต

worthpreading.tistory.com

Concurrency๊ณผ Parallelism

  • Concurrency(๋™์‹œ์„ฑ) : Interleaving(์‹œ๋ถ„ํ• ), ๋‹ค์ˆ˜์˜ task๋ฅผ ์กฐ๊ธˆ์”ฉ ๋‚˜๋ˆ„์–ด ์‹คํ–‰
    -> 10๋ถ„ ์†Œ์š” task 2๊ฐœ ์ˆ˜ํ–‰์‹œ context switching ๋น„์šฉ์„ ์ œ์™ธํ•˜๊ณ  20๋ถ„ ์†Œ์š” 
  • Parallelism(๋ณ‘๋ ฌ์„ฑ) : Parallelizing(๋ณ‘๋ ฌ์ˆ˜ํ–‰), ๋‹ค์ˆ˜์˜ task๊ฐ€ ๋™์‹œ์— ์‹คํ–‰
    -> 10๋ถ„ ์†Œ์š” task์™€ 12๋ถ„ ์†Œ์š” task๋ฅผ ์ˆ˜ํ–‰ ์‹œ 12๋ถ„ ์†Œ์š” context switching ํ•„์š” ์—†์Œ)

 

Android


 

์•ˆ๋“œ๋กœ์ด๋“œ 4๋Œ€ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…

Activity LifeCycle

OS ๋ฒ„์ „์— ๋”ฐ๋ผ Braodcast๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์ถ•์†Œ ๋˜์—ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ถ•์†Œ๋˜์—ˆ๋Š”์ง€, ์ด์— ๋”ฐ๋ฅธ ๋Œ€์‘๋ฐฉ์•ˆ์€?

Doze๋ชจ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ์ด์— ๋”ฐ๋ฅธ ๋Œ€์‘๋ฐฉ์•ˆ์€?

PendingIntent๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • Pending์˜ ์‚ฌ์ „์  ์˜๋ฏธ : ๋ณด๋ฅ˜, ์ž„๋ฐ•, ๊ณง ์žˆ์„
  • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๊ถŒํ•œ์„ ํ—ˆ๊ฐ€ํ•˜์—ฌ ๋‹น์žฅ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ์‹œ์ ์— ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•จ

OnNewIntent()๋Š” ๋ฌด์—‡์ธ๊ฐ€?

DI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Koin๊ณผ Hilt์˜ ์ฐจ์ด์ ์€?

Thread์™€ Coroutine์€ ๊ฐ๊ฐ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€?

Tread

  • Task ๋‹จ์œ„ : Thread
  • Concurrency ๋ณด์žฅ ์ˆ˜๋‹จ : Context switching (blocking ํ•ด๋‹น ๊ตฌ๋ฌธ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋‹ค๋ฅธ Thread๋ฅผ blocking)
  • ์ž์ฒด stack ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ฐ–์Œ

Coroutine

  • Task ๋‹จ์œ„ : Object
  • Concurrency ๋ณด์žฅ ์ˆ˜๋‹จ : Suspend (non-blocking ํ•ด๋‹น ๊ตฌ๋ฌธ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ awaits ํ•˜์˜€๋‹ค๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค์‹œ ์ด์–ด ๋‚˜๊ฐ)
  • task๋งˆ๋‹ค stack ์˜์—ญ์„ ๊ฐ–์ง€ ์•Š์•„๋„ ๋จ

data class๋Š” ๋ฌด์—‡์ธ๊ฐ€?

Data ๋ณด๊ด€ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“  ํด๋ž˜์Šค. getter(), setter(), toString(), hashCode(), equals(), copy() ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋˜์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

sealed class๋Š” ๋ฌด์—‡์ธ๊ฐ€?

์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค ์ •์˜๋ฅผ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๋Š” Enum ํด๋ž˜์Šค์˜ ํ™•์žฅ ํ˜•ํƒœ. Enum ํด๋ž˜์Šค์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

suspend ํ•จ์ˆ˜๋Š” ๋ฌด์—‡์ด๊ณ  ์ž‘๋™ ์›๋ฆฌ

Coroutin Scope ๋‚ด์—์„œ๋งŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์‹œ์ค‘๋‹จ์ด ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜. ์Šค๋ ˆ๋“œ๋ฅผ blockํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ์ž‘์—…์ด suspend๋œ ์ดํ›„ resume ๋  ๋•Œ ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž‘๋™ ์›๋ฆฌ?

Collection์˜ map, filter์™€ ๊ฐ™์€ ์—ฐ์‚ฐ๋“ค์ด ์žˆ๋Š”๋ฐ ์ผ๋ฐ˜ ์—ฐ์‚ฐ๊ณผ ์‹œํ€€์Šค ์—ฐ์‚ฐ์˜ ์ฐจ์ด

Livedata์˜ value, post value์˜ ์‚ฌ์šฉ์˜ ์ฐจ์ด์™€ ๋‚ด๋ถ€ ๊ตฌํ˜„์˜ ์ฐจ์ด

setValue()

Main ์Šค๋ ˆ๋“œ์—์„œ LiveData ๊ฐ’์„ ๋ณ€๊ฒฝ. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

postValue()

Backgroud ์Šค๋ ˆ๋“œ์—์„œ LiveData ๊ฐ’์„ ๋ณ€๊ฒฝ ํ•  ๋•Œ ์‚ฌ์šฉ. backgroud ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜๋‹ค๊ฐ€ main ์Šค๋ ˆ๋“œ์— ๊ฐ’์„ post ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ. ์•„๋ž˜๋Š” postValue()์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ์ด๋‹ค.

new Handler(Looper.mainLooper()).post(() -> setValue())

CleanArchitecture์˜ UseCase๋Š” ๋ฌด์—‡์ธ๊ฐ€?

Coroutine Dispatcher์˜ ์ข…๋ฅ˜์™€ ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์„ค๋ช…

flow๋ž€?

Mutable ๋ณ€์ˆ˜๋ฅผ Imutable ๋ณ€์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

Activity์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ Fragment์˜ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ์ฐจ์ด

LifeCycleOwner๋Š” ๋ฌด์—‡์ธ๊ฐ€?

Pacelable๊ณผ Serializable์˜ ์ฐจ์ด

Android ์ด๋ฏธ์ง€ ์บ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Lru์บ์‰ฌ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ผ

๋ช…์‹œ์  Intent์™€ ์•”์‹œ์  Intent์˜ ์ฐจ์ด

Jar๊ณผ AAR์˜ ์ฐจ์ด

ResํŒŒ์ผ์˜ ํฌํ•จ ์—ฌ๋ถ€์—์„œ ์ฐจ์ด AAR์€ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋“ค๋„ ํ•จ๊ป˜ ๋ผ๋ฆฌ๋ธŒ๋Ÿฌํ™” ๋จ

onSavedInstance ํ˜ธ์ถœ ์‹œ์ 

Activity์—์„œ Dialog๊ฐ€ ๋ณด์—ฌ์งˆ ๋•Œ LifeCycle ์ด๋ฒคํŠธ๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋Š”์ง€?

Dalvik๊ณผ ART์˜ ์ฐจ์ด

Dalvik

  • JIT(Just In Time) ์ปดํŒŒ์ผ ๋ฐฉ์‹: ์•ฑ ๊ตฌ๋™์ค‘ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ปดํŒŒ์ผ -> ์„ค์น˜์‹œ ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ ์‹คํ–‰ ์‹œ ๋Š๋ฆผ
  • Register based VM (JVM์€ stack based)์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ VM ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅ, ํ”„๋กœ์„ธ์Šค ๋…๋ฆฝ์„ฑ
  •  .class ํŒŒ์ผ์„ .dex๋กœ ๋ณ€ํ™˜ (VM์€ .class๋ฅผ .jar๋กœ ๋ณ€ํ™˜)

ART(Android Run TIme)

  • AOT(Ahead Of Time) ์ปดํŒŒ์ผ ๋ฐฉ์‹ -> ์„ค์น˜ ์†๋„๊ฐ€ ๋Š๋ฆฌ์ง€๋งŒ ์‹คํ–‰ ์‹œ ๋น ๋ฆ„
  • ์„ค์น˜ ์šฉ๋Ÿ‰์ด ๋งŽ์ด ํ•„์š”
  • Nugat ๋ฒ„์ „ ์ดํ›„์—๋Š” AOT + JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํƒ‘์žฌํ•˜์—ฌ ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉ

inner class๋Š” ์™œ static์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ์ข‹์€๊ฐ€

Fragment parameter๋ฅผ onNewInstance๋ฅผ ํ†ตํ•ด ๋„˜๊ฒจ์ค˜์•ผ ํ•˜๋Š” ์ด์œ 

databinding๊ณผ viewBinding์˜ ์ฐจ์ด

์™œ compose๋ฅผ ์จ์•ผํ•˜๋‚˜