Week 5
: ์ดํดํ๋๋ฐ ํ ์ธ์
โ๏ธ 6์ ์ฒซ์งธ ์ฃผ ๋ฉํ ๋ง์ ์์ํ๋ค!
์ง๊ธ๊น์ง ๊ณต๋ถํ๋ฉด์ ์ดํด์ ๋น์ค๋ณด๋ค๋ ๋ธ๋ก๊ทธ์ ๋ ธ์ ์ ๊ธ์ ์ฌ๋ ค์ผ ํ๋ค๋ ๊ฐ๋ฐ์ด ์ ์ ์ฌํด์ง๋ ๊ฒ์ ๋๊ปด์ ์ด๋ฒ ์ฃผ์๋ ๊ธ์ ์์ฑํ๊ธฐ ๋ณด๋จ ์์ดํจ๋์ ๊ทธ๋ ค๊ฐ๋ฉด์ ์กฐ๊ธ ๋ ์ดํดํ ๋ค์ ๊ธ์ ์์ฑํ๋ ค๊ณ ํ๋ ํ ์ฃผ๋ค.
๊ทธ๋์ ๊ฒ์๊ธ๋ ํ๋๋ฐ์ ์์ฑํ์ง ๋ชปํ๋๋ฐ, ๊ทธ ๊ธ๋ ์์ ํ ๋ด์ฉ์ด ์ฐ๋๋ฏธ๋ค.
์ฑ ์ ๋น ๋ฅด๊ฒ ์ฝ์ผ๋ฉด์ 5์ฃผ์ฐจ์ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํด์ผ๊ฒ ๋ค!
์ด๋ฒ ์ฃผ๋ Collection Framework์ ๋ํด ์ง์ค์ ์ผ๋ก ๊ณต๋ถํ๊ณ , Set๊ณผ Map ๊ทธ๋ฆฌ๊ณ ์ค๋ ๋์ ๋ํด ๊ณต๋ถํ๋ค.
(์ค๋ ๋๋ ๋ง๋ณด๊ธฐ ์คํผ์ ๋๋ง)
1. Generic Type Erasure
๊ธฐ์กด์๋ ํ์ ์ฒดํฌ๋ฅผ ๋ฐํ์ ์์ ์์ ์ํํด์ ์๋ชป๋ ํ์ ์ผ๋ก ์บ์คํ ํ์ ๊ฒฝ์ฐ ClassCastException ์์ธ๊ฐ ๋ฐ์ํ๊ณ ,
ํด๋น ์์ธ๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ด ์ค๋๊ฑธ๋ฆฌ๋ ๋ฑ์ ๋จ์ ์ด ์กด์ฌํ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Generic ๊ฐ๋ ์ด ์ถ๊ฐ๋๊ณ , Generic Type Erasure ๋ฅผ ํตํด ๊ฐํ ํ์ ์ฒดํฌ๋ฅผ ์ปดํ์ผ ํ์์ ์ํํ๋ฏ๋ก์จ ๋ฐํ์ ์ ์ ์์ธ๊ฐ ๋ฐ์ํ์ฌ ๋น ๋ฅด๊ฒ ๋ฌธ์ ๋๋ ๋ถ๋ถ์ ์์ ํ ์ ์๋ค.
๊ฐ์ฒด์ ์ ๋ค๋ฆญ์ด Bounded(<T extends Parent>, <T super Child>) ํ์ ์ผ๋ก ์ค์ ๋์ด ์๋ค๋ฉด ์ปดํ์ผ ์ Generic Type Erasure๊ฐ ๊ฐํ ํ์ ์ฒดํฌ๊ฐ ์ผ์ด๋๊ณ ํ์ ์ ๋ณด๋ ๋ฐ์ดํธ ์ฝ๋ ์์์ ์ฌ๋ผ์ง๋ค.
ํ์ง๋ง Un-Bounded ํ์ ์ผ๋ก ์ค์ ๋์ด ์๋ค๋ฉด ์ปดํ์ผ๋ฌ์ ์ํด ํด๋น ์ ๋ค๋ฆญ์ Object๋ก ๋ณ๊ฒฝํ๊ณ , ์ฌ๊ธฐ์ ์ง์ ์ ์ธ ์บ์คํ ์ด๋ Bridge Method๋ก ์ ๋ค๋ฆญ์ ๋ํ ํ์ ์ ๋ช ์ํด์ฃผ์ง ์๋๋ค๋ฉด ๊ฐํ ํ์ ์ฒดํฌ์ ์ํด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ Generic Type Erasure์ ์ํด ์ปดํ์ผ ํ์์์ ๊ฐํ ํ์ ์ฒดํฌ๊ฐ ๋ฐ์ํ๊ณ , ํด๋น ๊ฐ์ฒด์ ํ์ ์ ๋ณด๋ฅผ ๋ฐ์ดํธ ์ฝ๋์ ๋ด์ง ์๊ณ ๋ฐํ์ ์์ ์ผ๋ก ๋๊ธฐ๊ฒ ๋๋ฉด ๋ฐํ์์์ ํด๋น ๊ฐ์ฒด์ ํ์ ์ ๋ณด๋ฅผ ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆฌ๊ณ ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ClassCastException ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. ์ด๋ฏธ ์ปดํ์ผ ๋จ๊ณ์์ ์ ๋ค๋ฆญ ํ์ ์๊ฑฐ์ ์ํด์ ํ์ ์ฒดํฌ๊ฐ ๋๋ฌ๊ธฐ ๋๋ฌธ์ด๋ค.
+) Type Token์ด๋?
2. Cache Algorithm
ํ์ด์ง์ ํ๋ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ผ์ ํ ํฌ๊ธฐ์ ๊ณต๊ฐ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๋ ๋จ์.
๐ ํ์ด์ง : ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ ๋จ์ ํน์ ์ผ์ ํ ํฌ๊ธฐ๋ก ๋๋์ด์ง ๋ธ๋ก
๐ ํ๋ ์ : ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ ๋จ์ ํน์ ์ผ์ ํ ํฌ๊ธฐ๋ก ๋๋์ด์ง ๋ธ๋ก
1) FIFO (First In, First Out)
์ ์ ์ ์ถ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ํ์ด์ง ๊ต์ฒด ์์ ์ ์ํํ๋ค.
๋จผ์ ๋ค์ด์จ ํ์ด์ง๋ฅผ ๊ฐ์ฅ ๋จผ์ ๋นผ๊ณ , CPU์์ ์์ฒญํ Page Fault ํ์ด์ง๋ฅผ ํด๋น ์๋ฆฌ์ ๋ฃ๋๋ค.
2) LRU (Least Recently Used)
์ต๊ทผ๊น์ง ๊ฐ์ฅ ์ค๋ซ๋์ ์ฌ์ฉ๋์ง ์์ ํ์ด์ง๋ฅผ ์ ์ธ ๋์์์ ์ฐ์ ์์๋ก ๋๋ค.
์ด ๋, ๊ฐ ํ์ด์ง ๋ง๋ค ๊ณ์๊ธฐ๊ฐ ์กด์ฌํด ํด๋น ํ์ด์ง๊ฐ ์ผ๋ง๋ ์ฐธ์กฐ๋์ง ์์๋์ง ํ์ธํ๋ค.
3) LFU (Least Frequently Used)
์ต๊ทผ์ ๊ฐ์ฅ ์ฐธ์กฐ๋ ํ์๊ฐ ์ ์ ํ์ด์ง๋ฅผ ์ ์ธ ๋์์ ์ฐ์ ์์๋ก ๋๋ค.
๊ฐ ํ์ด์ง๋ง๋ค ์ฐธ์กฐ ํ์๋ฅผ ๊ธฐ์ตํ ๋ณ์๋ฅผ ๊ฐ๊ฒํด์ ์ฌ์ฉํ ๋ ๋ง๋ค 1์ฉ ์ฆ๊ฐํ์ฌ ์ด๋ฅผ ๋น๊ตํด์ ์ ์ธ ๋์์ ๋์ถํ๋ค.
3. Set
Set ์๋ฃ๊ตฌ์กฐ๋ ์์์ ์๊ด์์ด ์ค๋ณต์ ์ ๊ฑฐํ์ฌ ๊ฐ์ฒด ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋๋ค.
Java์์๋ HashSet, TreeSet, LinkedHashSet์ด ๋ํ์ ์ด๋ค.
๐HashSet
๋ด๋ถ์ ์ผ๋ก HashMap ๊ฐ์ฒด๋ฅผ ์์ฑํด ์๋ํ๋ฉฐ, ์์์ ์๊ด์์ด ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋๋ค.
HashMap์ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ๋ด๊ธธ ๋ฐ์ดํฐ์ ํด์์ฝ๋ ๊ฐ์ ํตํด ์ธ๋ฑ์ค์ ์ ๊ทผํ๋ฏ๋ก O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง,
ํด์ ์ถฉ๋๋ก ์ธํด ํ๋์ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ ์ ๋ฆผ ํ์์ด ๋ฐ์ํ๋ฉด ์ฌํ ๊ฒฝ์ฐ O(h/n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์๋ ์๋ค.
๐TreeSet
๋ด๋ถ์ ์ผ๋ก TreeMap ๊ฐ์ฒด๋ฅผ ์์ฑํด ์๋ํ๋๋ฐ, ์ด๋ก ์ธํด TreeSet์ ์ด์ง ํ์ ํธ๋ฆฌ > Red-Black ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒ์ ์์ด O(logN) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ฐ, ๋ํ์ ์ธ Set ๊ตฌํ์ฒด ์ค์์ ๊ฐ์ฅ ๋๋ฆฐ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
ํ์ง๋ง LinkedList ์ฒ๋ผ ๋ ธ๋ ๊ฐ์ ์ฐ๊ฒฐ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์์๋๋ก ์ ์ฅ๋๋ค.
4. Priority Queue (์ฐ์ ์์ ํ)
์ฌ์ค Queue ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ํด๋์ค์ ๋ํด์ ๋ง์ด ์ฐพ์๋ณด์ง๋ ๋ชปํ๋ค.
๊ฐ๋จํ ์๊ณ ์๋ ๊ฒ์ ์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ํน์ ์กฐ๊ฑด์ ์ํ ์ฐ์ ์์ ์ ๋ ฌ์ ์ด์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ํ์ ์ผ๋ก Heap ์ด ์๋ค.
๋ฉํ ๋๊ป์ ๊ฒ์์ ๋ญํน ์์คํ ์ ์์๋ก ๋ค์ด์ฃผ์ จ๋๋ฐ ์ ํํ ์๋ฟ์ง๋ ์์์ ์กฐ๊ธ ๋ ์ฐพ์๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
๋๋ ์ ์ ํ ์์๊ฐ ๋ ์ค๋ฅด์ง ์๋๋ฐ ๋ฉํฐ๋๊ป์ ์ค์ผ์ฅด๋ง์์ ์ฌ์ฉ ํ ์ ์์ ๊ฒ ๊ฐ๋ค๊ณ ๋ง์ํด์ฃผ์ จ๋ค. ํด๋น ๋ถ๋ถ๋ ์์๋ด์ผ๊ฒ ๋ค!
+) Redis ์์๋ ์ฐ์ ์์ ํ๋ฅผ ์ง์ํ๋ค. ์?
5. Hash Collision
ํด์ ์ถฉ๋. Key ๊ฐ์ ๋ค๋ฅด์ง๋ง ํด์ ํจ์์ ์ํด ํด๋น Key์ ๋ํ ํด์์ฝ๋๊ฐ ์ค๋ณต๋์ด ํด๋น ์ธ๋ฑ์ค๊ฐ ๋น์ด ์์ง ์๋ ํ์์ ๋งํ๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ฉฐ, Java์ HashMap ํด๋์ค๋ Separator Chining ์ ๊ตฌํํ์ฌ ์ฌ์ฉํ๋ค.
๐ Separator Chining
ํด์ ์ถฉ๋์ด ์ผ์ด๋ ๋ฐ์ดํฐ๋ฅผ ํด๋น ์ธ๋ฑ์ค์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ ๋งํ๋ค. Node ํด๋์ค์ next ํ๋๊ฐ ์ด์ ํด๋นํ๋ค.
๋ง์น LinkedList ํด๋์ค์ฒ๋ผ ํด์ ์ถฉ๋์ด ์ผ์ด๋ ์ธ๋ฑ์ค์ ๋ค์ด์จ ์์๋๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ Chaining๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํ ํ ๋๋ O(h/n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๐ Open Address
๋ง์ฝ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ด ๋จ์ ์๋ค๋ฉด ๋จ์ ๊ณต๊ฐ์ ์ฐพ์ ํด์ ์ถฉ๋์ด ์ผ์ด๋ ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ๋น ๊ณต๊ฐ์ ๋ด๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ปค์ง๋ฉด ์ปค์ง ์๋ก ๋จ์ ์๋ ๊ณต๊ฐ์ ์ฐพ๋ ํจ์จ์ด ๋จ์ด์ง๋ ๋จ์ ์ด ์กด์ฌํ๋ค.
+) Open Address ์ ๋ํ ๋ด์ฉ์ด ์ ๊ธฐ์ต๋์ง ์๋๋ค. ์กฐ๊ธ ๋ ์์๋ณด์!
++) ๊ทธ๋ฆฌ๊ณ ๋ฉํฐ๋๊ป์ Rehashing ์ด๋ผ๋ ํค์๋๋ฅผ ๋ง์ํด์ฃผ์ จ๋๋ฐ, ์ด๋ ์ฌํด์ฑ์ด๋ผ๋ ์๋ฏธ๋ก HashMap์ Load Factor๋ผ๋ ๊ฐ์ ๊ฐ์ง๋๋ฐ ํ์ฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋์ด Load Factor ๋งํผ ๋๋ฌํ๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ฆฌ๊ณ ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ์ ๋ด๊ธด ๋ฐ์ดํฐ์ ํด์์ฝ๋๋ฅผ ๋ฆฌํด์ฑ ์์ ์ ํ์ฌ ๋์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌํ ๋น ํด์ฃผ๋ ์์ ์ ์๋ฏธํ๋ค.
์ถ๊ฐ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ๋ค
๐ฅ Context-Switch
๐ฅ ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ > Synchronized ์ฉ๋ก ์ฐพ์๋ณด๊ธฐ > ๋์ฉ๋ ํธ๋ํฝ์ ์ํฉ์์ ์์ฒญ์ด ๋ฐ๋ฆฐ๋ค๋ฉด?
๐ฅ Atomic Operation, JNI(Java Native Interface)
๐ฅ Thread Lock, Monitor
๐ฅ Semaphore Mutex
๐ Type Token
๐ ํ์ด์ง๊ณผ ํ๋ ์์ ๊ฐ๋ ์ ๋ํด์ ์ ํํ ํ์ ํ๊ธฐ
๐ญ ์ด๋ฒ ์ฃผ๋ ์๋ฃ๊ตฌ์กฐ์ ๋ํด ์ดํดํ๋๋ผ๊ณ ์ค๋ ์๊ฐ์ด ์์๋ ํ ์ฃผ๋ค. ์๋ ๋ชฉํ๋ Thread์ ๋ํ ๋ด์ฉ๊น์ง ์ฝ์ด๋ณด๊ธฐ๋ผ๋ ํ๋ ๊ฒ์ด ๋ชฉํ์๋๋ฐ, ์๊ฐ๋ณด๋ค ์ดํดํ๋๋ฐ ์ค๋๊ฑธ๋ ธ๋ ๊ฒ ๊ฐ๋ค. ๊น๋จน๊ธฐ ์ ์ ์ผ๋ฅธ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌ ํด์ผ๊ฒ ๋ค.
์ผ๋ฅธ ์๋ฐ์ ์ ์ ๋๋ด์ผ ๋ค์ ์ฑ ์ผ๋ก ๋์ด๊ฐ๋๋ฐ ๋๋ ์์ด๋ ๊ฒ ์ดํด๊ฐ ๋๋์ง..๐ฟ
๊ทธ๋๋ ์ง๊ธ๊น์ง ์ด๋ ๊ฒ ์ดํด ํ ์ ์๋ค๋๊ฒ ๋๋ฆ์ ๋คํ์ธ ๊ฒ ๊ฐ๋ค..!
์ด์ ์๋ฐ์ ์ ์ ๋ฆฌ๋ทฐํ ์ฃผ์ฐจ๋ ์ผ๋ง ์๋จ์๋๋ฐ, ๋ ์น์ดํ๊ฒ ๊ณต๋ถํด์ผ๊ฒ ๋ค!