์๋ฐ [JAVA] - Comparable ๊ณผ Comparator์ ์ดํด
์๋ฐ [JAVA] - Comparable ๊ณผ Comparator์ ์ดํด
์๋ง ์ด ๊ธ์ ์ฐพ์ ์ค์ ๋ถ๋ค ๋๊ฐ๋ Comparable๊ณผ Comparator์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฑฐ๋ ๊ถ๊ธํด์ ์ฐพ์์ค์ จ์ ๊ฒ์ด๋ค. ์ฌ์ค ์๊ณ ๋ณด๋ฉด ๋ ๊ฐ๋ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ผ๋ ์๋ฌด๋๋ ์๋ฐ๋ฅผ ํ์ตํ๋ฉด์ ๊ฐ
st-lab.tistory.com
์ ์๋ ๋ธ๋ก๊ทธ.
์ดํดํ ๋ ๊น์ง ์ฝ๋๋ค.

โ ์ ๋ค๋ฆญ ์ด์ ์ฝ๋์ ๋ฌธ์ ์ : "ํ์ ์์ ์ฑ์ ๋ถ๊ดด"
์ ๋ค๋ฆญ ์ฝ๋๋ ์๋ฌด๊ฑฐ๋ ๋ค ๋ด์ ์ ์๋ ์ฅ์ ์ด ๋ ์ ์์ง๋ง, ๋์์ "๋ฌด์์ด ๋ด๊ฒจ ์๋์ง ํ์ธํ ๋ฐฉ๋ฒ์ด ์๋ค"๋ ์น๋ช ์ ์ธ ์ฝ์ ์ด ์๋ค.
1. ํ๋ก๊ทธ๋๋จธ์ ์ค์ ์๋๋ฆฌ์ค
// ์ ๋ค๋ฆญ์ด ์๋ List (Object๋ฅผ ์ ์ฅํจ)
List list = new ArrayList();
// ํ๋ก๊ทธ๋๋จธ๋ ๋น์ฐํ Human ๊ฐ์ฒด๋ง ๋ค์ด์์ ๊ฒ์ด๋ผ ๊ฐ์ ํ๊ณ ์ฝ๋๋ฅผ ์งฌ
list.add(new Human("์ด๋ฌด์ง", 25));
list.add(new Human("์ด์ฐฝ์ญ", 30));
// ์ค์ ๋ฐ์: ์ค์๋ก Human ๊ฐ์ฒด๊ฐ ์๋ String ๋ฌธ์์ด์ ๋ฃ์ด๋ฒ๋ฆผ
list.add("์์ฌํ");
2. ์ปดํ์ผ๋ฌ์ ํ๋
- ์ปดํ์ผ ๊ณผ์ : ์ปดํ์ผ๋ฌ๋ list.add("์์ฌํ"); ๊ตฌ๋ฌธ์ ๋ณผ ๋ "์ด, ArrayList๋ Object๋ฅผ ๋ด๋ ๊ณณ์ด๋ค? ๋ฌธ์์ด(String)๋ Object์ ์์์ด๋๊น ํ์ฉ!"์ด๋ผ๊ณ ํ๋จ.
- ๊ฒฐ๊ณผ: ์ค๋ฅ(Error)๊ฐ ์ ํ ๋ฐ์ํ์ง ์๋๋ค. ์ปดํ์ผ๋ฌ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์๋ก ๋ค๋ฅธ ํ์ ์ ๋ฃ์๋์ง ์ ํ ์์ง ๋ชปํจ
3. ๋ฐํ์(์คํ ์)์ ์ฌ์
๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๋ ๋ฐ์ํ๋ค. ํ๋ก๊ทธ๋๋จธ๋ ๋ฆฌ์คํธ์ Human๋ง ์๋ค๊ณ ๋ฏฟ๊ณ ๊ฐ์ ํ๋ณํ(Casting)์ ์๋.
for (int i = 0; i < list.size(); i++) {
// ๐ก ํ๋ก๊ทธ๋๋จธ: "์ฌ๊ธด ๋ค Human ๊ฐ์ฒด์ผ!"
Human h = (Human) list.get(i);
System.out.println(h.getName());
}
- ๊ฒฐ๊ณผ: ๋ฆฌ์คํธ์ ๋ค์ด์๋ String ๊ฐ์ฒด๋ฅผ Human์ผ๋ก ๊ฐ์ ํ๋ณํํ๋ ค๋ ์๊ฐ, ClassCastException์ด๋ผ๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ ํ๋ก๊ทธ๋จ์ด ๊ทธ ์๋ฆฌ์์ ๊ฐ์ ์ข ๋ฃ.
โ ํต์ฌ ์ฐจ์ด์ : "์ปดํ์ผ vs ๋ฐํ์"
| ๊ตฌ๋ถ | ์ ๋ค๋ฆญ ์ด์ (Object ๊ด๋ฆฌ) | ์ ๋ค๋ฆญ ์ดํ (<Human> ๋ช ์) |
| ํ์ ํ์ธ ์์ | ๋ฐํ์ (ํ๋ก๊ทธ๋จ ์คํ ์ค) | ์ปดํ์ผ (์ฝ๋ ์์ฑ ๋ฐ ๋น๋ ์ค) |
| ์ค๋ฅ ๋ฐ๊ฒฌ | ์คํ ์ค์ ํฐ์ ธ์ ํ๋ก๊ทธ๋จ ๋ฉ์ถค | ์ฝ๋๋ฅผ ์ง๋ ์ค์ ๋นจ๊ฐ ์ค๋ก ๊ฒฝ๊ณ ํจ |
| ์์ ์ฑ | ๋งค์ฐ ๋ฎ์ (์ค์ ๋ฐฉ์ง ๋ถ๊ฐ) | ๋งค์ฐ ๋์ (์ค์ ์ฆ์ ์์ ๊ฐ๋ฅ) |
โ ์ ๋ค๋ฆญ์ด ํด๊ฒฐํ๋ ๋ฐฉ์ (์ค์ ์์ฒ ์ฐจ๋จ)
๋ง์ฝ List<Human> list = new ArrayList<>();๋ผ๊ณ ์ ๋ค๋ฆญ์ ๋ช ์ํ๋ค๋ฉด ์ด๋ค ์ผ์ด ์๊ธธ๊น.
List<Human> list = new ArrayList<>();
list.add(new Human("์ด๋ฌด์ง", 25));
// โ ์ปดํ์ผ๋ฌ์ ๊ฐ๋ ฅํ ์ ์ฌ
// "Human ํ์
๋ง ๋ค์ด์ฌ ์ ์๋๋ฐ, ์ String์ ๋ฃ์ผ๋ ค ํด?"
list.add("์์ฌํ"); // ๐ฉ ์ฌ๊ธฐ์ ์ฆ์ ์ปดํ์ผ ์๋ฌ ๋ฐ์!
์์ฝํ์๋ฉด:
์ ๋ค๋ฆญ์ ์ปดํ์ผ๋ฌ๊ฐ "์์ฑํ ์ฝ๋๊ฐ ํ์ ์ธก๋ฉด์์ ์๋ฒฝํ์ง ๋ฏธ๋ฆฌ ๊ฒ์ฌ"ํ๊ฒ ํจ์ผ๋ก์จ, ํ๋ก๊ทธ๋๋จธ์ ์ฌ์ํ ์ค์(๋ค๋ฅธ ํ์ ์ ๋ ฅ)๋ฅผ ์ฆ์ ์์ ๊ฐ๋ฅํ ์ํ๋ก ์ก์์ฃผ๋ ๊ฒ

์๋ฐ ์ปฌ๋ ์ ํ๋ ์์ํฌ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๊ณ ๋ง๋ '๋ฐ์ดํฐ ๋ณด๊ด์' ๋ชจ์์. ์ํฉ์ ๋ฐ๋ผ ๊ณจ๋ผ ์ธ ์ ์๊ฒ ๋๊ตฌ๋ค์ด ์ ๋ฆฌ๋์ด ์์.
1. ์ปฌ๋ ์ ํ๋ ์์ํฌ ํต์ฌ
์๋ฐ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ธํฐํ์ด์ค๋ค์ด์ผ. ํฌ๊ฒ ์ธ ๊ฐ์ง(Set, List, Queue)์ ๋ ๋ฆฝ์ ์ธ Map์ด ์์. ๋ค๋ค ์ ๋ค๋ฆญ(<E>)์ ์จ์ ์ํ๋ ์๋ฃํ๋ง ๋ฑ ๋ด์ ์ ์๊ฒ ๊ตฌํ๋์ด ์์.
2. Set ์ธํฐํ์ด์ค์ HashSet
Set์ '์ค๋ณต ์๋ ์ฃผ๋จธ๋'๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ.
- ์์ ์์: ๋ฃ์ ์์๋๋ก ๋์ค์ง ์์.
- ์ค๋ณต ๋ถ๊ฐ: ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด ๊ฑฐ๋ถํจ.
Set<String> set = new HashSet<>();
set.add("Toy");
set.add("Box");
set.add("Robot");
set.add("Box"); // ์ด๋ฏธ ์์ด์ ์ถ๊ฐ ์ ๋จ
// ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ๋ 3๊ฐ๋ง ๋จ์
3. "๊ทธ๋ ๋ค๋ฉด ๋์ผ ์ธ์คํด์ค์ ๊ธฐ์ค์?"
Set์ด ์ค๋ณต์ ํ๋ณํ๋ ค๋ฉด '์ด๊ฒ ๊ฐ์ ๋ฐ์ดํฐ์ธ์ง' ์์์ผ ํจ.
- ๊ธฐ๋ณธ ํด๋์ค(String ๋ฑ): ์๋ฐ๊ฐ ์ด๋ฏธ ๊ฐ์์ง ๋น๊ตํ๋ ๋ฒ์ ์๊ณ ์์ด์ ๋ฌธ์ ์์.
- ์ง์ ๋ง๋ ํด๋์ค(Human ๋ฑ): ์๋ฐ๊ฐ ๋ชจ๋ฆ. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ง์ equals()๋ hashCode()๋ฅผ ์ฌ์ ์ํด์ ์๋ ค์ค์ผ ํจ.
- hashCode(): ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ ํด์๊ฐ(์ฃผ์ํ) ์์ฑ.
- equals(): ํด์๊ฐ์ด ๊ฐ์ ๋, ์ค์ ๋ด์ฉ๋ฌผ์ด ๊ฐ์์ง 1:1 ๋น๊ต.
1. ํด์ ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ ๊ฐ๋
ํด์(Hash) ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํด ๋๋ ๊ธฐ์
์ฝ๊ฒ ๋งํด '๋์๊ด์ ๋ถ๋ฅ ์ฒด๊ณ'์ ๋น์ท
- ๋ถ๋ฅ ๋์: 3, 5, 7, 12, 25, 31
- ๋ถ๋ฅ ๊ท์น(ํด์ ํจ์): num % 3 (์ซ์๋ฅผ 3์ผ๋ก ๋๋ ๋๋จธ์ง)
๋ฐ์ดํฐ๋ฅผ 3์ผ๋ก ๋๋ ๋๋จธ์ง์ ๋ฐ๋ผ ๋ฐฉ(์ฐ์ฐ๊ฒฐ๊ณผ)์ 0, 1, 2๋ฒ์ผ๋ก ๋๋ด์.
- ์ฐ์ฐ๊ฒฐ๊ณผ 0: 3(3%3=0), 12(12%3=0)
- ์ฐ์ฐ๊ฒฐ๊ณผ 1: 7(7%3=1), 25(25%3=1), 31(31%3=1)
- ์ฐ์ฐ๊ฒฐ๊ณผ 2: 5(5%3=2)
2. ์ ์ด๋ ๊ฒ ๋ถ๋ฅํจ? (์๋ ๋๋ฌธ)
๋ง์ฝ ๋ฐ์ดํฐ๋ฅผ ์์ด๋๊ณ "25๊ฐ ์๋?"๋ผ๊ณ ๋ฌผ์ด๋ณด๋ฉด, ๋ฌด์ํ๊ฒ ํ๋์ฉ ๋ค ๋ค์ ธ์ผ ํจ. ํ์ง๋ง ์์ฒ๋ผ ๋ถ๋ฅ๋ฅผ ํด๋์ผ๋ฉด?
- "25 ์ฐพ์ผ๋ ค๋ฉด? 25 % 3 = 1์ด๋๊น ์ฐ์ฐ๊ฒฐ๊ณผ 1๋ฒ ๋ฐฉ๋ง ๋ค์ง๋ฉด ๋จ."
- ๋๋จธ์ง 0๋ฒ ๋ฐฉ๊ณผ 2๋ฒ ๋ฐฉ์ ์์ ์ณ๋ค๋ณผ ํ์๋ ์์. ์ด๊ฒ ํ์ ์๋๊ฐ ๋ฏธ์น ๋ฏ์ด ๋นจ๋ผ์ง๋ ์ด์ ์.
3. ์๋ฐ์ hashCode() ๋ฉ์๋
์๋ฐ์ Object ํด๋์ค์ ์๋ hashCode()๋ ๋ฐ๋ก ์ด ์ญํ ์ ํจ.
- ์ฐ๋ฆฌ๊ฐ HashSet์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ผ๋ฉด, ์๋ฐ๋ ๊ทธ ๊ฐ์ฒด์ hashCode()๋ฅผ ํธ์ถํด์ "์ด ๋ ์์ ๋ช ๋ฒ ๋ฐ๊ตฌ๋์ ๋ด์๊น?"๋ฅผ ๊ฒฐ์ ํจ.
- ๊ทธ๋ฆฌ๊ณ ๋์ equals()๋ฅผ ํธ์ถํด "ํน์ ์ด ๋ฐ๊ตฌ๋์ ๋๊ฐ์ ๋ด์ฉ๋ฌผ ๊ฐ์ง ๋์ด ์ด๋ฏธ ์๋?"๋ฅผ ํ์ธํด์ ์ค๋ณต์ ๊ฑธ๋ฌ๋ด๋ ๊ฒ์.
์์ฝํ์๋ฉด:
- hashCode(): ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ฐ๊ตฌ๋ ์ฃผ์๋ฅผ ์ ํ๋ '๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ'
- equals(): ๋ฐ๊ตฌ๋ ์์์ ์ง์ง ๊ฐ์์ง ํ์ธํ๋ '๊ฒ์ฆ ์๊ณ ๋ฆฌ์ฆ'
'๊ฐ๋ฐ์ ํธ์์ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Java ๋ฏธ๋ ํ๋ก์ ํธ ์ ์ ๊ณผ์ (0) | 2026.06.06 |
|---|---|
| [Class-12] ๊ธฐ๋ณธ API (0) | 2026.06.02 |
| [Class -11] ์์ / ์์ธ์ฒ๋ฆฌ / ์ ์ถ๋ ฅ(OI) (0) | 2026.06.01 |
| [์ฃผ๊ฐ KPT] 5์ 26์ผ~29์ผ / ๋๊ฐ๋ฆฌ ๋นก๋นก์น๋ฉฐ (0) | 2026.05.29 |
| [Class-10] ๋คํ์ฑ Polymorphism (0) | 2026.05.29 |