๊ฐœ๋ฐœ์ž ํ˜ธ์†Œ์ธ

[Class-13] ์ œ๋„ค๋ฆญ / ์ปฌ๋ ‰์…˜

๋ฆฌ์ œ๐Ÿซง 2026. 6. 4. 14:32

์ž๋ฐ” [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์€ '์ค‘๋ณต ์—†๋Š” ์ฃผ๋จธ๋‹ˆ'๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ.

  • ์ˆœ์„œ ์—†์Œ: ๋„ฃ์€ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜ค์ง€ ์•Š์Œ.
  • ์ค‘๋ณต ๋ถˆ๊ฐ€: ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋˜ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋ฉด ๊ฑฐ๋ถ€ํ•จ.
Java
 
Set<String> set = new HashSet<>();
set.add("Toy");
set.add("Box");
set.add("Robot");
set.add("Box"); // ์ด๋ฏธ ์žˆ์–ด์„œ ์ถ”๊ฐ€ ์•ˆ ๋จ
// ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋Š” 3๊ฐœ๋งŒ ๋‚จ์Œ

3. "๊ทธ๋ ‡๋‹ค๋ฉด ๋™์ผ ์ธ์Šคํ„ด์Šค์˜ ๊ธฐ์ค€์€?"

Set์ด ์ค‘๋ณต์„ ํŒ๋ณ„ํ•˜๋ ค๋ฉด '์ด๊ฒŒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์ธ์ง€' ์•Œ์•„์•ผ ํ•จ.

  • ๊ธฐ๋ณธ ํด๋ž˜์Šค(String ๋“ฑ): ์ž๋ฐ”๊ฐ€ ์ด๋ฏธ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์–ด์„œ ๋ฌธ์ œ์—†์Œ.
  • ์ง์ ‘ ๋งŒ๋“  ํด๋ž˜์Šค(Human ๋“ฑ): ์ž๋ฐ”๊ฐ€ ๋ชจ๋ฆ„. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ equals()๋ž‘ hashCode()๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์•Œ๋ ค์ค˜์•ผ ํ•จ.
  1. hashCode(): ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋•Œ ํ•ด์‹œ๊ฐ’(์ฃผ์†Œํ‘œ) ์ƒ์„ฑ.
  2. 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()๋ฅผ ํ˜ธ์ถœํ•ด "ํ˜น์‹œ ์ด ๋ฐ”๊ตฌ๋‹ˆ์— ๋˜‘๊ฐ™์€ ๋‚ด์šฉ๋ฌผ ๊ฐ€์ง„ ๋†ˆ์ด ์ด๋ฏธ ์žˆ๋‚˜?"๋ฅผ ํ™•์ธํ•ด์„œ ์ค‘๋ณต์„ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๊ฒƒ์ž„.

์š”์•ฝํ•˜์ž๋ฉด:

  1. hashCode(): ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋ฐ”๊ตฌ๋‹ˆ ์ฃผ์†Œ๋ฅผ ์ •ํ•˜๋Š” '๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜'
  2. equals(): ๋ฐ”๊ตฌ๋‹ˆ ์•ˆ์—์„œ ์ง„์งœ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š” '๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜'