0. ์์๋ณผ ๊ฒ
1. Hash Map ์ด๋?
<KEY, VALUE>
ํํ์ ๋ฐ์ดํฐ ์์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ
KEY๋ฅผ ํ์ฉํด HashMap์ VALUE์ ์ ์ฅ, ์ญ์ , ์กฐํ ํ๋๋ฐ ํ๊ท O(1)
์ ์๊ฐ์ด ๋ ๋ค.
<KEY, VALUE> ์์ ENTRY
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
KEY ๊ฐ์ ์ค๋ณต๋ ์ ์๊ณ , VALUE ๊ฐ์ KEY ๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด ์ค๋ณต์ ์ฅ์ด ๊ฐ๋ฅํ๋ค.
2. HashMap ๋ด๋ถ ๊ตฌ์กฐ
HashMap์ ํฌ๊ฒ HASH ํจ์
์ Hash Bucket
์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- Hash Bucket์ ๊ฐ์ ์ ์ฅํ๋ ์ฅ์๋ก Array๋ก ๊ตฌํ๋์ด ์๋ค.
- Hash ํจ์๋ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅ๋ ์
๋ ฅ ๊ฐ ๋ง๋ค์
Hash ๊ฐ
์ ๋ฐํํ๋ค. ํด๋น Hash ๊ฐ์ Hash Bucket์ Index์ด๋ค. ๋ฐ๋ผ์ Hash ํจ์๋ ์ ๋ ฅ ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ์๋ ค์ฃผ๋ ๋ฐฉํฅํค ์ญํ ์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๊ฒ ๋ค.
์ด์ ์ค์ ์ ๋ ฅ๊ฐ์ด ๋ค์ด์๋ค๊ณ ํด๋ณด์.
3. Put์ ์๋์๋ฆฌ
a. Hash ํจ์๋ก Entry๊ฐ ์ ์ฅ๋ ์์น ์ฐพ๊ธฐ
Hashํจ์์๋ ๋ญ๊ฐ ๋ค์ด๊ฐ๊น? ์์์ ์ดํด๋ณธ HashMap์ ์ ์๋ฅผ ๋ณด๋ฉด ํญ์ KEY๋ฅผ ํ์ฉํด, VALUE์ ๊ดํ ์กฐ์น๋ฅผ ํ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ์ฐพ๋ ๊ฒ๋ KEY๋ฅผ ํ์ฉํ๋ค. ๊ทธ๋ ๋ค๋ฉด Hash ํจ์์ ๋ฐ๋ก KEY๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฃ์ผ๋ฉด ๋ ๊น? ์๋๋ค. Hash ํจ์์ ์
๋ ฅ๊ฐ์ hashCode
๋ง ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ KEY๋ฅผ Hash Code๋ก ๋ณํํ๋ ์์
์ด ์ ์ฒ๋ฆฌ๋ก ํ์ํ๋ค.
์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํจ์๊ฐ HashMap์ ๋ด๋ถ ํจ์์ธ hashcode()์ด๋ค. ํด๋น ํจ์๋ ์ฌ์ ์ ํ์ง ์์ผ๋ฉด KEY๊ฐ์ ์ฃผ์๊ฐ์ ์
๋ ฅ์ผ๋ก ๋ฐ์, ๋ด๋ถ ๊ณ์ฐ์ ๊ฑฐ์ณ ์ ์๋ก ๋ณํ์ํจ๋ค.
(HashMAP์ KEY, VALUE๋ ์ฐธ์กฐ ์๋ฃํ๋ง ์ธ ์ ์๊ธฐ ๋๋ฌธ์, ์ฃผ์๊ฐ์ด ๋ฌด์กฐ๊ฑด ์์)
์ด์ hashcode() ํจ์์ ๋ฐํ๊ฐ๋ค์ Hash ํจ์๋ฅผ ๊ฑฐ์ณ, ํด๋น ์ ๋ ฅ๊ฐ์ด ์ ์ฅ๋ bucket์ index(hash ๊ฐ)๋ก ๋ณํ๋ ๊ฒ์ด๋ค.
b. Hash ๊ฐ์ด ์ผ์นํ๋ Hash Bucket์ ๊ฐ ์ ์ฅ
๋ง์ฝ ์๋ก ๋ค๋ฅธ ์
๋ ฅ๊ฐ์ด ๊ฐ์ Hash ๊ฐ์ ๋ฐํํ๋ ๊ฒฝ์ฐ Bucket์ ์ด๋ป๊ฒ ์ ์ฅํ ๊ฒ์ธ๊ฐ? ์์์ ์ดํด๋ดค๋ค์ํผ, Hash Bucket์ Array๋ก ๊ตฌํ๋์ด ์์ด, ๊ฐ์ ํ๋๋ฐ์ ์ ์ฅํ์ง ๋ชปํ๋ค. ์ด๋ ๊ฒ, ์๋ก ๋ค๋ฅธ Entry๊ฐ์ด ๋์ผํ Hash ๊ฐ์ ๋ฐํํ๋ ๊ฒฝ์ฐ๋ฅผ HASH ์ถฉ๋
์ด๋ผ๊ณ ํ๋ค. Hash ์ถฉ๋์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์๋ 2๊ฐ์ง๊ฐ ์๋ค.
- ๋ฐฉ๋ฒ 1. Open Addressing: ํด์ ์ถฉ๋ ๋ฐ์์ ํด์๊ฐ ์๋ก ๊ตฌํด์ ํด์ ์ถฉ๋์ ์ฐํ
- ๋ฐฉ๋ฒ 2. Separate Chaining: ํด์ ์ถฉ๋ ๋ฐ์ ์ HashBucket์ Value ๋ถ๋ถ์ Linked List ํํ๋ก ๋ณํ์์ผ, ๋์ผํ ํด์๊ฐ์ ๊ฐ๋ ์ ๋ ฅ๊ฐ์ ๋์ผํ Bucket index์ ๋ชจ๋ ์ ์ฅ
java์์๋ ๋ฐฉ๋ฒ2๋ฅผ ํ์ฉํ๊ณ ์๋ค. java8 ์ดํ ๋ถํฐ๋ LinkedList ๊ธธ์ด๊ฐ ํน์ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ์ด์งํธ๋ฆฌ๋ก ๋ณํํ์ฌ, ํด์๊ฐ์ด ์ค๋ณต๋ ๋ฐ์ดํฐ๋ค ์ฌ์ด์์ ์ํ๋ ๊ฐ์ ์ฐพ์๋ด๋ ์๊ฐ์ O(n)์์ O(logN)์ผ๋ก ๋จ์ถ์์ผฐ๋ค.
๋ฐ๋ผ์ ์์๊ฐ ๋ง์ฝ ๋ค์ ๊ทธ๋ฆผ์ฒ๋ผ ํด์ ์ถฉ๋์ด ๋ฌ๋ค๋ฉด Value ๋ถ๋ถ์ด Linked List๋ก ๋ณํ๋์ด ๊ฐ์ ์์น์ ๊ฐ๋ค์ด ์ ์ฅ๋ ๊ฒ์ด๋ค.
4. GET์ ์๋์๋ฆฌ
์ด์ ๋ KEY๊ฐ์ ํตํด ๊ทธ์ ๋์๋๋ VALUE ๊ฐ์ ์ด๋ป๊ฒ ์ฐพ์๋ด๋์ง ์์๋ณด์.
a. KEY ๊ฐ์ Hash ๊ฐ์ผ๋ก ๋ฐ๊พธ๊ธฐ
PUT์์์ ๋ง์ฐฌ๊ฐ์ง๋ก hashcode()
๋ฅผ ํ์ฉํด Key โ hashcode๋ก ๋ณํํ๊ณ , ๋ค์ ํด์ํจ์๋ฅผ ํ์ฉํด hashcode โ hash ๊ฐ์ผ๋ก ๋ณํํ๋ค.
b. Hash Bucket์์ hash ๊ฐ์ ๋์ํ๋ value ์ป๊ธฐ
ํด์๊ฐ์ Hash Bucket์ index์์ผ๋ก, ๊ทธ์ ๋์ํ๋ value๋ฅผ ์ฐพ์๋ด์ ๋ฐํํ๋ฉด ๋๋ค. ํ์ง๋ง Hash ์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ? ์ด๋๋ HashMap ๋ด๋ถ์ equals() ํจ์๋ฅผ ํ์ฉํ๋ค. equals๋ฅผ ํตํด ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ KEY ๊ฐ๊ณผ BUCKET์ ์ ์ฅ๋ ๋ฐ์ดํฐ ์ ์ค KEY ๊ฐ ๊ฐ์ ๋๋ฑ์ฑ์ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
๋ง์ฝ equals()์ ๋ํ ์ฌ์ ์๋ฅผ ํ์ง ์์๋ค๋ฉด, Object์ equals()๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ฌ ์ฐธ์กฐ ์๋ฃํ์ ์ฃผ์๊ฐ๋ผ๋ฆฌ ์๋ก ์ผ์นํ๋์ง๋ฅผ ํ์ธํ๊ฒ ๋ ๊ฒ์ด๋ค.
5. Custom ๊ฐ์ฒด๋ฅผ KEY๋ก ์ฌ์ฉํ์ง ๋ชปํ๋ ์ด์ ?
HashMap์ด ์๋ฏธ์ ์ผ๋ก ๋๋ฑํ KEY ๊ฐ์ ๋๋ฑํ๋ค๊ณ ์ธ์ํ์ง ๋ชปํ๋ค.
๋๋ฑํ๋ค๊ณ ์ธ์ํ์ง ๋ชปํ๋ ์ด์ ๋ PUT, GET ์ค๋ช ์์ ๋ค ๋์๋ค.
๋ค์ ์ดํด๋ณด๋ฉด
- PUT์ ํ ๋, ๊ฐ์ด ์ ์ฅ๋ ์์น๊ฐ ๋๋ Hash๊ฐ์ ๋ง๋๋ ์ฌ๋ฃ์ธ
hashcode()
๋ฅผ ์ฐธ์กฐ์๋ฃํ์ ์ฃผ์๋ก ๋ง๋ ๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฏธ์ ์ผ๋ก ๋๋ฑํ๋ ๋ง๋ , ๋ชจ๋ ์ ๋ ฅ๊ฐ์ HashCode๊ฐ ๋ฌ๋ผ์ง ๊ฒ์ด๋ค. - GET์ ํ ๋ ๋์ผํ Hash๊ฐ์ ์ ์ฅ๋ ๊ฐ๋ค ์ฌ์ด์์ ํ์ฌ KEY์ ๋๋ฑํ ๊ฐ์ ์ฐพ๊ธฐ ์ํด์
equals()
๋ฅผ ํ์ฉํ๋ค. ํ์ง๋ง ๋น๊ตํ๋ ๋ KEY์ ์ฃผ์๊ฐ์ด ์ผ์นํ๋์ง ํ์ธํ๋ค๋ฉด, ์๋ฏธ์ ์ผ๋ก ๋๋ฑํ๋ ๋ง๋ ๋ชจ๋ equals()๊ฐ false๋ฅผ ๋ฐํํ ๊ฒ์ด๋ค.
์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋๋ฌธ์, ์๋ฏธ์ ์ผ๋ก ๋๋ฑํ KEY ๊ฐ์ด HashMap์ ์ค๋ณต ์ ์ฅ๋๋ค. ์ด๋ HashMap ์๋ฃ๊ตฌ์กฐ์ ์ ์๋ฅผ ํด์น๋ค.
๋ ๋ฒ์งธ ๋ฌธ์ ๋๋ฌธ์, ์๋ฏธ์ ์ผ๋ก ๋๋ฑํ KEY ๊ฐ์ ์
๋ ฅ์ผ๋ก ๋ฐ์๋ ์ํ๋ VALUE๋ฅผ ์กฐํํ์ง ๋ชปํ๊ฒ ๋๋ค.
์์ ๊ฐ์ ์ด์ ๋ก ๋ฐ ๋น ์ง ๋ ์ ๋ฌผ ๋ถ๊ธฐ๊ฐ ๋๋ค.
6. ๊ทธ๋๋ Custom ๊ฐ์ฒด๋ฅผ KEY๋ก ์ฌ์ฉํ๋ ค๋ฉด?
๋ฌธ์ ๊ฐ ๋์๋ hashcode()
์ equals()
๋ฅผ ๋๋ฑํ ๊ฐ์ ๋๋ฑํ๋ค๊ณ ์ธ์ํ ์ ์๊ฒ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
์ผ๋ก๋ก ์ฐ๋ฆฌ๊ฐ HashMap์ ์์ฃผ ์ฌ์ฉํ๋ Wrapper Class
๋ hashcode()์ equals()๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ ์ํ๊ณ ์๋ค. ๋ํ์ ์ผ๋ก Integer Class
๋ฅผ ๋ณด๋ฉด
@Override
public int hashCode() {
return value; // value๋ Integer ๊ฐ์ฒด๊ฐ ์ ์ฅํ๊ณ ์๋ int ๊ฐ
}
hashcode()
๋ ๊ทธ๋ฅ Integer ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ ๊ทธ๋๋ก ๋ฐํํ๋๋ก ํด์, ๊ฐ์ ๊ฐ์ ๊ฐ์ Hash Bucket ์์น์ ์ ์ฅ๋๋๋ก ํ ๊ฒ์ด๋ค. ์ด ๋๋ฌธ์ ์ฐ๋ฆฌ๋ HashMap ์ฌ์ฉ ์ ์๋ฏธ์ ์ผ๋ก ๋๋ฑํ Key๊ฐ์ด ์ค๋ณต ์ ์ฅ ๋์ง ์๋ ๊ฒ์ด๋ค.
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true; // ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ
}
if (obj instanceof Integer) {
return value == ((Integer) obj).value; // ๋ด๋ถ ๊ฐ์ ๋น๊ต
}
return false; // ํ์
์ด ๋ค๋ฅด๊ฑฐ๋ ๊ฐ์ด ๋ค๋ฅด๋ฉด false
}
equals()
๋ ์กฐ๊ธ ๋ณต์กํ๋ฐ, ์
๋ ฅ์ผ๋ก Object ๊ฐ์ฒด๊ฐ ๋ค์ด์์ ๋น๊ตํ๋ ๋์๋ผ๋ฆฌ ๋์ผ ํ์
์ธ์ง ์ฒดํฌํ๋ ์ฝ๋๊ฐ ํ์ํด์ ๊ทธ๋ ๋ค. ๊ทธ ๋ค์์ ์๋ฏธ์ ์ผ๋ก ๊ฐ์์ง๋ฅผ ์ฒดํฌํ๋ ์ฝ๋์ด๋ค.