Map
๊ฒ์์ ๊ฐ๋
์ด ๊ฐ๋ฏธ๋ ์ธํฐํ์ด์ค๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ ๋ Key
์ Value
์ ํํ๋ก ๊ด๋ฆฌํ๋ค.
๋๋ฌธ์ ํด๋น Key
๋ฅผ ์ด์ฉํด์ Value
๊ฐ์ ์ป์์ ์๋ค.
1.0
Hashtable๊ฐ์ฅ ์ฒ์์ ๋์จ ํด์ํ ์ด๋ธ์ ๊ฐ์ง ๋งต ํด๋์ค
- Key & Value ์
null
์ด ํ์ฉ๋๋ค. - ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ค.
- ๋์์ฑ ๋ณด์ฅ์ด ๋๋ค.
synchronized
ํค์๋๋ฅผ Method ์ ์ฒด์ Lock ์ ์ ์ฉํ๋ค.Hashtable
์ ์ฐธ์กฐํ๋Thread
์ ๊ฐฏ์๊ฐ ๋ง์์ง์๋ก Lock ์ ํ๋ํ๊ธฐ ์ํ ์๊ฐ๋น์ฉ์ด ๋ง์ด ๋ค์ด ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ ๋ฎ์์ง๋ค.
HashMap
๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค.- 2์ฐจ ํด์ํจ์ ์ฌ์ฉ๋ถ๊ฐ
- ๋จ์ผ์ค๋ ๋์์ ์ฌ์ฉ์ Locking ์ด ๋๋ฆผ
1.2
HashMap- ๋ฉํฐ์ค๋ ๋ ๊ธฐ๋ฐ์์ ๋์์ฑ ๋ณด์ฅํ ์ ์๋ค. (Thread-not-safe)
- ๋จ์ผ ์ค๋ ๋ ๊ธฐ๋ฐ์์๋ ์ฐ์ ์ผ๋ก ์ฌ์ฉ
- Key & Value ์
null
ํ์ฉ- ์ ๋ ฌ ๊ธฐ๋ฅ์ ์ง์ํจ
ํ์์ ์ํ ์๊ฐ๋ณต์ก๋๋ O(1) ๋ก ๋ณด์ฅ๋๋ค.
๋์์ฑ ๋ณด์ฅ์ ์ํ๋ฉด ์๋์ ๊ฐ์ด ๋ณํํด์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
Map<K, V> m = Collections.synchronizedMap(new HashMap<>());
ํ์ง๋ง ๋์์ฑ ์ด์๊ฐ ์๋ค๋ฉด ConcurrentHashMap
์ ์ถ์ฒํจ
1.5
ConcurrentHashMapHashMap
์ thread-safe ํ๋๋ก ๋ง๋ ํด๋์ค๊ฐ ConcurrentHashMap ์ด๋ฉฐ, key & value ์ null ์ ํ์ฉํ์ง ์๋๋ค.
๋ ๋ค ๋๊ธฐํ ๋ณด์ฅ์ ํ๋ ํน์ง์ด ์์ง๋ง ๊ตฌ์กฐ์ ์ผ๋ก ์์ ์ฐจ์ด๊ฐ ์๋ค.
- ๋์์ฑ ๋ณด์ฅ์ ํ๋ค.
- ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ๊ฐ์ ์ธ๊ทธ๋จผํธ๋ฅผ ๋๊ณ ๊ฐ ์ธ๊ทธ๋จผํธ๋ง๋ค ๋ณ๋์ ๋ฝ์ ๊ฐ์ง๊ณ ์๋ค.
- ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ์ฐธ์กฐ ํ๋๋ผ๋ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์ธ๊ทธ๋จผํธ์ ์์นํ๋ฉด ์๋ก Lock ์ ์ป๊ธฐ ์ํด ๊ฒฝ์ํ์ง ์๋๋ค.
- ์ด๋ฌํ ๋ฐฉ์์ Lock Striping ์ด๋ผ๊ณ ํ๋ค.
- Key & Value ์
null
ํ์ฉ ๋ถ๊ฐ
1.2
TreeMap- ์ ๋ ฌ๊ธฐ๋ฅ์ ์ง์ํจ
์ฐธ๊ณ ์๋ฃ
Hash
๋ฅผ ์ด์ฉํ Map ๊ด๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ํน์ ์กฐํํด์ค๋ ํค ๊ฐ์ Hash
๊ฐ์ ์ด์ฉํ๋ฉฐ
์ ์ฅ๋๋ ๋ฐ์ดํฐ์ Key & Value ์ ๊ฐ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๊ธฐ๋ ํ๋ค.
ํด์ํจ์
ํด์๊ฐ์ ์ด์ฉํ ์๋ฃํ์ ํด์ ํจ์๋ฅผ ํตํด์ ๋์ค๋ ์ธ๋ฑ์ค ๊ฐ์ผ๋ก ๊ด๋ฆฌ๋๋๋ฐ ์ด ํด์ ํจ์๋ ํด์ ํค๊ฐ์ ์ ๋ ฅ์ ๋ฐ์ ํด์ ํ ์ด๋ธ์์ ์ฃผ์๋ฅผ ๋ฆฌํดํด์ค์ผ ํ๋ค.
์ด๋ ํด์ํจ์๋ฅผ ์์ฑ์์๋ ๋ค์ ๋๊ฐ์ง์ ์กฐ๊ฑด์ ๋ง์กฑํ๋๊ฒ์ด ์ ์ผ ์ข๋ค.
- ์ ๋ ฅ๋๋ ์์๊ฐ ํด์ ํ ์ด๋ธ ์ ์ฒด์ ๊ณ ๋ฃจ ์ ์ฅ๋์ด์ผ ํ๋ค. (ํด์ ๋ถํฌ)
- ๊ณ์ฐ์ด ๊ฐ๋จํด์ผ ํ๋ค (์ฑ๋ฅ)
์ฒซ๋ฒ์งธ ์กฐ๊ฑด์ ์ ๋ง์กฑํด์ผ๋ง ์๋ก ๋ค๋ฅธ ๋ ์์๊ฐ ํ๋์ ํด์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์ถฉ๋๋ ํ๋ฅ ์ด ์ ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. (ํด์์ถฉ๋)
๋๋ถ๋ถ ์๋์ ๊ฐ์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
int hashIndex = X.hashCode() % M;
์ด ์ฝ๋์ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ 1/M
์ ํ๋ฅ ๋ก ๊ฐ์ ๋ฒํท์ ๊ฐ์ง๊ฒ ๋๋ค.
ํด์๋ฅผ ์ด์ฉํ ์ธ๋ฑ์ฑ ์ฌ์ฉ์ผ๋ก ๊ด๋ฆฌ๋๋ ์ด Key ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ๊ฐ์ฒด์ hashCode()
๊ฐ ๋ฐํํ๋ ๊ฐ์ ์ฌ์ฉํ๋๋ฐ ์ด ์๋ฃํ์ int
๋ค
32 bit ์๋ฃํ์ผ๋ก๋ ์์ ํ ์๋ฃ์ ํด์ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
๋ ผ๋ฆฌ์ ์ผ๋ก 2^32 ๋ณด๋ค ๋ง์์๋ ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ ํด์๋ฅผ ์ด์ฉํ Map ๊ฐ์ฒด์์ ๋๋ค ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ ค๋ฉด ์์๊ฐ 2^32 ์ธ ๋ฐฐ์ด์ ๋ชจ๋ Map ์ด ๊ฐ์ง๊ณ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํด์ ์ถฉ๋ (Hash Colision)
ํด์ ์ถฉ๋ (Hash Colision) ์ ์ ํํผํ๋๋ก ๊ตฌํํด ๋์๋๋ผ๋ ํด์ ์ถฉ๋์ด ๋ฐํํ ๊ฒฝ์ฐ ํํผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ค์ ๋ํ์ ์ผ๋ก ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋๋ค.
๋ค๋ฅธ ํด์ ํํผ๋ฐฉ๋ฒ์ด ์์ง๋ง ์ด ๋๊ฐ์ง๋ฅผ ์์ฉํ ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ๋ฐฉ ์ฃผ์๋ฒ (Open Address)
ํด์์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ค๋ฅธ ๋ฒํท (๋ฐ์ดํฐ ์ฃผ์ ๊ณต๊ฐ) ์ ์ฐพ์ ์๋ฃ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ์์ด๋ค.
๋น์ด์๋ ๋ฒํท์ ํ์ํ๊ฑฐ๋ ํน์ 2์ฐจ ํด์ํจ์๋ฅผ ์ด์ฉํ์ฌ ์๋ก์ด ์ฃผ์๋ฅผ ํ ๋นํ๋๋ฐ
์ด ๊ณผ์ ์์ ์๋ก์ด ํด์ ๋ฒํท์ ์ฐพ๋ ๋ฐฉ๋ฒ์ Linear Probing, Quadratic Probing ๋ฑ์ ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋๋ค.
- ์ฅ์
- ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์ ๋ค๋ฉด ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ค.
- ๋จ์
- ์ฐ์๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์บ์ ํจ์จ์ด ๋๋ค.
- ํฌํค๊ฐ ์ปค์ง์๋ก ์ ์ค๋ฅ (hit ratio) ์ด ๋ฎ์์ง๊ธฐ ๋๋ฌธ์ ์บ์ ํจ์จ์ด ํ์ ํ ๋ฎ์์ง๋ค.
๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ (Seperate Chaining)
Java HashMap ์์ ์ฌ์ฉ์ค์ธ ๋ํ์ ์ธ ๋ฐฉ์์ผ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐฉ์ฃผ์๋ฒ๋ณด๋ค๋ ์ฑ๋ฅ์์ ์ด์ ์ด ์๋ค.
๋ณด์กฐ ํด์ ํจ์
์ ์ฅํ๋ ค๋ ๋ ๊ฐ๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ก ํด์ฑ (hashing : hash ํจ์๋ฅผ ํตํด ๊ณ์ฐ๋จ์ ์๋ฏธ) ํ๊ฒ ๋๋ฉด ๊ฐ์๊ณณ์ ์ ์ฅํ ์ ์๊ฒ ๋๋ค.
๋๋ฌธ์ ํด์ฑ๋ ์ธ๋ฑ์ค์ ์ด๋ฏธ ๋ค๋ฅธ ๊ฐ๋ค์ด ๋ค์ด์๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ค๋ฅธ ์์น๋ฅผ ์ฐพ์๋ค์์ผ ์ ์ฅํ ์ ์๋ค.
์ด ์ธ์๋ ํด์ ๋ฒํท์ ๋์ ํ์ฅ ๋ฑ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ ์๋ค.
ํด์ ๋ฒํท์ ๋์ ํ์ฅ
ํด์ ๋ฒํท์ ๊ฐ์๊ฐ ์๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์๋์ ์์ง๋ง ํด์ ์ถฉ๋๋ก ์ธํ ์ฑ๋ฅ์์ ๋น์ฉ์ด ๋ ๋ฐ์ํ ์ ์๋ค.
๋๋ฌธ์ HashMap
์ Key & Value ์ ์ ๋ฐ์ดํฐ๊ฐ ์ผ์ ๊ฐ์ ์ด์ ๋๋ฉด ํด์ ๋ฒํท์ ๊ฐ์๋ฅผ ๋๋ฐฐ๋ก ๋๋ฆฐ๋ค.
์ด ์ผ์ ๊ฐ์๋ ๊ธฐ๋ณธ ์ฝ 75% ์ ๋๋ก load factor
๋ก HashMap
์ ์์ฑ์์์ ์ง์ ๊ฐ๋ฅํ๋ค.
/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
ํด์์ ๋จ์
๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ๋ ์์๋ก ์ ๊ทผํ๋๊ฒ์ ์์ฒญ๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค.
โ Set Reflection โ