Skip to content

villainscode/collections

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

11 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Collections

๋ณธ ๋‚ด์šฉ์€ ํ•œ๋น›๋ฏธ๋””์–ด์—์„œ ์ถœ๊ฐ„ํ•œ ์ฑ…(๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋…ธํŠธ)์˜ ์ผ๋ถ€ ๋‚ด์šฉ์„ ๋ณด๊ฐ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“  Collection Framework ๊ฐ€์ด๋“œ ์ž…๋‹ˆ๋‹ค.
์ฑ…์˜ ๋ถ„๋Ÿ‰์ƒ ์ฝ”๋“œ๋‚˜ ์ด๋ก ๋“ฑ์˜ ๋‚ด์šฉ์„ ๋‹ค ๋‹ด์•„๋‚ด์ง€ ๋ชปํ•˜์˜€๊ธฐ์— ๋ฌธ์„œ๋กœ ์ถ”๊ฐ€์ ์ธ ์„ค๋ช…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์„ค๋ช…์—์„œ๋Š” ํƒ€์ดํ•‘์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์กด๋Œ€๋ฅผ ์ƒ๋žตํ–ˆ์œผ๋‹ˆ ์–‘ํ•ด ๋ฐ”๋ž๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๋‚ด์šฉ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์˜ค/ํƒˆ์ž๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ [email protected]์œผ๋กœ ๋ฉ”์ผ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Table of contents generated with markdown-toc

์ฑ… ์†Œ๊ฐœ

[์—ฐ๋ด‰์˜ ์•ž์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š”] ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ ๋…ธํŠธ

  • 2024.03.25, ํ•œ๋น›๋ฏธ๋””์–ด, ์ด๋‚จํฌ(codevillain) ์ €

์‹ ์ž… ๋ฐ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ง๊ตฐ์˜ ์ทจ์—… ๋ฐ ์ด์ง์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ

์„œ๋ฅ˜ ์ž‘์„ฑ ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ , ์œ ๋งํ•œ ํšŒ์‚ฌ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•, ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์™€ ๊ธฐ์ˆ  ๋ฉด์ ‘์„ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•ด ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…๋“ค์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ๋ฉด์ ‘์—์„œ ๋ฉด์ ‘๊ด€์ด ๋˜์ง€๋Š” ์งˆ๋ฌธ์˜ ์˜๋„์™€ ํ•ด๋‹น ์งˆ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‹ต๋ณ€ํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์งˆ์ ์ธ ๋Œ€์ฒ˜๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๊ธฐ์ˆ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์•„์šธ๋Ÿฌ ๊ธฐ์ˆ ๋ฉด์ ‘์„ ๋„˜์–ด ์ธ์„ฑ๋ฉด์ ‘์—์„œ ๊ฐ€์ ธ์•ผํ•  ๋งˆ์Œ๊ฐ€์ง๊ณผ ๋ฆฌ๋”์‹ญ ์›์น™, ์ •๋‹ต์ด ์—†๋Š” ์งˆ๋ฌธ์— ๋Œ€์ฒ˜ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ๋ก€๋“ค์„ ์†Œ๊ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ทจ์—… ๋ฐ ์ด์ง์˜ ์ƒํ™ฉ์—์„œ ๋ณธ์ธ์ด ์ค€๋น„ํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ๋งž๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ  ์ปค๋ฆฌ์–ด ํŒจ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”์ง€ ์‹ค์ฒœ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•จ์œผ๋กœ์„œ ๋„์›€์„ ์ฃผ๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ธํ”„๋Ÿฐ ๊ฐ•์˜

Collection Framework์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

1. ์ž๋ฐ”์˜ ์ž๋ฃŒ๊ตฌ์กฐ

Java๋Š” ๊ธฐ๋ณธํƒ€์ž…(์›ํ˜•, Primitive ํƒ€์ž… ๋˜๋Š” ์›์‹œํ˜•์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค)์˜ ์ž๋ฃŒ ์ด์™ธ์—๋„ String ์ด๋‚˜ ๋ฐฐ์—ด(์ฐธ์กฐํ˜• ํƒ€์ž…, Reference Type)์ด ์กด์žฌํ•œ๋‹ค. ์ฐธ์กฐํ˜• ํƒ€์ž…์€ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, String์€ ์ž๋ฐ”์˜ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ ํด๋ž˜์Šค๋กœ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๊ณ  ๋‹ค๋ฃจ๊ณ , ๋ฐฐ์—ด๋„ ์ฐธ์กฐํ˜• ํƒ€์ž…์— ์†ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐธ์กฐํ˜• ํƒ€์ž…์€ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ• ๋‹น๋˜๊ณ , ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค. ์ด ๋ฐ–์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Collection ํƒ€์ž…๋„ ์กด์žฌํ•œ๋‹ค.

๊ทธ๋ฆผ 1

์ฝœ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” java.util ํŒจํ‚ค์ง€ ์•ˆ์— ์œ„์น˜ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ ๋˜์–ด์žˆ๋‹ค. ์ฃผ์š” ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • List: ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์„ ๋‹ค๋ฃจ๋ฉฐ, ๋ฐ์ดํ„ฐ ์ค‘๋ณต์„ ํ—ˆ์šฉ. ArrayList, LinkedList ๋“ฑ์ด ์žˆ๋‹ค.
  • Set: ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ , ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ. HashSet, LinkedHashSet, TreeSet ๋“ฑ์ด ์žˆ๋‹ค.
  • Queue: FIFO(First In First Out) ๋ฐฉ์‹ ๋˜๋Š” ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค. LinkedList, PriorityQueue๋“ฑ์ด ์ด์— ์†ํ•œ๋‹ค.
  • Map: ํ‚ค(Key)์™€ ๊ฐ’(Value)์˜ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ. ํ‚ค๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ฐ ํ‚ค๋Š” ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. HashMap, TreeMap, LinkedHashMap ๋“ฑ์ด ์žˆ๋‹ค.

์ฝœ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด์„œ๋Š” ๋ณธ ๋ฌธ์„œ์—์„œ ์ค‘์ ์ ์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.

์„ค๋ช…์— ์•ž์„œ ๋ฐฐ์—ด์„ ๋จผ์ € ์‚ดํŽด๋ณด์ž.

๊ธฐ๋ณธ์ ์œผ๋กœ int ํƒ€์ž…์ด๋‚˜ String ํƒ€์ž…์˜ ์ž๋ฃŒ๋“ค์„ ์—ฌ๋Ÿฌ๊ฑด ๋‹ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์•„๋ž˜์˜ ์ƒ˜ํ”Œ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

int[] ids;
int[] ids = new int[5];

String[] userInfoArray = new String[10];
String[] userInfoArray = new String[] {"one", "two"};

์œ„์˜ ๊ตฌ๋ฌธ์€ ๋ฐฐ์—ด์˜ ์„ ์–ธ๋ถ€์ด๋‹ค.

๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” int arrayLength = userInfoArray.length; ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด์˜ ์š”์†Œ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐ˜๋ณต ์ ‘๊ทผ์„ ํ†ตํ•ด ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

for (int I = 0; I < userInfoArray.length; i++) {
    String s = userInfoArray[i];
}

๋˜, System.arraycopy(src, srcPos, dest, destPos, length)์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์„ ๋ณต์‚ฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, java.util.Arrays.sort ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

๋ฐฐ์—ด์„ ์“ฐ๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ๊ณผ ์‚ฌ์šฉ์ด ๋งค์šฐ ํšจ์œจ์ (ํŠน์ • ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๋งค์šฐ ๋น ๋ฆ„)
  • Type-safe : ๋ฐฐ์—ด์— ์„ ์–ธ๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ์ถ”๊ฐ€๋ ์ˆ˜ ์žˆ์Œ
  • ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•จ

๋ฐ˜๋ฉด, ๋‹จ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๊ณ ์ • ํฌ๊ธฐ, ๋ณต์‚ฌ์™€ ํฌ๊ธฐ ์žฌ์กฐ์ •์— ์˜ค๋ฒ„ํ—ค๋“œ ์กด์žฌ
  • ๋ฐฐ์—ด์•ˆ์— ๋ช‡ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์ผ์ผ์ด ๊ฒ€์‚ฌํ•ด์•ผํ•จ
  • ์ฝœ๋ ‰์…˜์— ๋น„ํ•ด ์ œํ•œ๋œ ๊ธฐ๋Šฅ, ์ข€ ๋” ๋ฒ”์šฉ์ ์ธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•จ

์ด ๊ฐ™์€ ์ด์œ  ๋•Œ๋ฌธ์— ์ข€ ๋” ๋‹ค์ด๋‚ด๋ฏนํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ธ Collection์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

2. Collection ์ธํ„ฐํŽ˜์ด์Šค

Collection์€ ๊ฐ์ฒด๋“ค์„ ๋ชจ์•„๋‘” ์ž๋ฃŒ ๊ตฌ์กฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐœ๋…์ด๋‹ค.

๋ชจ๋“  Collection์˜ ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ์จ Collection๋“ค์ด ๊ฐ–๊ณ  ์žˆ๋Š” ํ•ต์‹ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•œ๋‹ค.

List ์™€ Set ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ชจ๋‘ Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•ต์‹ฌ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ์˜ ์—ฐ์‚ฐ์ด Collection ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ ๋˜์–ด ์žˆ์Œ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค

Collection ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋ ค๋ฉด Collection ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” java.util ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•ด ์žˆ์œผ๋ฉฐ, ์ปฌ๋ ‰์…˜์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

  • boolean add(E e): ์ง€์ •๋œ ์š”์†Œ๋ฅผ ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • boolean remove(Object o): ์ง€์ •๋œ ์š”์†Œ๋ฅผ ์ปฌ๋ ‰์…˜์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
  • boolean contains(Object o): ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ์ปฌ๋ ‰์…˜์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • int size(): ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ์š”์†Œ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • boolean isEmpty(): ์ปฌ๋ ‰์…˜์ด ๋น„์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Iterator iterator(): ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ˜๋ณต์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • void clear() : ์ปฌ๋ž™์…˜์„ ๋น„์šด๋‹ค.

Collection ํ•˜์œ„๋กœ Set ๊ณ„์—ด(TreeSet, SortedSet, LinkedHashSet, HashSet)๊ณผ List ๊ณ„์—ด(ArrayList, LinkedList, Vector)๋“ฑ์ด ์žˆ์œผ๋ฉฐ ์ด์™€๋Š” ๋ณ„๋„๋กœ Map ๊ณ„์—ด(SortedMap, TreeMap, HashMap, Hashtable)์ด ์กด์žฌํ•œ๋‹ค.
Map์€ Collection์„ ํ™•์žฅํ•˜์ง€ ์•Š์•˜์ง€๋งŒ Collection์˜ ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ์™ธ์—๋„ Queue์™€ Deque๊ฐ€ ์žˆ๋‹ค.(ํ์™€ ๋ฑ์˜ ์ฐจ์ด๋‚˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ํ•ด์„œ๋Š” ์ฑ…์— ๋” ์ž์„ธํžˆ ์„ค๋ช… ๋˜์–ด์žˆ๋‹ค.)

๊ทธ๋ฆผ 2

์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด Collection ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ „๋ฐ˜์ ์ธ ์ƒ์†๊ณผ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ฃผ์š” ๊ตฌํ˜„ ํด๋ž˜์Šค๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 3

ArrayList: ํฌ๊ธฐ ์กฐ์ ˆ์ด ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„๋œ ๋ฆฌ์ŠคํŠธ.

LinkedList: ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„๋œ ๋ฆฌ์ŠคํŠธ ๋ฐ ํ.

HashSet: ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์˜ํ•ด ๊ตฌํ˜„๋œ ์ง‘ํ•ฉ.

LinkedHashSet: ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์˜ํ•ด ๊ตฌํ˜„๋œ ์ง‘ํ•ฉ.

TreeSet: ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์— ์˜ํ•ด ๊ตฌํ˜„๋œ ์ •๋ ฌ๋œ ์ง‘ํ•ฉ.

PriorityQueue: ์šฐ์„ ์ˆœ์œ„ ํž™์— ์˜ํ•ด ๊ตฌํ˜„๋œ ํ.

ArrayDeque: ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฑ.

2-1 List ์ธํ„ฐํŽ˜์ด์Šค

Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•œ ์ž๋ฃŒํ˜•์œผ๋กœ ์š”์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์ €์žฅํ•˜์—ฌ ์ƒ‰์ธ(Index)์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์œ„์น˜์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๊ณ  ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•œ๋‹ค. ๊ฐ€๋ณ€ํ˜• ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜๋‹ค.

์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ˆœ์„œ ์œ ์ง€: ์š”์†Œ๊ฐ€ ์‚ฝ์ž…๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ: ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์œ„์น˜์˜ ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
์ค‘๋ณต ํ—ˆ์šฉ: ๋™์ผํ•œ ์š”์†Œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  • List๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค : ArrayList, LinkedList , Vector ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.
  • ArrayList
    • ๋‚ด๋ถ€์ ์œผ๋กœ ๋™์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค.
      • ์ƒ๋‹นํžˆ ๋น ๋ฅด๊ณ  ํฌ๊ธฐ๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด
      • ์š”์†Œ์˜ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ, ๋žœ๋ค ์—‘์„ธ์Šค๊ฐ€ ํšจ์œจ์ ์ด๋‹ค.
    • ๋‹จ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ ๊ตฌ์กฐ๋กœ ์ž๋ฃŒ์— ๋Œ€ํ•œ ์ˆœ์ฐจ์ ์ธ ์ ‘๊ทผ์— ๊ฐ•์ ์ด ์žˆ์Œ
    • ์š”์†Œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • Vector
    • ArrayList์˜ ๊ตฌํ˜• ๋ฒ„์ „. ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋˜์–ด ์žˆ์Œ(thread safe)
    • ๋А๋ ค์„œ ์ž˜ ์“ฐ์ด์ง„ ์•Š์Œ
  • LinkedList
    • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„
    • ์–‘๋ฐฉํ–ฅ ํฌ์ธํ„ฐ ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•  ๊ฒฝ์šฐ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์žฅ.
      • ์š”์†Œ์˜ ์ ‘๊ทผ ์†๋„๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
    • ์Šคํƒ, ํ, ์–‘๋ฐฉํ–ฅ ํ ๋“ฑ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์“ฐ์ž„
  • CopyOnWriteArrayList
    • ์“ฐ๊ธฐ ์‹œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„
    • ์ฝ๊ธฐ ์ž‘์—…์€ ๋งค์šฐ ๋น ๋ฅด์ง€๋งŒ, ์“ฐ๊ธฐ ์ž‘์—…์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ.

๋‹ค์Œ์˜ ํ™œ์šฉ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž. (src ํ•˜์œ„์˜ java/main์—์„œ ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. com.codevillains.collection.method ํŒจํ‚ค์ง€ ์ฐธ์กฐ )

/**
 * @author CodeVillains
 * @description : ArrayList ์ „์ฒด ๋ฉ”์„œ๋“œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด๋ณธ๋‹ค. 
 */
package com.codevillains.collection.method;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ArrayListMethodExample {
  public static void main(String[] args) {
    // List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ArrayList ๊ตฌํ˜„ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ
    List<String> list = new ArrayList<>();

    // ์š”์†Œ ์ถ”๊ฐ€
    list.add("Apple");
    list.add("Banana");
    list.add("Cherry");
    System.out.println("์ตœ์ดˆ list: " + list);

    // ์š”์†Œ ์‚ฝ์ž…
    list.add(1, "Orange");
    System.out.println("์š”์†Œ ์‚ฝ์ž… ์ธ๋ฑ์Šค 1,  'Orange' : " + list);

    // ์ปฌ๋ ‰์…˜ ์ถ”๊ฐ€
    List<String> additionalFruits = new ArrayList<>();
    additionalFruits.add("Grape");
    additionalFruits.add("Watermelon");
    list.addAll(additionalFruits);
    System.out.println("collection ์ถ”๊ฐ€ : " + list);

    System.out.println("2๋ฒˆ์งธ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ : " + list.get(2));

    // ์š”์†Œ ์ˆ˜์ •
    list.set(2, "Grapes");
    System.out.println("2๋ฒˆ์งธ ์š”์†Œ ๋ณ€๊ฒฝ : " + list);

    // ์š”์†Œ ์‚ญ์ œ (์ธ๋ฑ์Šค๋กœ)
    String removedElement = list.remove(3);
    System.out.println("3๋ฒˆ์งธ ์š”์†Œ ์‚ญ์ œ: " + removedElement);
    System.out.println("3๋ฒˆ์งธ ์š”์†Œ ์‚ญ์ œ ํ›„ collection: " + list);

    // ์š”์†Œ ์‚ญ์ œ (๊ฐ์ฒด๋กœ)
    boolean isRemoved = list.remove("Banana");
    System.out.println("๋ฐ”๋‚˜๋‚˜ ์‚ญ์ œ ์—ฌ๋ถ€: " + isRemoved);
    System.out.println("๋ฐ”๋‚˜๋‚˜ ์‚ญ์ œ ํ›„ collection: " + list);

    // ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ
    System.out.println("List ์‚ฌ์ด์ฆˆ: " + list.size());

    // ๋ฆฌ์ŠคํŠธ ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
    System.out.println("๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ? " + list.isEmpty());

    // ์š”์†Œ ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ
    boolean containsApple = list.contains("Apple");
    System.out.println("์‚ฌ๊ณผ๊ณผ ํฌํ•จ๋˜์–ด ์žˆ๋‚˜? " + containsApple);

    // ๋ฆฌ์ŠคํŠธ ๋ฐ˜๋ณต
    System.out.println("list iterating :");
    for (String fruit : list) {
      System.out.println(fruit);
    }

    // ๋ฆฌ์ŠคํŠธ ๋ฐ˜๋ณต์ž ์‚ฌ์šฉ
    ListIterator<String> listIterator = list.listIterator();
    System.out.println("list ๋ฐ˜๋ณต์ž ์‚ฌ์šฉ :");
    while (listIterator.hasNext()) {
      System.out.println(listIterator.next());
    }

    // ํ•˜์œ„ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
    List<String> subList = list.subList(1, 3);
    System.out.println("SubList index 1๋ถ€ํ„ฐ 3๊นŒ์ง€: " + subList);

    // ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
    list.clear();
    System.out.println("list ์ดˆ๊ธฐํ™”: " + list);
    System.out.println("๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‚˜? " + list.isEmpty());
  }
}

๊ฐ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

2-2 Set ์ธํ„ฐํŽ˜์ด์Šค

์ง‘ํ•ฉ์„ ์ •์˜ํ•˜๋ฉฐ ์š”์†Œ์˜ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์Šค์Šค๋กœ ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋Š” ์—†๋‹ค. (์ƒ์œ„ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ)

  • Set ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค : HashSet, LinkedHashSet, TreeSet๋“ฑ์ด ์กด์žฌ.
  • HashSet
    • ๊ฐ€์žฅ ๋น ๋ฅธ ์ž„์˜ ์ ‘๊ทผ ์†๋„
    • ์ˆœ์„œ๋ฅผ ์ „ํ˜€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Œ
  • LinkedHashSet
    • ์ถ”๊ฐ€๋œ ์ˆœ์„œ, ๋˜๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ ‘๊ทผํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • TreeSet
    • ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ด€. ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

3. Collection์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

Java 1.5 Generic ๋ฐฉ์‹์ด ๋‚˜์˜จ ํ›„ ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด Collection์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

List<String> list= new ArrayList<String>();
List <String> userList= new ArrayList <String> (5);
Map<String, Object> userMap= new HashMap<String, Object> ();
Set<String> userSet= new HashSet<String> ();

์œ„ ๋ฐฉ์‹์€ Java 1.5 ๋ฒ„์ „์ด ๋‚˜์˜ค๊ณ  Generic ๊ฐ€ ์ถ”๊ฐ€ ๋œ ์ดํ›„ ์ฝ”๋“œ๋ผ์„œ ์˜ˆ์‹œ๋กœ์จ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ํ˜„์žฌ์˜ ์ฝ”๋“œ ์ค€์ˆ˜ ์†”๋ฃจ์…˜์€ java.util.Collections ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋นˆ Collection ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌํ„ดํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

List<User> list = Collections.EMPTY_LIST;       // ๋น„๊ถŒ์žฅ  
Map<String, Object> maps = Collections.EMPTY_MAP; // ๋น„๊ถŒ์žฅ 
Set<String> sets = Collections.EMPTY_SET;         // ๋น„๊ถŒ์žฅ 

// 1.5 Generic์œผ๋กœ ์ธํ•œ List<T> ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
List<User> collection1 = Collections.emptyList();
Map<String, String> collection2 = Collections.emptyMap();
Set<String> collection3 = Collections.emptySet();

List list = Collections.EMPTY_LIST์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š์•„ ํƒ€์ž… ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์–ด์„œ Collections.emptyList()๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ถŒ์žฅํ•œ๋‹ค. Collections.emptyList() ๋Š” ๋ถˆ๋ณ€๊ฐ์ฒด๋กœ์จ ๊ฐ’์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ์—๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

Collections.EMPTY_LIST, Collections.EMPTY_MAP, Collections.EMPTY_SET๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๋น„์ œ๋„ค๋ฆญ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, List<User> ๋Œ€์‹  List๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์บ์ŠคํŒ… ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์˜ Collections.java ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๋ณด๋ฉด ๊ธˆ๋ฐฉ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

...
public static final List EMPTY_LIST = new EmptyList<>();

Collections.emptyList() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๋Š” List ํƒ€์ž…์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. Collection ์˜ ์‚ฌ์šฉ

Collection ์ธํ„ฐํŽ˜์ด์Šค๋Š” java.lang ํŒจํ‚ค์ง€์˜ Iterable๋ฅผ extends ํ•˜๊ณ  ์žˆ๋Š” root ์ธํ„ฐํŽ˜์ด์Šค๋กœ, List, Set, Queue์™€ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

๋ช‡๊ฐ€์ง€ ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋ฉด,

  • List ์ธํ„ฐํŽ˜์ด์Šค: List ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์š”์†Œ์˜ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ค‘๋ณต ์š”์†Œ๊ฐ€ ํ—ˆ์šฉ๋œ๋‹ค. List ์ธํ„ฐํŽ˜์ด์Šค๋Š” Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๊ณ  ๊ตฌํ˜„ํด๋ž˜์Šค๋กœ๋Š” ArrayList, LinkedList, Vector ๋“ฑ์ด ์žˆ๋‹ค.
  • Set ์ธํ„ฐํŽ˜์ด์Šค: Set ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์š”์†Œ์˜ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ˆœ์„œ๋Š” ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค. Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ๋Š” HashSet, TreeSet ๋“ฑ์ด ์žˆ๋‹ค.
  • Queue ์ธํ„ฐํŽ˜์ด์Šค: Queue ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์š”์†Œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์„ ์ž…์„ ์ถœ(FIFO) ๊ตฌ์กฐ์˜ ์ปฌ๋ ‰์…˜์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. Queue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ๋Š” PriorityQueue, ArrayDeque ๋“ฑ์ด ์žˆ๋‹ค.
  • Map ์ธํ„ฐํŽ˜์ด์Šค: Map ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ‚ค-๊ฐ’(key-value) ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์š”์†Œ์˜ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. Map ์ธํ„ฐํŽ˜์ด์Šค๋Š” Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ํ™•์žฅํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, Collection ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งŽ์€ ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ๋Š” HashMap, TreeMap ๋“ฑ์ด ์žˆ๋‹ค.

์•„๋ž˜๋Š” ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ํ™•์žฅํ•œ ์ž๋ฃŒํ˜•๋“ค์˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ์ด๋‹ค.

4-1 ArrayList ์˜ˆ์ œ

ArrayList ํด๋ž˜์Šค๋Š” AbstractList๋ฅผ ํ™•์žฅํ•˜๊ณ  List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํ•„์š”์— ๋”ฐ๋ผ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋™์  ๋ฐฐ์—ด์„ ์ง€์›ํ•œ๋‹ค. (์ฆ๊ฐ€ ๊ฐ์†Œ ๊ฐ€๋Šฅ) ArrayList์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

/**
 * @author CodeVillains
 * @description : ArrayList ๊ฐ„๋‹จ ํ™œ์šฉ ๋ฐ๋ชจ 
 */
package com.codevillains.collection;

import java.util.ArrayList;
import java.util.List;

class ArrayListDemo {
	public static void main(String args[]) {

		// ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. 
		List<String> al = new ArrayList<>();
		System.out.println("Initial size of al: " + al.size());
		
		// ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ์— ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค. 
		al.add("C"); 
		al.add("A"); 
		al.add("E");
		al.add("B");
		al.add("D");
		al.add("F");
		al.add(1, "A2");  // index 1์— A2 ๊ฐ’์„ ์ถ”๊ฐ€ํ•จ 
		System.out.println("Size of al after additions: " + al.size());
		
		// ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 
		System.out.println("Contents of al: " + al);
		
		// ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๋“ค์„ ์‚ญ์ œํ•œ๋‹ค. 
		al.remove("F"); 
		al.remove(2);
		
		System.out.println("Size of al after deletions: " + al.size());
		System.out.println("Contents of al: " + al);
	}
}

์œ„์˜ ์ฝ”๋“œ 10๋ผ์ธ์—์„œ String ํƒ€์ž…์˜ ArrayList๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. List๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์„ ํ•˜์˜€๊ณ  ์ดˆ๊ธฐ ๊ฐ’์€ ๋‹น์—ฐ์ด ์—†์œผ๋ฏ€๋กœ size ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด 0์ด ๋ฆฌํ„ด๋  ๊ฒƒ์ด๋‹ค.

20๋ผ์ธ์—์„œ ์• ์ดˆ์— ์ถ”๊ฐ€ํ•œ ์š”์†Œ ์ธ๋ฑ์Šค 1(์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘)์— A2 ๋ผ๋Š” ๊ฐ’์„ ์ถ”๊ฐ€ ํ•ด์ฃผ์—ˆ๊ณ  ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์ธ๋ฑ์Šค 1 ์ดํ›„์— ๊ฐ’์€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ€๋ฆฐ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.(์‚ฝ์ž…)

์š”์†Œ๋ฅผ remove ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Initial size of al: 0
Size of al after additions: 7
Contents of al: [C, A2, A, E, B, D, F]
Size of al after deletions: 5
Contents of al: [C, A2, E, B, D]

๋งŒ์•ฝ, ์ž˜๋ชป๋œ ์š”์†Œ์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ (์ด๋ฏธ ์ง€์šด ๊ฐ’์„ ๋˜ ์ง€์šฐ๋ ค ํ•œ๋‹ค๊ฑฐ๋‚˜, ์‚ฝ์ž…๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค๊ฑฐ๋‚˜...) java.lang.IndexOutOfBoundsException ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

ArrayList๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ toArray()๋ฅผ ํ†ตํ•˜์—ฌ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

/**
 * @author CodeVillains
 * @description : ArrayList to Array 
 */
package com.codevillains.collection;

import java.util.ArrayList;
import java.util.List;

class ArrayListToArray {
	public static void main(String args[]) {

		// ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. 
		List<Integer> al = new ArrayList<>();
		// ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 
		al.add(new Integer(1)); 
		al.add(new Integer(2));
		al.add(new Integer(3)); 
		al.add(new Integer(4));
		System.out.println("Contents of al: " + al); 
		
		// ๋ฐฐ์—ด์„ ์–ป๋Š”๋‹ค. 
		Object ia[] = al.toArray(); 
		int sum=0;
		
		// ๋ฐฐ์—ด ์š”์†Œ๋“ค์˜ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•œ๋‹ค. 
		for(int i=0; i<ia.length; i++){
			sum += ((Integer) ia[i]).intValue();
		}			
		
		System.out.println("Sum is: " + sum);
	}
}

18 ๋ผ์ธ์—์„œ ArrayList ์˜ toArray๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•จ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Contents of al: [1, 2, 3, 4]
Sum is: 10

ArrayList ์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ต‰์žฅํžˆ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ ๊ผญ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ ์„ค๋ช…
add(Object elem) ArrayList์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
remove(int index) index ์— ์œ„์น˜ํ•˜๋Š” ์š”์†Œ ์ œ๊ฑฐ
remove(Object elem) elem๊ณผ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ ์ œ๊ฑฐ
contains(Object elem) elem์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉด true ์•„๋‹ˆ๋ฉด false
isEmpty() ArrayList ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด true ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด false
indexOf(Object elem) elem๊ณผ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ์˜ index๋ฅผ ๋ฆฌํ„ด, ์—†์œผ๋ฉด -1
size() ArrayList์˜ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด
get(int index) index์— ์œ„์น˜ํ•œ ์š”์†Œ๋ฅผ ๋ฆฌํ„ด
clear() ArrayList๋ฅผ ๋น„์›€(๋ชจ๋“  ์š”์†Œ๋ฅผ ์‚ญ์ œ)

4-2 LinkedList ์˜ˆ์ œ

์ด ํด๋ž˜์Šค๋Š” AbstractSequentialList๋ฅผ ํ™•์žฅํ•˜๊ณ  List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์—ฐ๊ฒฐ-๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

/**
 * @author CodeVillains
 * @description : LinkedList
 */
package com.codevillains.collection;

import java.util.LinkedList;

public class LinkedListDemo {

	public static void main(String args[]) {
		// ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑ.
		LinkedList<String> ll = new LinkedList<String>();
		
		// ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 
		ll.add("F"); 
		ll.add("B"); 
		ll.add("D");
		ll.add("E"); 
		ll.add("C"); 
		ll.addLast("Z"); 
		ll.addFirst("A");
		
		ll.add(1, "A2"); 
		
		System.out.println("Original contents of ll: " + ll);
		
		// ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
		ll.remove("F"); 
		ll.remove(2);
		
		System.out.println("Contents of ll after deletion: " + ll);
		
		// ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. 
		ll.removeFirst(); 
		ll.removeLast(); 
		System.out.println("ll after deleting first and last: " + ll);
		
		// ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค. 
		Object val = ll.get(2); 
		ll.set(2, (String) val + " Changed");
		
		System.out.println("ll after change: " + ll);	
	}
}

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Original contents of ll: [A, A2, F, B, D, E, C, Z]
Contents of ll after deletion: [A, A2, D, E, C, Z]
ll after deleting first and last: [A2, D, E, C]
ll after change: [A2, D, E Changed, C]

์‹ค์ œ LinkedList๊ฐ€ implements ๋ฐ›์€ Interface๋Š” List, Deque, Cloneable ์ •๋„ ์ธ๋ฐ, List์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์š”์†Œ์˜ ์ถ”๊ฐ€ ์‚ญ์ œ๋“ฑ์€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ˆˆ์—ฌ๊ฒจ ๋ณผ๋งŒํ•œ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋Š” addFirst, addList, getFirst, getLast, removeFirst, removeLast ๋“ฑ ์ด๋‹ค.

๋žœ๋คํ•˜๊ฒŒ ํŠน์ •ํ•œ ์ธ๋ฑ์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒฝ์šฐ ํ˜น์€ ์‚ญ์ œํ•  ๊ฒฝ์šฐ ArrayList๊ฐ€ ์„ฑ๋Šฅ์ƒ์œผ๋กœ ์ข€ ๋” ์ข‹๊ณ , LinkedList๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ๊ณผ ๋์— ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์‚ฝ์ž…ํ•˜๊ธฐ์— ๋” ํฐ ์ž‡์ ์ด ์žˆ๋‹ค

Set ์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์—, Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž.

Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค

  • AbstractCollection : Collection ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • AbstractList : AbstractCollection์„ ํ™•์žฅํ•˜๊ณ  List ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • AbstractSequentialList : ์š”์†Œ๋“ค์— ๋ฌด์ž‘์œ„ ์ ‘๊ทผ๋ณด๋‹ค๋Š” ์ˆœ์ฐจ์ ์ธ ์ ‘๊ทผ์„ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ AbstractList๋ฅผ ํ™•์žฅํ•œ๋‹ค.
  • LinkedList : AbstractSequentialList๋ฅผ ํ™•์žฅํ•จ์œผ๋กœ์จ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ ํ•œ๋‹ค.
  • ArrayList : AbstractList๋ฅผ ํ™•์žฅํ•จ์œผ๋กœ์จ ๋™์  ๋ฐฐ์—ด์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • AbstractSet : AbstractCollection์„ ํ™•์žฅํ•˜๊ณ  Set ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • HashSet : ํ•ด์‹œ ํ…Œ์ด๋ธ”๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ AbstractSet์„ ํ™•์žฅํ•œ๋‹ค.
  • LinkedHashSet : ์‚ฝ์ž… ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ˜๋ณต์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด HashSet์„ ํ™•์žฅํ•œ๋‹ค.
  • TreeSet : ํŠธ๋ฆฌ์— ์ €์žฅ๋œ ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•œ๋‹ค. AbstractSet์„ ํ™•์žฅํ•œ๋‹ค.

4-3 HashSet ์˜ˆ์ œ

HashSet ํด๋ž˜์Šค๋Š” AbstractSet์„ ํ™•์žฅํ•˜๊ณ  Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

HashSet์€ ๊ธฐ์–ต์žฅ์†Œ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ค๊ณ , ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ํ•ด์‹ฑ(hashing)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์„œ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , ํ•ด์‹ฑ์„ ํ•˜๋Š” ๊ณผ์ •์ด ๋ณดํ†ต์˜ ์ •๋ ฌ๋œ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์•Œ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์š”์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ด๋‹ค.

/**
 * @author CodeVillains
 * @description : HashSet ๋ฐ๋ชจ 
 */
package com.codevillains.collection;

import java.util.HashSet;
import java.util.Set;

public class HashSetDemo {

	public static void main(String args[]) {
		// ํ•ด์‹œ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•œ๋‹ค. 
		Set<String> hs = new HashSet<>();
		// ํ•ด์‹œ ์ง‘ํ•ฉ์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 
		hs.add("B"); 
		hs.add("A"); 
		hs.add("D");
		hs.add("E"); 
		hs.add("C"); 
		hs.add("F");
		
		System.out.println(hs);
	}
}

๋ณดํ†ต์˜ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์ž‘์œ„๋กœ ๋‚˜์˜ฌ ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ” ํ”Œ๋žซํผ์— ๋”ฐ๋ผ์„œ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ์˜ํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ด๋Š” Java ๋‚˜ HashSet์˜ ํด๋ž˜์Šค ๋ช…์„ธ์— ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์š”์†Œ์˜ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด LinkedHashSet ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

LinkedHashSet ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ํ•ด์‹œ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•œ ๊ฒƒ์œผ๋กœ, ์š”์†Œ๋“ค์ด ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ LinkedHashSet ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์†Œ๋“ค์ด ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

4-4 LinkedHashSet ์˜ˆ์ œ

HashSet์„ ํ™•์žฅํ–ˆ์ง€๋งŒ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ๋Š” ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค. ์œ„์— ์„ค๋ช…ํ•œ๋ฐ๋กœ HashSet๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์‚ฝ์ž…๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜๋ณต ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

/**
 * @author CodeVillains
 * @description : LinkedHashSet
 */
package com.codevillains.collection;

import java.util.LinkedHashSet;
import java.util.Set;

class LinkedHashSetDemo {
	public static void main(String[] args) {
		Set<String> linkHashSet = new LinkedHashSet<String>();
		linkHashSet.add("B");
		linkHashSet.add("A");
		linkHashSet.add("D");
		linkHashSet.add("E");
		linkHashSet.add("C");
		linkHashSet.add("F");
		System.out.println(linkHashSet);
	}
}

์ฒ˜๋ฆฌ๊ฒฐ๊ณผ

[B, A, D, E, C, F]

4-5 TreeSet ์˜ˆ์ œ

ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Set ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์„ ์ œ๊ณตํ•œ๋‹ค.

์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋กœ ์ €์žฅ๋˜๋ฉฐ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ํšจ๊ณผ์ ์ด๊ณ  ๊ฒ€์ƒ‰์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

/**
 * @author CodeVillains
 * @description : TreeSet ๋ฐ๋ชจ 
 */
package com.codevillains.collection;

import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {
	public static void main(String[] args) {
		// ํŠธ๋ฆฌ ์ง‘ํ•ฉ์„ ๋งŒ๋“ ๋‹ค. 
		Set<String> ts = new TreeSet<String>();
		// ํŠธ๋ฆฌ ์ง‘ํ•ฉ์— ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค. 
		ts.add("C"); 
		ts.add("A"); 
		ts.add("B");
		ts.add("E"); 
		ts.add("F"); 
		ts.add("D");
		System.out.println(ts);
	}
}

์ฒ˜๋ฆฌ๊ฒฐ๊ณผ

[A, B, C, D, E, F]

5. Map

Map์€ Key-Value ์Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. Key๋ฅผ ํ†ตํ•ด Value๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ๋Š” HashMap, TreeMap ๋“ฑ์ด ์žˆ๊ณ  ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • HashMap : ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ฒ€์ƒ‰๊ณผ ์ถ”๊ฐ€, ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์—์„œ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • TreeMap : ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฒ€์ƒ‰๊ณผ ์ถ”๊ฐ€, ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์—์„œ๋Š” HashMap๋ณด๋‹ค ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • LinkedHashMap : ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. HashMap๋ณด๋‹ค๋Š” ๋А๋ฆฌ์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • WeakHashMap : Key๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น Key์™€ Value๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • EnumMap : EnumMap์€ Key๊ฐ€ Enum ํƒ€์ž…์ธ Key-Value ์Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋งต ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Key๊ฐ€ Enum ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— (๋‚ด๋ถ€์ ์œผ๋กœ ordinal์ด๋ผ๋Š” ์ˆœ์ฐจ์ ์ธ ์ •์ˆ˜๊ฐ’์„ ๊ฐ€์ง€๋ฏ€๋กœ) ํ‚ค ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋œ๋‹ค.

๊ทธ๋ฆผ 4

Map์€ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์‚ฌ๋ฌผํ•จ์˜ ์—ด์‡ ์™€ ๊ฐ™์€ ๊ฐœ๋…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ๋ฌผํ•จ์˜ ๋ฒˆํ˜ธ์™€ ํ‚ค๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ํ•ด๋‹น ํ‚ค๋กœ ์‚ฌ๋ฌผํ•จ์„ ์—ด๊ณ , ๋ฌผ๊ฑด์„ ๋„ฃ๊ฑฐ๋‚˜ ๋นผ์˜ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋ฅผ ์‚ฌ๋ฌผํ•จ์ด ๋ฐฉ๋Œ€ํ•˜๋‹ค๋ฉด ํ‚ค์— ์‚ฌ๋ฌผํ•จ์˜ ๋ฒˆํ˜ธ๋งŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉด ์›ํ•˜๋Š” ์œ„์น˜๋กœ ๋ฐ”๋กœ ๊ฐ€์„œ ์‚ฌ๋ฌผํ•จ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†๋„์ธก๋ฉด์—์„œ ์ด๋“์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค.

  • ํ•˜๋‚˜์˜ ์‚ฌ๋ฌผํ•จ ์—ด์‡ ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋ฌผํ•จ๊นŒ์ง€ ์—ด์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜๋“ฏ Map์—์„œ๋„ ํ‚ค๋Š” ์œ ์ผ(Unique) ํ•ด์•ผํ•œ๋‹ค.
  • Map์—๋Š” ์ˆœ์„œ๊ฐ€ ์—†๋‹ค - List์™€ Set์ด ์ˆœ์„œ๋‚˜ ์ง‘ํ•ฉ์ ์ธ ๊ฐœ๋…์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด Map์€ ๊ฒ€์ƒ‰์˜ ๊ฐœ๋…์ด ๊ฐ€๋ฏธ๋œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  • Map ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ Key์™€ Value์˜ ํ˜•ํƒœ๋กœ ์‚ฝ์ž…๋˜๋ฉฐ, Key๋ฅผ ์ด์šฉํ•ด์„œ Value๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • Map์€ ์ˆœ์„œ๊ฐ€ ์—†๋‹ค.

๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

/**
 * @author CodeVillains
 * @description : Map ๋ฐ๋ชจ 
 */
package com.codevillains.collection;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo {

	public static void main(String[] args) {
		Map<Integer, String> map = new HashMap<Integer, String>();
		
		// Key : ํšŒ์›๋ฒˆํ˜ธ , value : ์ด๋ฆ„ - map.put์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. 
		map.put(1, "ํ™๊ธธ๋™์ด");
		map.put(2, "Samsig");
		map.put(3, "Harunote");
		map.put(100, "Kakao");

		System.out.println(map);
		System.out.println(map.get(100));

		// ๊ฐ’ ์ฐพ๊ธฐ (Key ํ˜น์€ Value) ์กด์žฌํ•˜๋ฉด True
		System.out.println(map.containsKey(3));
		System.out.println(map.containsValue("Samsig"));

		
		// ํ‚ค๋ฅผ Set์— ๋‹ด๊ธฐ, Key๋Š” Integer ๋กœ ์ •์˜ ๋˜์–ด์žˆ๋‹ค. 
		Set<Integer> keys = map.keySet();
		System.out.println(keys);

		
		// ๊ฐ’์„ Collection์— ๋‹ด๊ธฐ, Value๋Š” String์œผ๋กœ ์ •์˜ ๋˜์–ด์žˆ๋‹ค. 
		Collection<String> values = map.values();
		System.out.println(values);

	}
}

์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด์ž.

{1=ํ™๊ธธ๋™์ด, 2=Samsig, 3=Harunote, 100=Kakao}
Kakao
true
true
[1, 2, 3, 100]
[ํ™๊ธธ๋™์ด, Samsig, Harunote, Kakao]

Map ์€ Key ์™€ Value ์˜ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ •์˜ ๋˜์–ด์žˆ๊ณ , Key๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค๊ณ  ํ–ˆ๋‹ค.

๋ฌผ๋ก , Key ์— ๋Œ€์‘ํ•˜๋Š” Object ํƒ€์ž…์˜ ๋นˆ์„ ์ •์˜ ํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด UserVO์˜ UserName ๊ณผ UserMail ์ฃผ์†Œ๋กœ ํ‚ค๊ฐ€ ํ˜•์„ฑ์ด ๋œ๋‹ค๋ฉด map.put(new UserVO(UserName, UserMail), value) ํ˜•ํƒœ๋กœ๋„ ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งต๊ณผ ๊ด€๋ จ๋œ ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋งต์€ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปฌ๋ ‰์…˜์€ ์•„๋‹ˆ์ง€๋งŒ entrySet ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งต์˜ ์ปฌ๋ ‰์…˜ ๋ทฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ key์˜ ์ปฌ๋ ‰์…˜ ๋ทฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” keySet ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์— ๋Œ€ํ•œ ์ฝœ๋ Œ์…˜ ๋ทฐ๋Š” values ๋ฉ”์„œ๋“œ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…
Map ์œ ์ผํ•œ ํ‚ค์™€ ๊ฐ’์„ ์—ฐ๊ฒฐ(map)ํ•œ๋‹ค.
Map.Entry ๋งต์— ์žˆ๋Š” ์š”์†Œ(ํ‚ค/๊ฐ’ ์Œ)์„ ํ‘œํ˜„ํ•œ๋‹ค. Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค์ด๋‹ค.
SortedMap ํ‚ค๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•œ๋‹ค.

5-1 Map๊ณผ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค

AbstractMap์ด ๋ชจ๋“  ์‹ค์ œ ๋งต ๊ตฌํ˜„์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ด๋‹ค.

ํด๋ž˜์Šค ์„ค๋ช…
AbstractMap Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•œ๋‹ค.
HashMap ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ AbstractMap์„ ํ™•์žฅํ•œ๋‹ค.
TreeMap ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ AbstractMap์„ ํ™•์žฅํ•œ๋‹ค.
WeakHashMap ์ทจ์•ฝ ํ‚ค(weak key)๋ฅผ ๊ฐ–๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ AbstractMap์„ ํ™•์žฅํ•œ๋‹ค.
LinkedHashMap ์‚ฝ์ž…-์ˆœ์„œ ๋ฐ˜๋ณต์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ HashMap์„ ํ™•์žฅํ•œ๋‹ค.
IdentityHashMap AbstractMap์„ ํ™•์žฅํ•˜๊ณ  ์š”์†Œ(document)๋ฅผ ๋น„๊ตํ•  ๋•Œ ์ฐธ์กฐ๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•œ๋‹ค.

5-2 HashMap ํด๋ž˜์Šค

Map์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ ํด๋ž˜์Šค๋กœ. ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

Map์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค ์ค‘์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ธ๋‹ค*.*

key ๋˜๋Š” value ๊ฐ’์œผ๋กœ์จ null์ด ํ—ˆ์šฉ๋œ๋‹ค.

/**
 * @author CodeVillains
 * @description : HashMap ๋ฐ๋ชจ 
 */
package com.codevillains.collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapDemo {

	public static void main(String args[]) {
		// ํ•ด์‹œ ๋งต์„ ๋งŒ๋“ ๋‹ค. 
		Map<String, Double> hm = new HashMap<String, Double>();
		// ๋งต์— ์š”์†Œ๋“ค์„ ๋„ฃ๋Š”๋‹ค. 
		hm.put("ํ™๊ธธ๋™์ด", new Double(1240.34)); 
		hm.put("๊น€์˜์ˆœ์ด", new Double(223.39)); 
		hm.put("ํ€ต๊ตฐ", new Double(1378.00)); 
		hm.put("๊ธ€๋ผ์ด๋”๋‹˜", new Double(9999.55)); 
		hm.put("์กด ๋„", new Double(-122.08));
		hm.put("ํ•œํšจ์ฃผ๋‹˜", null);
		
		// ๋งต ์—”ํŠธ๋ฆฌ์˜ ์ปฌ๋ ‰์…˜ ์ง‘ํ•ฉ์„ ๊ฐ€์ ธ์˜จ๋‹ค. 
		Set<?> set = hm.entrySet();
		
		// ๋ฐ˜๋ณต์ž๋ฅผ ์–ป๋Š”๋‹ค. 
		Iterator<?> i = set.iterator();
		
		// ์š”์†Œ๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค. 
		while(i.hasNext()) {
			Map.Entry me = (Map.Entry)i.next();
			System.out.print(me.getKey() + ": ");
			System.out.println(me.getValue());
		} 
		
		// ์กด ๋„์˜ ๊ณ„์ขŒ์— 1000์„ ์˜ˆ๊ธˆํ•œ๋‹ค. 
		double bonus = hm.get("์กด ๋„").doubleValue(); 
		hm.put("์กด ๋„", new Double(bonus + 1000)); 
		System.out.println("์กด ๋„'s new deposit: " + hm.get("์กด ๋„"));
		
	}
}

์ฒ˜๋ฆฌ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํ€ต๊ตฐ: 1378.0
ํ•œํšจ์ฃผ๋‹˜: null
ํ™๊ธธ๋™์ด: 1240.34
๊ธ€๋ผ์ด๋”๋‹˜: 9999.55
์กด ๋„: -122.08
๊น€์˜์ˆœ์ด: 223.39
์กด ๋„'s new deposit: 877.92

HashMap ์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ฉ”์„œ๋“œ ์„ค๋ช…
void clear() HashMap์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐ.
Object clone() ํ˜„์žฌ HashMap์„ ๋ณต์ œํ•˜์—ฌ ๋ฐ˜ํ™˜.
boolean containsKey(Object key) HashMap์— ์ง€์ •๋œ ํ‚ค(key)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด true ๋ฆฌํ„ด
boolean containsValue(Object key) HashMap์— ์ง€์ •๋œ ๊ฐ’(value)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด true ๋ฆฌํ„ด
Set entrySet() HashMap์— ์ €์žฅ๋œ ํ‚ค์™€ ๊ฐ’์„ ์—”ํŠธ๋ฆฌ(ํ‚ค์™€ ๊ฐ’์˜ ๊ฒฐํ•ฉ)์˜ ํ˜•ํƒœ๋กœ Set์— ์ €์žฅํ•˜์—ฌ ๋ฐ˜ํ™˜.
Object get(Object key) ์ง€์ •๋œ ํ‚ค(Key)์˜ ๊ฐ’(๊ฐ์ฒด)์„ ๋ฐ˜ํ™˜.
boolean isEmpty() HashMap์ด ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธ.
Set keySet() HashMap์— ์ €์žฅ๋œ ๋ชจ๋“  ํ‚ค๊ฐ€ ์ €์žฅ๋œ Set์„ ๋ฐ˜ํ™˜.
Object put(Object key, Object value) HashMap์— ํ‚ค์™€ ๊ฐ’์„ ์ €์žฅ.
void putAll(Map m) Map์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ HashMap์— ์ €์žฅ.
Object remove(Object key) HashMap์—์„œ ์ง€์ •๋œ ํ‚ค๋กœ ์ €์žฅ๋œ ๊ฐ’(๊ฐ์ฒด)๋ฅผ ์ œ๊ฑฐ.
int size() HashMap์— ์ €์žฅ๋œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

5-3 TreeMapํด๋ž˜์Šค

์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ํ‚ค/๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋ฏ€๋กœ ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

ํ•ด์‹œ๋งต๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ํŠธ๋ฆฌ๋งต์€ ์š”์†Œ๋“ค์ด ํ‚ค์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ €์žฅ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ €์žฅ์‹œ ์ •๋ ฌ๋„ ๊ฐ™์ด ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅ์‹œ๊ฐ„์ด ๋‹ค์†Œ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

์•„๊นŒ์˜ ์˜ˆ์ œ๋ฅผ TreeMap์œผ๋กœ ๋ณ€ํ˜•ํ•˜์—ฌ ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž.

/**
 * @author CodeVillains
 * @description : TreeMap ๋ฐ๋ชจ 
 */
package com.codevillains.collection;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {

	public static void main(String args[]) {
		// ํ•ด์‹œ ๋งต์„ ๋งŒ๋“ ๋‹ค. 
		Map<String, Double> tm = new TreeMap<String, Double>();
		// ๋งต์— ์š”์†Œ๋“ค์„ ๋„ฃ๋Š”๋‹ค. 
		tm.put("ํ™๊ธธ๋™์ด", new Double(1240.34)); 
		tm.put("๊น€์˜์ˆœ์ด", new Double(223.39)); 
		tm.put("ํ€ต๊ตฐ", new Double(1378.00)); 
		tm.put("๊ธ€๋ผ์ด๋”๋‹˜", new Double(9999.55)); 
		tm.put("์กด ๋„", new Double(-122.08));
		tm.put("ํ•œํšจ์ฃผ๋‹˜", null);
		
		// ๋งต ์—”ํŠธ๋ฆฌ์˜ ์ปฌ๋ ‰์…˜ ์ง‘ํ•ฉ์„ ๊ฐ€์ ธ์˜จ๋‹ค. 
		Set<?> set = tm.entrySet();
		
		// ๋ฐ˜๋ณต์ž๋ฅผ ์–ป๋Š”๋‹ค. 
		Iterator<?> i = set.iterator();
		
		// ์š”์†Œ๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค. 
		while(i.hasNext()) {
			Map.Entry me = (Map.Entry)i.next();
			System.out.print(me.getKey() + ": ");
			System.out.println(me.getValue());
		} 
		
		// ์กด ๋„์˜ ๊ณ„์ขŒ์— 1000์„ ์˜ˆ๊ธˆํ•œ๋‹ค. 
		double bonus = tm.get("์กด ๋„").doubleValue(); 
		tm.put("์กด ๋„", new Double(bonus + 1000)); 
		System.out.println("์กด ๋„'s new deposit: " + tm.get("์กด ๋„"));
		
	}
}

๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด Key ์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅ๋จ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค.

๊ธ€๋ผ์ด๋”๋‹˜: 9999.55
๊น€์˜์ˆœ์ด: 223.39
์กด ๋„: -122.08
ํ€ต๊ตฐ: 1378.0
ํ•œํšจ์ฃผ๋‹˜: null
ํ™๊ธธ๋™์ด: 1240.34
์กด ๋„'s new deposit: 877.92

5-4 LinkedHashMap ํด๋ž˜์Šค

LinkedHashMap์€ ๊ธฐ๋ณธ์ ์œผ๋กœ HashMap์„ ์ƒ์†๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— HashMap๊ณผ ๋งค์šฐ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ Map์— ์žˆ๋Š” ์—”ํŠธ๋ฆฌ๋“ค์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰, Map์— ์ €์žฅ๋œ ์‚ฝ์ž…-์ˆœ์„œ๋กœ ๋ฐ˜๋ณตํ•˜๋Š”๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

๋˜‘๊ฐ™์€ ์˜ˆ์ œ๋ฅผ LinkedHashMap ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž.

์ž…๋ ฅ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ๋จ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

5-5 Hashtable ํด๋ž˜์Šค

HashMap๋ณด๋‹ค๋Š” ๋А๋ฆฌ์ง€๋งŒ ๋™๊ธฐํ™”๊ฐ€ ์ง€์›๋œ๋‹ค. HashMap ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ null ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

HashMap ์— ๋™๊ธฐํ™” ๋ธ”๋Ÿญ์„ ํ†ตํ•ด ์ฝ”๋”ฉํ•œ ๊ฒฝ์šฐ(Collections.synchronizedMap(new HashMap(...))) ๋ณด๋‹ค๋Š” ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋„๋ก ํ•˜์ž.

/**
 * @author CodeVillains
 * @description : Hashtable ๋ฐ๋ชจ 
 */ 
package com.codevillains.collection;


import java.util.Enumeration;
import java.util.Hashtable;

public class HashTableDemo {

	public static void main(String args[]) {
		// Create a hash map
		Hashtable<String, Double> ht = new Hashtable<String, Double>();
		Enumeration<String> names;
		String str;

		ht.put("ํ™๊ธธ๋™์ด", new Double(1240.34));
		ht.put("๊น€์˜์ˆœ์ด", new Double(223.39));
		ht.put("ํ€ต๊ตฐ", new Double(1378.00));
		ht.put("๊ธ€๋ผ์ด๋”๋‹˜", new Double(9999.55));
		ht.put("์กด ๋„", new Double(-122.08));
		ht.put("ํ•œํšจ์ฃผ๋‹˜",  new Double(55.77));

		names = ht.keys();
		while (names.hasMoreElements()) {
			str = (String) names.nextElement();
			System.out.println(str + ": " + ht.get(str));
		}
		System.out.println();

		double bonus = ((Double) ht.get("์กด ๋„")).doubleValue();
		ht.put("์กด ๋„", new Double(bonus + 1000)); 
		System.out.println("์กด ๋„'s new deposit: " + ht.get("์กด ๋„"));
	}
}

์‹คํ–‰๊ฒฐ๊ณผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ธ€๋ผ์ด๋”๋‹˜: 9999.55
ํ€ต๊ตฐ: 1378.0
ํ•œํšจ์ฃผ๋‹˜: 55.77
์กด ๋„: -122.08
๊น€์˜์ˆœ์ด: 223.39
ํ™๊ธธ๋™์ด: 1240.34

์กด ๋„'s new deposit: 877.92
  • Hashtable, HashMap์˜ ๊ณตํ†ต์ 
    • ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋‘ Hash ๊ธฐ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค
    • Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค
    • Key์™€ Value๋ฅผ ์ด์šฉํ•ด์„œ Data๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค
  • Hashtable, HashMap์˜ ์ฐจ์ด์ 
    • Hashtable์€ ๋™๊ธฐํ™”๊ฐ€ ๋ณด์žฅ๋œ๋‹ค
    • HashMap์€ ๋™๊ธฐํ™”๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค
    • HashMap์˜ ๋™๊ธฐํ™” ์ง€์› ๋ฐฉ๋ฒ• : Map m = Collections.synchronizedMap(New HashMap(...));
  • Hashtable, HashMap๊ณผ HashSet๊ณผ์˜ ๊ด€๊ณ„
    • Hashtable๊ณผ HashMap์€ ๋‘˜ ๋‹ค Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค
    • HashSet์€ ๋‚ด๋ถ€์ ์œผ๋กœ Hash๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ Set์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค
ํŠน์ง• HashMap Hashtable
๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ• Map map = new HashMap(); Map hashtable = new Hashtable();
์ฃผ์š” ํŠน์ง• ๋‹จ์ผ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ์ž๋ฃŒ๊ตฌ์กฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ์ž๋ฃŒ๊ตฌ์กฐ (synchronized ๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค.)
thread-safe ํ•˜์ง€๋งŒ hashmap ๋ณด๋‹ค ๋А๋ฆฌ๋‹ค.

6. Collection์˜ ํ™œ์šฉ ์˜ˆ์ œ

Collection์„ ํ†ตํ•ด ์ž์ฃผ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜์˜ค๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

package com.codevillains.collection;
/**
 * @author CodeVillains
 */
import java.util.*;

public class AlgorithmsDemo {

	public static void main(String args[]) {

		// ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
		LinkedList<Integer> ll = new LinkedList<Integer>();
		ll.add(new Integer(-8));
		ll.add(new Integer(20));
		ll.add(new Integer(-20));
		ll.add(new Integer(8));

		// ์—ญ์ˆœ์˜ ๋น„๊ต์ž๋ฅผ ์ƒ์„ฑ.
		Comparator<Integer> r = Collections.reverseOrder();

		// ๋น„๊ต์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•œ๋‹ค.
		Collections.sort(ll, r);

		// ๋ฐ˜๋ณต์ž๋ฅผ ์–ป๋Š”๋‹ค.
		Iterator<Integer> li = ll.iterator();

		System.out.print("List sorted in reverse: ");
		while (li.hasNext()) {
			System.out.print(li.next() + " ");
		}

		System.out.println();

		Collections.shuffle(ll);

		// ์ž„์˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
		li = ll.iterator();
		System.out.print("List shuffled: ");

		while (li.hasNext()) {
			System.out.print(li.next() + " ");
		}
		System.out.println();

		System.out.println("Minimum: " + Collections.min(ll));
		System.out.println("Maximum: " + Collections.max(ll));

	}
}

Collections ํด๋ž˜์Šค์—๋Š” ์ •๋ ฌ์ด๋‚˜ ์ˆœ์„œ ์กฐํ•ฉ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์„ค๋ช…
Collections.copy(list, list) ์ปฌ๋ ‰์…˜ ์š”์†Œ๋“ค์„ ๋ณต์‚ฌํ•œ๋‹ค.
Collections.reverse(list) list ์š”์†Œ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
Collections.reverseOrder() list ์š”์†Œ์˜ ์ˆœ์„œ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌํžŒ๋‹ค.
Collections.shuffle(list) list ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํžŒ๋‹ค.(Shuffle)
Collections.sort(list) list ๋ฅผ ์ •๋ ฌํžŒ๋‹ค.
Collections.min(list) list ์˜ ์š”์†Œ์ค‘ ๊ฐ€์žฅ ์ž‘์€๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
Collections.max(list) list ์˜ ์š”์†Œ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‹ค์Œ ๊ฐ•์ขŒ์—์„œ ์ •๋ ฌ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์‹œ ์˜ˆ์ œ๋กœ ์„ค๋ช…ํ•  ์˜ˆ์ •์ด๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” shuffle ์— ๋”ฐ๋ผ ๋‹ค์†Œ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

List sorted in reverse: 20 8 -8 -20 
List shuffled: -8 8 20 -20 
Minimum: -20
Maximum: 20

์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ตฌ๋ถ„์ด๋‚˜ ์ปฌ๋ ‰์…˜์˜ ๊ณ„์ธต๋„, ๋งต ๊ณ„์—ด์˜ ๊ณ„์ธต๋„๋ฅผ ํ†ตํ•ด ์ข€ ๋” ์ƒ์†์ด๋‚˜ ๊ตฌํ˜„๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋‚ด๋ถ€ ํ™œ์šฉ ๋ฉ”์„œ๋“œ๋“ค์€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๊ผญ ํ•œ๋ฒˆ์ฏค ์ •๋ฆฌ ํ•ด๋ณด๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

7. Collection ์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ์˜ ์ •๋ ฌ

๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง๋ฉดํ•˜๊ฒŒ ๋œ๋‹ค. ๋น„๋‹จ ๊ณ ๊ฐ์‚ฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ๊ฐœ๋ฐœํ•˜๋Š” SI์— ๊ตญํ•œ๋œ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ œํ’ˆ์„ ๋งŒ๋“ค๋•Œ ํ™”๋ฉด ๋ ˆ๋ฒจ์—์„œ Ajax ์™€ ๊ฐ™์€ Asyc ์ฒ˜๋ฆฌ์‹œ์— URL ํ˜ธ์ถœ ํ›„ ๋‚ด๋ ค ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋“ค์„ DB๋ฅผ ์–ต์„ธ์Šค ํ•˜์ง€ ์•Š๊ณ  ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์˜จ๋‹ค๋ฉด Collection Framework ์„ ์ด์šฉํ•˜์—ฌ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

7-1 ์ •๋ ฌ

์ •๋ ฌ (Sort) - ๋ฐฐ์—ด ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๋“ค์„ ํฐ ์ˆœ์„œ, ์ž‘์€ ์ˆœ์„œ๋กœ ์žฌ ๋ฐฐ์—ด ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์„ ํƒ ์ •๋ ฌ (Selection Sort) : ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ์—์„œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„ ๋งจ ์•ž์— ์œ„์น˜๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ต์ฒดํ•œ๋‹ค. ๋ชฉ๋ก์˜ ๊ฐ ์œ„์น˜์— ๋Œ€ํ•ด์„œ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ณ„์†ํ•œ๋‹ค.

    O(n^2) ์˜ ํผํฌ๋จผ์Šค๊ฐ€ ๋‚˜์˜จ๋‹ค.

  • ๋ฒ„๋ธ” ์ •๋ ฌ (Bubble Sort) : ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ธ์ ‘ํ•œ ๋‘๊ฐœ์˜ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ •๋ ฌ์„ ์™„์„ฑํ•œ๋‹ค. ๋’ค์— ๊ฐ’์ด ์ž‘์œผ๋ฉด ์•ž์œผ๋กœ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•ด์„œ ๊ฐ€๋ณ€๊ณต๊ฐ„์ด ํ•˜๋‚˜ ํ•„์š”ํ•˜๋‹ค.

    ํผํฌ๋จผ์Šค๊ฐ€ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ O(n^2)๊ฐ€ ๋‚˜์˜ค๊ณ  ์ตœ์„ ์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ O(N)์˜ ์„ฑ๋Šฅ์ด ๋‚˜์˜จ๋‹ค.

  • ํ€ต ์ •๋ ฌ (Quick Sort) : ๋”ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ˜„์žฌ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ์ •๋ ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ด ์ข‹๋‹ค.

    ๊ธฐ์ค€๊ฐ’์„ ์ค‘์‹ฌ์œผ๋กœ ์™„์กฑ ๋ถ€๋ถ„ ์ง‘ํ•ฉ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์œผ๋กœ ๋ถ„ํ•  ํ•œ ํ›„ ์™ผ์ชฝ์—” ์ž‘์€๊ฐ’์„, ์˜ค๋ฅธ์ชฝ์—” ๊ธฐ์ค€๊ฐ’ ๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ด๋™์‹œํ‚จ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์ˆœํ™˜์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ(๊ฐ๊ฐ quick sort๋กœ ๋ฆฌ์ปฌ์‹œ๋ธŒํ•˜๊ฒŒ ์—ฐ์‚ฐ) ์ •๋ ฌ์„ ์™„์„ฑํ•œ๋‹ค.

    ํผํฌ๋จผ์Šค๋Š” O(n log n), worst case O(n^2) : ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์—์„œ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ

  • ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort) : ์‚ฝ์ž… ์ •๋ ฌ, ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•˜์—ฌ, ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•จ.

    ๋Œ€์ƒ์„ ๊ธฐ์ค€๊ฐ’์˜ ์™ผ์ชฝ ์š”์†Œ๋ถ€ํ„ฐ ๋น„๊ตํ•ด์„œ ๊ธฐ์ค€๊ฐ’์˜ ํฌ๊ธฐ๊ฐ€ ๋น„๊ต๊ฐ’๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ ๋‘๊ฐœ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๊ธฐ์ค€๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. (๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ •๋ ฌ)

    O(n^2) ์˜ ํผํฌ๋จผ์Šค๊ฐ€ ๋‚˜์˜จ๋‹ค.

  • ๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort) : (Divide & Conquer) : ์•ˆ์ •์ ์ธ ์ •๋ ฌ

    ์ฃผ์›Œ์ง„ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์”ฉ ๋‚˜๋ˆ„์›Œ ์ •๋ ฌํ•œ ํ›„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๋ฐฉ์‹

    ๋‘ ๋ฒˆ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ๊ณผ ํ•œ ๋ฒˆ์˜ ํ•ฉ๋ณ‘์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์žฌ๊ท€ ํ˜ธ์ถœ ์‹œ ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด ๋“ค์–ด ๊นŠ์ด๊ฐ€ log n ์œผ๋กœ ๋œ๋‹ค.

    ์ฆ‰, ๋‘ ๋ฐฐ์—ด์˜ ํ•ฉ์€ ๋‘ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์˜ ํ•ฉ์— ๋น„๋ก€ ํ•จ์œผ๋กœ ์ „์ฒด ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ตœ์•…, ์ตœ์„ , ํ‰๊ท  ๋ชจ๋‘ O(n log n).

    ๋ถ„ํ• ์ •๋ณต ๋ฐฉ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•œ ์ข…๋ฅ˜ (1/2 ์”ฉ ๋ถ„ํ• )

    ํผํฌ๋จผ์Šค๋Š” O(n log n)

์œ„์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ „ํ˜•์ ์ธ ์ •๋ ฌ ๋ฐฉ์‹๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, ์‹ค๋ฌด๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด View ํŽ˜์ด์ง€ ํ˜น์€ ๋กœ์ง ๋‚ด๋ถ€์—์„œ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ๊ณผ ๊ฐ™์€ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ํ•„์ž์˜ ๊ฒฝ์šฐ ์‹ค๋ฌด์—์„œ ๊ฐ€๋‚˜๋‹ค, ABC, 123์˜ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•ด๋‹ฌ๋ผ๋Š” ์š”๊ตฌ๋„ ๋ฐ›์•„๋ณธ ์ ์ด ์žˆ๋‹ค. (์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ์ด๋ฒˆ ์ฑ•ํ„ฐ ์ œ์ผ ๋’ค์— ๋‚˜์˜จ๋‹ค.)

์ด๋Ÿฌํ•œ ์—…๋ฌด ์š”๊ตฌ์‚ฌํ•ญ์€ ์œ„์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ๊ต‰์žฅํžˆ ํ”ํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ๋“ค์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋”ฐ๋กœ ๊ตฌํ˜„์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ž๋ฐ”์—์„œ๋Š” ์ •๋ ฌ์„ ๊ตฌํ˜„ํ• ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์•Œ์•„๋‘์–ด์•ผํ•  Interface๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ Comparable ๊ณผ Comparator ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

  • Comparable ์ธํ„ฐํŽ˜์ด์Šค๋Š” java.lang.lang์— ์กด์žฌํ•œ๋‹ค.
    • int compareTo(T o) ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์„œ ๋‚ด๋ถ€์—์„œ ์ˆœ์„œ๋ฅผ ์ •๋ ฌ
  • Comparator ์ธํ„ฐํŽ˜์ด์Šค๋Š” java.util.Comparator ํŒจํ‚ค์ง€์— ์กด์žฌํ•œ๋‹ค.
    • int compare(T o1, T o2) ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋‘ ๊ฐ์ฒด๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌ

๋ฌผ๋ก  ์œ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์†์‰ฝ๊ฒŒ sort ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ TreeMap, TreeSet ๊ณผ ๊ฐ™์€ ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€์ •๋ ฌ์„ ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

7-2 Collections.sort()๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ

/**
 * @author CodeVillains
 * @description : Collections.sort()๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฐ๋ชจ 
 */
package com.codevillains.collection.sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListSort {

    public static void main(String args[]) {
        List<String> listObject = new ArrayList<String>();
        listObject.add("z");
        listObject.add("a");
        listObject.add("f");
        listObject.add("c");

        System.out.println("##๊ธฐ๋ณธ์ถœ๋ ฅ : " + listObject);
        // ๋ฌธ์ž์—ด์ˆœ์œผ๋กœ ์ •๋ ฌ
        Collections.sort(listObject, String.CASE_INSENSITIVE_ORDER);

        System.out.println("##์ˆœ์ฐจ์ •๋ ฌ : " + listObject);
        // ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ
        Collections.sort(listObject, Collections.reverseOrder());
        System.out.println("##์—ญ์ˆœ์ •๋ ฌ : " + listObject);
    }
}

Collections.sort(listObject, String.CASE_INSENSITIVE_ORDER); ๋ฅผ ์ด์šฉํ•ด์„œ ์ˆœ์ฐจ์ •๋ ฌ์„, Collections.reverseOrder()๋ฅผ ์ด์šฉํ•ด์„œ ์—ญ์ˆœ์ •๋ ฌ์„ ์‹œ๋„ ํ•˜์˜€๋‹ค.

์ถœ๋ ฅ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

##๊ธฐ๋ณธ์ถœ๋ ฅ : [z, a, f, c]
##์ˆœ์ฐจ์ •๋ ฌ : [a, c, f, z]
##์—ญ์ˆœ์ •๋ ฌ : [z, f, c, a]

๋ฌธ์ž์—ด์˜ ์ •๋ ฌ์ผ ๊ฒฝ์šฐ ๋”ฐ๋กœ Interface๋ฅผ Implements ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๋œ๋‹ค. ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ•œ๋ฒˆ ๋” ์‚ดํŽด๋ณธํ›„์— ํ•˜๊ฒ ๋‹ค.

7-3 Arrays.sort() ๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ

์•„๋ž˜๋Š” Array ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

/**
 * @author CodeVillains
 * @description : Array.sort()๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฐ๋ชจ 
 */
package com.codevillains.collection.sort;

import java.util.Arrays;

public class ArraySort {
	public static void main(String[] args) {

		String[] s = { "b", "A", "D", "C", "a", "F" };

		// ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ํ•˜์—ฌ ์ •๋ ฌ
		Arrays.sort(s);
		System.out.println("# ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„");
		System.out.println(Arrays.toString(s));

		descArraySort(s);
		System.out.println("# ์—ญ์ •๋ ฌ ");
		System.out.println(Arrays.toString(s));

		// ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์ •๋ ฌ
		System.out.println("# ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์—†์ด ");
		Arrays.sort(s, String.CASE_INSENSITIVE_ORDER);
		System.out.println(Arrays.toString(s));

	}

	public static void descArraySort(String[] arr) {
		String temp;

		for (int i = 0; i < arr.length / 2; i++) {
			temp = arr[i];
			arr[i] = arr[(arr.length - 1) - i];
			arr[(arr.length - 1) - i] = temp;
		}
	}
}

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

# ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„
[A, C, D, F, a, b]
# ์—ญ์ •๋ ฌ 
[b, a, F, D, C, A]
# ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์—†์ด 
[a, A, b, C, D, F]

Array.sort ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ •๋ ฌํ•˜์˜€๋‹ค. ๋‹จ์ˆœํžˆ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ •๋ ฌํ•˜๊ณ , ๋‹ค์‹œ ์—ญ์ •๋ ฌ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ถœ๋ ฅํ•œ ํ›„ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด (String.CASE_INSENSITIVE_ORDER) ์ถœ๋ ฅํ•˜์˜€๋‹ค.

Sort ๋ฅผ ํ†ตํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ •๋ ฌ์ด ๋˜๋Š” ์ด์œ ๋Š” ๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ ์ž๋ฐ”์˜ String ํด๋ž˜์Šค๊ฐ€ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋”ฐ๋ผ์„œ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜๋„๋ก compareTo ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ์ฒด์˜ ์ •๋ ฌ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ?

์ด๋ฅผํ…Œ๋ฉด ๊ฒŒ์‹œํŒ์—์„œ ๊ฒŒ์‹œ๋ฌผ์˜ ์ˆœ์„œ(BoardType ์ด๋ผ๋Š” Object์— ์กด์žฌํ•˜๋Š” ๊ฒŒ์‹œ๋ฌผ ์ˆœ๋ฒˆ ์ด๋ผ๋˜๊ฐ€) ์œ ์ €๋ช… ํ˜น์€ ID ๊ฐ™์€ ํ”„๋Ÿฌํผํ‹ฐ ๊ธฐ์ค€์œผ๋กœ ํ•  ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€?

์ด ๋•Œ์—๋Š” (String์—์„œ ์ž๋™์œผ๋กœ ๋™์ž‘ํ•˜๋Š” Comparable ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ) ๊ฐ์ฒด์—์„œ Comparable ์„ implements ํ•˜์—ฌ compareTo ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๊ฒŒ์‹œ๋ฌผ๋กœ ์ •๋ ฌํ•˜๋Š” ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์•„๋ž˜๋ฅผ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

//ํ˜„์žฌ ๋„˜์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ Board ๋ณ€์ˆ˜์˜ title์„ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌํ•œ๋‹ค. 
public int compareTo(Object o){ 
    reutrn title.compareTo(((Board)o).title); 
}

๋‹น์—ฐํžˆ ์ด Board๋ผ๋Š” ๊ฐ์ฒด์— Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•ด์ค˜์•ผ ํ•˜๋ฏ€๋กœ compareTo๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋”ฐ๋ผ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋น„๊ต๋Œ€์ƒ ๋ณ€์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

compareTo ๋กœ ๋„˜์–ด์˜ค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ˜„์žฌ ๋ณ€์ˆ˜๋ณด๋‹ค ์•ž์— ์กด์žฌํ•œ๋‹ค๋ฉด ์Œ์ˆ˜๋ฅผ, ๊ฐ™๋‹ค๋ฉด 0์„, ๋’ค์— ์กด์žฌํ•œ๋‹ค๋ฉด ์–‘์ˆ˜๋ฅผ ๋ฆฌํ„ด ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ ํ›„ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฐฐ์—ด๋กœ ์ •๋ ฌํ•ด์•ผ ํ•  ๊ฒฝ์šฐ Arrays.sort(arr) ๋ฅผ, ๋ฆฌ์ŠคํŠธ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•  ๊ฒฝ์šฐ Collections.sort(list)๋กœ ํ•ด๋ฒ„๋ฆฌ๋ฉด ์ •๋ ฌ์ด ์ฒ˜๋ฆฌ ๋œ๋‹ค.

7-4 Comparable ๊ณผ Comparator๋ฅผ ํ†ตํ•œ ์ •๋ ฌ ๊ตฌํ˜„

๋จผ์ € ์ง€๋‚œ 10๋…„๊ฐ„์˜ ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ์ž๋ฅผ ๋ฝ‘์•„์™€ ๋ฐฐ์šฐ์ด๋ฆ„์ด๋‚˜ ์ˆ˜์ƒ์—ฐ๋„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์•„๋ž˜๋Š” ๋ฐฐ์šฐ ์ˆ˜์ƒ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” Actor ํด๋ž˜์Šค์ด๋‹ค.

/**
 * @author CodeVillains
 * @description : Comparable์„ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฐ๋ชจ 
 */
package net.harunote.collection.sort.actor;

class Actor implements Comparable<Object> {
	String name;
	String title;
	int prizeYear;

	// Constructor
	public Actor(String name, String title, int birthYear) {
		this.prizeYear = birthYear;
		this.name = name;
		this.title = title;
	}

	@Override
	public String toString() {
		return "์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {" + "๋ฐฐ์šฐ = " + name + ", ์˜ํ™” ์ œ๋ชฉ [" + title + "]" + ", ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=" + prizeYear + '}';
	}

	// ์ •๋ ฌ๋  ๋•Œ ๋ฐฐ์šฐ ์ด๋ฆ„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
	@Override
	public int compareTo(Object o) {
		return name.compareTo(((Actor) o).name);
	}
}

๋ฐฐ์šฐ๋ช…, ์˜ํ™”์ œ๋ชฉ, ์ˆ˜์ƒ์—ฐ๋„๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์˜€๊ณ  toString์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

Comparable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์ˆœ์„œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์„ ์ •๋ ฌํ•˜๊ฑฐ๋‚˜ ์ด์ง„ ๊ฒ€์ƒ‰ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ Actor ํด๋ž˜์Šค๊ฐ€ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ด์œ ๋Š”, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์„ ์ด๋ฆ„(name)์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ ์ž ํ•˜๊ธฐ ์œ„ํ•จ์ด๋ฉฐ, Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด compareTo ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ compareTo ๋ฉ”์„œ๋“œ๋Š” name ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‘ Actor ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜๋„๋ก ์ •์˜๋˜์–ด ์žˆ๋‹ค.

๊ธฐ๋ณธ์ •๋ ฌ, ์ˆ˜์ƒ ์—ฐ๋„ ์ •๋ ฌ, ์ด๋ฆ„์ •๋ ฌ ๋“ฑ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๊ณ  Array์™€ List, TreeSet ๋“ฑ์˜ ์ž๋ฃŒํ˜•์œผ๋กœ ์ •๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธ ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด ๋ณด์ž.

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

/**
 * @author CodeVillains
 * @description : ์ฒญ๋ฃก์˜ํ™”์ œ 10๋…„๊ฐ„ ์ˆ˜์ƒ์ž‘ ์ •๋ ฌ ์˜ˆ์ œ  
 */
package com.codevillains.collection.sort.actor;

import com.codevillains.collection.sort.actor.prizeYearComparator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;

//์ฒญ๋ฃก์˜ํ™”์ œ ์ˆ˜์ƒ์ž ์˜ˆ์ œ
public class FilmFestival {
	private static final Logger logger = LoggerFactory.getLogger(FilmFestival.class);

	public static void main(String args[]) {
		/* ์ฒญ๋ฃก์˜ํ™”์ œ 10๋…„๊ฐ„ ์ˆ˜์ƒ์ž‘
		33ํšŒ(2012) - ์ตœ๋ฏผ์‹(ใ€Š๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€ใ€‹)
		34ํšŒ(2013) - ํ™ฉ์ •๋ฏผ(ใ€Š์‹ ์„ธ๊ณ„ใ€‹)
		35ํšŒ(2014) - ์†ก๊ฐ•ํ˜ธ(ใ€Š๋ณ€ํ˜ธ์ธใ€‹)
		36ํšŒ(2015) - ์œ ์•„์ธ(ใ€Š์‚ฌ๋„ใ€‹)
		37ํšŒ(2016) - ์ด๋ณ‘ํ—Œ(ใ€Š๋‚ด๋ถ€์ž๋“คใ€‹)
		38ํšŒ(2017) - ์†ก๊ฐ•ํ˜ธ(ใ€Šํƒ์‹œ์šด์ „์‚ฌใ€‹)
		39ํšŒ(2018) - ๊น€์œค์„(ใ€Š1987ใ€‹)
		40ํšŒ(2019) - ์ •์šฐ์„ฑ(ใ€Š์ฆ์ธใ€‹)
		41ํšŒ(2020) - ์œ ์•„์ธ(ใ€Š์†Œ๋ฆฌ๋„ ์—†์ดใ€‹)
		42ํšŒ(2021) - ์„ค๊ฒฝ๊ตฌ(ใ€Š์ž์‚ฐ์–ด๋ณดใ€‹)
		43ํšŒ(2022) - ๋ฐ•ํ•ด์ผ(ใ€Šํ—ค์–ด์งˆ ๊ฒฐ์‹ฌใ€‹)
		 */
		Actor[] actors = new Actor[] {
				new Actor("์†ก๊ฐ•ํ˜ธ", "๋ณ€ํ˜ธ์ธ", 2014),
				new Actor("์œ ์•„์ธ", "์†Œ๋ฆฌ๋„ ์—†์ด", 2020),
				new Actor("ํ™ฉ์ •๋ฏผ", "์‹ ์„ธ๊ณ„", 2013),
				new Actor("์†ก๊ฐ•ํ˜ธ", "ํƒ์‹œ์šด์ „์‚ฌ", 2017),
				new Actor("์œ ์•„์ธ", "์‚ฌ๋„", 2015),
				new Actor("๊น€์œค์„", "1987", 2018),
				new Actor("์„ค๊ฒฝ๊ตฌ", "์ž์‚ฐ์–ด๋ณด", 2021),
				new Actor("์ตœ๋ฏผ์‹", "๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€", 2012),
				new Actor("๋ฐ•ํ•ด์ผ", "ํ—ค์–ด์งˆ ๊ฒฐ์‹ฌ", 2022),
				new Actor("์ด๋ณ‘ํ—Œ", "๋‚ด๋ถ€์ž๋“ค", 2016),
				new Actor("์ •์šฐ์„ฑ", "์ฆ์ธ", 2019)
				};

		logger.info("### ์ •๋ ฌ ์ „ ###");
		consoleLog(List.of(actors));

		Arrays.sort(actors);
		logger.info("### ๊ธฐ๋ณธ ์ •๋ ฌ ํ›„ (๋ฐฐ์šฐ์ด๋ฆ„) ###");
		consoleLog(List.of(actors));

		List<Actor> list = Arrays.asList(actors); // ๋ฐฐ์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ
		Collections.shuffle(list); // ๋ฆฌ์ŠคํŠธ์˜ ์ˆœ์„œ๋ฅผ ์„ž์Œ.

		logger.info("### List shuffle ํ›„ ###");
		consoleLog(list);

		// ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌ (ํด๋ž˜์Šค์— ์ •์˜๋œ ๊ธฐ๋ณธ์ •๋ ฌ)
		Collections.sort(list);

		logger.info("### List ๊ธฐ๋ณธ ์ •๋ ฌ ํ›„ ###");
		consoleLog(list);

		// ๋””ํดํŠธ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋Š” TreeSet์„ ๋งŒ๋“ ๋‹ค
		Set<Actor> set = new TreeSet<>(list);

		logger.info("### treeset ์ ์šฉ ํ›„ ###");
		consoleLog(set);

		// ์—ฐ๋™๋ณ„๋กœ ์ ์šฉํ•œ set
		Set<Actor> yearSet = new TreeSet<>(new prizeYearComparator());
		yearSet.addAll(list);

		logger.info("### ์ตœ์‹  ์—ฐ๋„๋ณ„ ์ •๋ ฌ ํ›„ ###");
		consoleLog(yearSet);

	}
	private static void consoleLog(Collection<Actor> collection) {
		for (Actor actor : collection) {
			logger.info(actor.toString());
		}
	}
}

์ˆ˜์ƒ ์—ฐ๋„๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด prizeYearComparator๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

/**
 * @author CodeVillains
 * @description : Comparator ์ •๋ ฌ  ๋ฐ๋ชจ 
 */
package com.codevillains.collection.sort.actor;

import java.util.Comparator;

// ์ˆ˜์ƒ ์—ฐ๋„๋ณ„๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
class prizeYearComparator implements Comparator<Object> {
	public int compare(Object o1, Object o2) {
		int year1 = ((Actor) o1).prizeYear;
		int year2 = ((Actor) o2).prizeYear;
		return year1 > year2 ? -1 : (year1 == year2 ? 0 : 1); 
	}
}

prizeYearComparator ํด๋ž˜์Šค๋Š” Actor ํด๋ž˜์Šค์˜ prizeYear ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. compare ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ, prizeYear ํ•„๋“œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌํ•œ๋‹ค.

๋น„๊ต ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ์„œ, ์–‘์ˆ˜, 0, ์Œ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ, year1์ด year2๋ณด๋‹ค ํฌ๋‹ค๋ฉด -1์„ ๋ฆฌํ„ดํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉฐ, year1๊ณผ year2๊ฐ€ ๊ฐ™๋‹ค๋ฉด 0์„ ๋ฆฌํ„ดํ•œ๋‹ค. year1์ด year2๋ณด๋‹ค ์ž‘๋‹ค๋ฉด 1์„ ๋ฆฌํ„ดํ•˜์—ฌ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

### ์ •๋ ฌ ์ „ ###
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [๋ณ€ํ˜ธ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2014}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์†Œ๋ฆฌ๋„ ์—†์ด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2020}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ํ™ฉ์ •๋ฏผ, ์˜ํ™” ์ œ๋ชฉ [์‹ ์„ธ๊ณ„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2013}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [ํƒ์‹œ์šด์ „์‚ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2017}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์‚ฌ๋„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2015}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๊น€์œค์„, ์˜ํ™” ์ œ๋ชฉ [1987], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2018}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์„ค๊ฒฝ๊ตฌ, ์˜ํ™” ์ œ๋ชฉ [์ž์‚ฐ์–ด๋ณด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2021}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ตœ๋ฏผ์‹, ์˜ํ™” ์ œ๋ชฉ [๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2012}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๋ฐ•ํ•ด์ผ, ์˜ํ™” ์ œ๋ชฉ [ํ—ค์–ด์งˆ ๊ฒฐ์‹ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2022}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ด๋ณ‘ํ—Œ, ์˜ํ™” ์ œ๋ชฉ [๋‚ด๋ถ€์ž๋“ค], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2016}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ •์šฐ์„ฑ, ์˜ํ™” ์ œ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2019}
### ๊ธฐ๋ณธ ์ •๋ ฌ ํ›„ (๋ฐฐ์šฐ์ด๋ฆ„) ###
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๊น€์œค์„, ์˜ํ™” ์ œ๋ชฉ [1987], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2018}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๋ฐ•ํ•ด์ผ, ์˜ํ™” ์ œ๋ชฉ [ํ—ค์–ด์งˆ ๊ฒฐ์‹ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2022}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์„ค๊ฒฝ๊ตฌ, ์˜ํ™” ์ œ๋ชฉ [์ž์‚ฐ์–ด๋ณด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2021}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [๋ณ€ํ˜ธ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2014}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [ํƒ์‹œ์šด์ „์‚ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2017}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์†Œ๋ฆฌ๋„ ์—†์ด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2020}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์‚ฌ๋„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2015}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ด๋ณ‘ํ—Œ, ์˜ํ™” ์ œ๋ชฉ [๋‚ด๋ถ€์ž๋“ค], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2016}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ •์šฐ์„ฑ, ์˜ํ™” ์ œ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2019}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ตœ๋ฏผ์‹, ์˜ํ™” ์ œ๋ชฉ [๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2012}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ํ™ฉ์ •๋ฏผ, ์˜ํ™” ์ œ๋ชฉ [์‹ ์„ธ๊ณ„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2013}
### List shuffle ํ›„ ###
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์‚ฌ๋„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2015}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [ํƒ์‹œ์šด์ „์‚ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2017}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ํ™ฉ์ •๋ฏผ, ์˜ํ™” ์ œ๋ชฉ [์‹ ์„ธ๊ณ„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2013}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๋ฐ•ํ•ด์ผ, ์˜ํ™” ์ œ๋ชฉ [ํ—ค์–ด์งˆ ๊ฒฐ์‹ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2022}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ด๋ณ‘ํ—Œ, ์˜ํ™” ์ œ๋ชฉ [๋‚ด๋ถ€์ž๋“ค], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2016}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ตœ๋ฏผ์‹, ์˜ํ™” ์ œ๋ชฉ [๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2012}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์„ค๊ฒฝ๊ตฌ, ์˜ํ™” ์ œ๋ชฉ [์ž์‚ฐ์–ด๋ณด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2021}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์†Œ๋ฆฌ๋„ ์—†์ด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2020}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๊น€์œค์„, ์˜ํ™” ์ œ๋ชฉ [1987], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2018}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ •์šฐ์„ฑ, ์˜ํ™” ์ œ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2019}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [๋ณ€ํ˜ธ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2014}
### List ๊ธฐ๋ณธ ์ •๋ ฌ ํ›„ ###
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๊น€์œค์„, ์˜ํ™” ์ œ๋ชฉ [1987], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2018}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๋ฐ•ํ•ด์ผ, ์˜ํ™” ์ œ๋ชฉ [ํ—ค์–ด์งˆ ๊ฒฐ์‹ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2022}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์„ค๊ฒฝ๊ตฌ, ์˜ํ™” ์ œ๋ชฉ [์ž์‚ฐ์–ด๋ณด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2021}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [ํƒ์‹œ์šด์ „์‚ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2017}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [๋ณ€ํ˜ธ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2014}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์‚ฌ๋„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2015}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์†Œ๋ฆฌ๋„ ์—†์ด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2020}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ด๋ณ‘ํ—Œ, ์˜ํ™” ์ œ๋ชฉ [๋‚ด๋ถ€์ž๋“ค], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2016}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ •์šฐ์„ฑ, ์˜ํ™” ์ œ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2019}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ตœ๋ฏผ์‹, ์˜ํ™” ์ œ๋ชฉ [๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2012}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ํ™ฉ์ •๋ฏผ, ์˜ํ™” ์ œ๋ชฉ [์‹ ์„ธ๊ณ„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2013}
### treeset ์ ์šฉ ํ›„ ###
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๊น€์œค์„, ์˜ํ™” ์ œ๋ชฉ [1987], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2018}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๋ฐ•ํ•ด์ผ, ์˜ํ™” ์ œ๋ชฉ [ํ—ค์–ด์งˆ ๊ฒฐ์‹ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2022}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์„ค๊ฒฝ๊ตฌ, ์˜ํ™” ์ œ๋ชฉ [์ž์‚ฐ์–ด๋ณด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2021}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [ํƒ์‹œ์šด์ „์‚ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2017}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์‚ฌ๋„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2015}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ด๋ณ‘ํ—Œ, ์˜ํ™” ์ œ๋ชฉ [๋‚ด๋ถ€์ž๋“ค], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2016}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ •์šฐ์„ฑ, ์˜ํ™” ์ œ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2019}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ตœ๋ฏผ์‹, ์˜ํ™” ์ œ๋ชฉ [๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2012}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ํ™ฉ์ •๋ฏผ, ์˜ํ™” ์ œ๋ชฉ [์‹ ์„ธ๊ณ„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2013}
### ์ตœ์‹  ์—ฐ๋„๋ณ„ ์ •๋ ฌ ํ›„ ###
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๋ฐ•ํ•ด์ผ, ์˜ํ™” ์ œ๋ชฉ [ํ—ค์–ด์งˆ ๊ฒฐ์‹ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2022}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์„ค๊ฒฝ๊ตฌ, ์˜ํ™” ์ œ๋ชฉ [์ž์‚ฐ์–ด๋ณด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2021}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์†Œ๋ฆฌ๋„ ์—†์ด], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2020}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ •์šฐ์„ฑ, ์˜ํ™” ์ œ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2019}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ๊น€์œค์„, ์˜ํ™” ์ œ๋ชฉ [1987], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2018}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [ํƒ์‹œ์šด์ „์‚ฌ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2017}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ด๋ณ‘ํ—Œ, ์˜ํ™” ์ œ๋ชฉ [๋‚ด๋ถ€์ž๋“ค], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2016}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์œ ์•„์ธ, ์˜ํ™” ์ œ๋ชฉ [์‚ฌ๋„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2015}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์†ก๊ฐ•ํ˜ธ, ์˜ํ™” ์ œ๋ชฉ [๋ณ€ํ˜ธ์ธ], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2014}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ํ™ฉ์ •๋ฏผ, ์˜ํ™” ์ œ๋ชฉ [์‹ ์„ธ๊ณ„], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2013}
์ˆ˜์ƒ ๋ฐฐ์šฐ ๋ชฉ๋ก {๋ฐฐ์šฐ = ์ตœ๋ฏผ์‹, ์˜ํ™” ์ œ๋ชฉ [๋ฒ”์ฃ„์™€์˜ ์ „์Ÿ: ๋‚˜์œ๋†ˆ๋“ค ์ „์„ฑ์‹œ๋Œ€], ์ฒญ๋ฃก์˜ํ™”์ œ ๋‚จ์šฐ์ฃผ์—ฐ์ƒ ์ˆ˜์ƒ ์—ฐ๋„=2012}

Sorting์„ ์œ„ํ•œ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Actor ํด๋ž˜์Šค์— compareTo๋ฅผ Overriding ํ–ˆ๊ณ  ๋‚˜๋จธ์ง€ ์ •๋ ฌ์กฐ๊ฑด์„ ์œ„ํ•ด Comparator๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ์„ ์ด์šฉ ํ•˜์˜€๋‹ค.

Comparator ์ธํ„ฐํŽ˜์ด์Šค๋Š” compare ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ compareTo์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ์ •๋ ฌ์ด ์ˆ˜ํ–‰๋œ๋‹ค.

์†Œ์Šค์ƒ์˜ ์ฃผ์„์œผ๋กœ ์ž์„ธํ•œ ์„ค๋ช…์„ ํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์ •๋ ฌ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋ผ ์ƒ๊ฐ๋œ๋‹ค.

๋‹ค์Œ์€ ์ž๋ฃŒํ˜•์— ๋”ฐ๋ฅธ ์‹ฌํ”Œํ•œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๊ฒ ๋‹ค.

/**
 * @author CodeVillains
 * @description : Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ์ •๋ ฌ ๊ตฌํ˜„  
 */
package com.codevillains.collection.sort;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class TestMap {

	private static final Logger logger = LoggerFactory.getLogger(TestMap.class);

	public static void main(String[] args) {
		Map<String, String> addr = new HashMap<String, String>();
		addr.put("๊ฐ€๊ฐ€๊ฐ€1", "1");
		addr.put("๋‚˜๋‚˜๋‚˜2", "1");
		addr.put("๊ฐ€๊ฐ€๊ฐ€1", "1");
		addr.put("๋‹ค๋‹ค๋‹ค0", "1");

		logger.info("#Map ์— ๋‹ด๊ธด ์ž๋ฃŒ : {}", addr);

		Set<String> set = addr.keySet();
		Object[] hmKeys = set.toArray();
		Arrays.sort(hmKeys, nameSorter); // ์ด๋ฆ„์ˆœ ์ •๋ ฌํ•˜๊ธฐ

		for (int i = 0; i < hmKeys.length; i++) {
			String key = (String) hmKeys[i];
			logger.info("# key = {}", key);
		}
	}

	public static Comparator<Object> nameSorter = (s1, s2) -> {
		String ss1 = (String) s1;
		String ss2 = (String) s2;
		return (-1) * ss2.compareTo(ss1);
	};

}

ํ‚ค์˜ ๋„ค์ž„์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด nameSorter๋ฅผ ํ†ตํ•ด Comparator์˜ compareTo๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค.

๊ฒฐ๊ณผํ™”๋ฉด์„ ํ™•์ธํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

INFO  TestMap:24 - # Map ์— ๋‹ด๊ธด ์ž๋ฃŒ : {๋‚˜๋‚˜๋‚˜2=1, ๋‹ค๋‹ค๋‹ค0=1, ๊ฐ€๊ฐ€๊ฐ€1=1}
INFO  TestMap:32 - # key = ๊ฐ€๊ฐ€๊ฐ€1
INFO  TestMap:32 - # key = ๋‚˜๋‚˜๋‚˜2
INFO  TestMap:32 - # key = ๋‹ค๋‹ค๋‹ค0

์ด์ฒ˜๋Ÿผ map์œผ๋กœ key์ •๋ณด ์ •๋ ฌํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ๋„ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

7-5 Multi Column ์— ๋Œ€ํ•œ ์ •๋ ฌ ์ฒ˜๋ฆฌ

ํŠน์ • ๊ธฐ์ค€์— ์˜ํ•œ Sort๋Š” Collection.sort ๋ฅผ ์“ฐ๋“ , Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด๋“  ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ์ปฌ๋Ÿผ ์ด์ƒ์˜ ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ์ •๋ ฌ ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ(์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒํ’ˆ ์ˆœ๋ฒˆ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ต์…˜ ์‚ฌ์ด์ฆˆ ๋ณ„๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ฑฐ๋‚˜) ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•ด๋ณด๋„๋ก ํ•œ๋‹ค.

/**
 * @author CodeVillains
 */
package com.codevillains.collection.sort;

public class Product {

	public Product(String prdId, Integer prdSize) {
		this.prdId = prdId;
		this.prdSize = prdSize;
	}
	
	private String prdId;
	private Integer prdSize;
	
	public String getPrdId() {
		return prdId;
	}
	public void setPrdId(String prdId) {
		this.prdId = prdId;
	}
	public Integer getPrdSize() {
		return prdSize;
	}
	public void setPrdSize(Integer prdSize) {
		this.prdSize = prdSize;
	}	
}

๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒํ’ˆ์˜ ์ฝ”๋“œ์™€ ์ƒํ’ˆ ์‚ฌ์ด์ฆˆ๋ฅผ ์„ ์–ธํ•˜์˜€๋‹ค.

์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์ค‘ ์ƒํ’ˆ๋ณ„, ์ƒํ’ˆ์˜ ์‚ฌ์ด์ฆˆ ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” org.apache.commons.collections.comparator (์•„ํŒŒ์น˜ commons-collections ์‚ฌ์šฉ) ๋ฅผ ์ด์šฉํ•˜์—ฌ multi ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ComparatorChain ์„ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

์•„๋ž˜๋Š” ์‹ค์ œ ์ƒํ’ˆ์˜ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์ด์ฆˆ ์ˆœ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

/**
 * @author CodeVillains
 * @description : ์ƒํ’ˆ์˜ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์ด์ฆˆ ๋ณ„ ์ •๋ ฌ  
 */
package com.codevillains.collection.sort;

import org.apache.commons.collections4.comparators.ComparatorChain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ComplexSort {

	private static final Logger logger = LoggerFactory.getLogger(ComplexSort.class);
	private static List<Product> products = new ArrayList<>();
	
	public static void main(String args[]) {
		prepareData();
		
		ComparatorChain chain = new ComparatorChain();
		//๋น„๊ตํ•  ๋Œ€์ƒ์„ ๊ฐ Comparator๋กœ ์ž‘์„ฑ
		chain.addComparator(comparatorPrdId);	// ์ƒํ’ˆ์•„์ด๋”” ์ •๋ ฌ 
		chain.addComparator(comparatorPrdSize);	// ์ƒํ’ˆ์‚ฌ์ด์ฆˆ ์ •๋ ฌ 
		
		Collections.sort(products, chain);
		
		consoleLog();
	}

	/**
	 * ์ƒํ’ˆ ์•„์ด๋””๋ฅผ ์ •๋ ฌํ•œ๋‹ค. 
	 */
	public static Comparator<Product> comparatorPrdId = (o1, o2) -> 
																o1.getPrdId().compareToIgnoreCase(o2.getPrdId());

	/**
	 * ์ƒํ’ˆ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ •๋ ฌํ•œ๋‹ค. 
	 */
	public static Comparator<Product> comparatorPrdSize = Comparator.comparing(Product::getPrdSize);

	/**
	 * ๋Œ€์ƒ ๊ฐ์ฒด์˜ ์ถœ๋ ฅ ๊ธฐ๋Šฅ 
	 */
	private static void consoleLog() {
		logger.info("########## ์ถœ๋ ฅ ์‹œ์ž‘ #########");
		for (Product product : products) {
			logger.info("Print : {} = {}", product.getPrdId(), product.getPrdSize());
		}
	}

	/**
	 * ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•จ 
	 */
	private static void prepareData() {
		products.add(new Product("tshirt", 110));
		products.add(new Product("tshirt", 90));
		products.add(new Product("tshirt", 100));
		products.add(new Product("tshirt", 95));
		products.add(new Product("tshirt", 105));
		
		products.add(new Product("shoes", 270));
		products.add(new Product("shoes", 260));
		products.add(new Product("shoes", 275));
		
		products.add(new Product("clothes", 44));
		products.add(new Product("clothes", 55));
		products.add(new Product("clothes", 66));
	}
}

ArrayList ํƒ€์ž…์˜ Product ๋Š” DB์—์„œ ๊บผ๋‚ด์˜จ ๊ฒƒ์œผ๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” prepareData ๋ฉ”์„œ๋“œ์—์„œ ์ค€๋น„ํ•ด๋†“๊ณ  ๊ฐ ํ•ญ๋ชฉ(์ƒํ’ˆ๋ช…, ์ƒํ’ˆ์˜ ์‚ฌ์ด์ฆˆ) ์˜ ๊ธฐ์ค€๋ณ„๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

prepareData()๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์…‹ํŒ…ํ•œ ํ›„ ComparatorChain์˜ addComparator์— Comparator ํ•  ๋Œ€์ƒ ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•ด์ค€๋‹ค.

ComparatorChain์€ ์•„ํŒŒ์น˜ commons์˜ collections4 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ build.gradle์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.0'

ํ˜„์žฌ ์†Œ์Šค์—์„œ๋Š” ์ƒํ’ˆ๋ช…๊ณผ ์ƒํ’ˆ๋ช…์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ ์‚ฌ์ด์ฆˆ๋“ค์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ compare๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ prdId ์™€ prdSize๋ฅผ ๋น„๊ตํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

๊ทธ ์—ญํ• ์€ comparatorPrdId ์™€ comparatorPrdSize๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

๋žŒ๋‹ค ํ‘œ๊ธฐํ˜•ํƒœ๋กœ ๋˜์–ด์žˆ์ง€๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ Compare ๋ฉ”์„œ๋“œ๋กœ Override ํ•ด์„œ ๊ตฌํ˜„ํ•ด ๋ณธ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

public static Comparator<Product> comparatorPrdId = new Comparator<Product>() {
		@Override
		public int compare(Product o1, Product o2) {
			return o1.getPrdId().compareToIgnoreCase(o2.getPrdId());
		}
};

public static Comparator<Product> comparatorPrdSize = new Comparator<Product>() {
		@Override
		public int compare(Product o1, Product o2) {
			return o1.getPrdSize().compareTo(o2.getPrdSize());
		}
};

compareTo๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š”๊ฒƒ์€ ์•ž์„œ์„œ ์ด๋ฏธ ์„ค๋ช…์„ ํ•˜์˜€๋‹ค.

์ตœ์ข…์ ์œผ๋กœ Collections.sort(list, chain);์„ ํ†ตํ•ด ๋Œ€์ƒ ์ž๋ฃŒ๋ฅผ ์ •๋ ฌํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜์˜€๋‹ค.

########## ์ถœ๋ ฅ ์‹œ์ž‘ #########
Print : clothes = 44
Print : clothes = 55
Print : clothes = 66
Print : shoes = 260
Print : shoes = 270
Print : shoes = 275
Print : tshirt = 90
Print : tshirt = 95
Print : tshirt = 100
Print : tshirt = 105
Print : tshirt = 110

๊ฐ ํ•ญ๋ชฉ๊ธฐ์ค€์œผ๋กœ (์ƒํ’ˆ๋ช…) ์‚ฌ์ด์ฆˆ ์ˆœ์„œ๋Œ€๋กœ ์ •์ƒ์ ์ธ ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „์ฒด ์˜ˆ์ œ ์†Œ์Šค๋Š” ์•„๋ž˜์˜ Git์˜ collections Repository์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://github.com/villainscode/collections

Tip. ํ•œ๊ธ€, ์˜๋ฌธ, ์ˆซ์ž์ˆœ์œผ๋กœ ์ •๋ ฌ

๊ณผ๊ฑฐ ์—…๋ฌด ์ง„ํ–‰์ค‘์— ์ •๋ ฌ ์กฐ๊ฑด์ด ํ•œ๊ธ€์ˆœ, ์˜๋ฌธ์ˆœ, ์ˆซ์ž์ˆœ (๊ฐ€๋‚˜๋‹ค, abc, 123)์œผ๋กœ ์ •๋ ฌ์„ ํ•˜์—ฌ ํŽ˜์ด์ง•์„ ํ•ด๋‹ฌ๋ผ๋Š” ์š”๊ตฌ๋ฅผ ๋ฐ›์€ ์ ์ด ์žˆ๋‹ค.

๊ฐ๊ฐ์„ ๋ฐœ๋ผ๋‚ด์„œ ์ •๋ ฌํ•œ ํ›„ ๋จธ์ง€ํ•˜๊ณ  ํŽ˜์ด์ง•์„ ํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ ์บ๋ฆญํ„ฐ์˜ ์ •๋ ฌ ๋กœ์ง์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ•ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ๋Š”๋ฐ ๋‹คํ–‰ํžˆ ์ด๋ฏธ ๊นƒํ—ˆ๋ธŒ์— ๊ตฌํ˜„ํ•œ ๋กœ์ง์ด ์žˆ์–ด์„œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

/**
 * @author CodeVillains
 * @description : ํ•œ๊ธ€ > ์˜์–ด > ์ˆซ์ž > ํŠน์ˆ˜๋ฌธ์ž ์ˆœ์„œ๋กœ ์ •๋ ฌ  
 */

// Sort ๋ฉ”์„œ๋“œ (Collections.sort() ๋ฅผ ์ด์šฉํ•˜๋˜, ํ•œ๊ธ€, ์˜๋ฌธ, ์ˆซ์ž ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด 
// OrderingByKoreanEnglishNumbuerSpecial ์—์„œ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
private void sortByName(List<Partner> results) {
        // ๊ฐ€๋‚˜๋‹ค abc 123 ์ˆœ์œผ๋กœ ์ •๋ ฌ
        Collections.sort(results, new Comparator<Partner>() {
            @Override
            public int compare(Partner left, Partner right) {
                return OrderingByKoreanEnglishNumbuerSpecial.compare(left.getName(), right.getName());
            }
        });
    }
/**
 * @author CodeVillains
 * @description : ํ•œ๊ธ€ > ์˜์–ด > ์ˆซ์ž > ํŠน์ˆ˜๋ฌธ์ž ์ˆœ์„œ๋กœ ์ •๋ ฌ  
 */

import org.apache.commons.lang3.StringUtils;

public class OrderingByKoreanEnglishNumbuerSpecial {
    private static final int REVERSE = -1;
    private static final int LEFT_FIRST = -1;
    private static final int RIGHT_FIRST = 1;

    /**
     * ํ•œ๊ธ€ > ์˜์–ด > ์ˆซ์ž > ํŠน์ˆ˜๋ฌธ์ž ์ˆœ์„œ ๋น„๊ต ํ•จ์ˆ˜  
     * @param left 
     * @param right 
     * @return int
     */
    public static int compare(String left, String right) {
        left = StringUtils.upperCase(left).replaceAll(" ", "");
        right = StringUtils.upperCase(right).replaceAll(" ", "");
        int leftLen = left.length();
        int rightLen = right.length();
        int minLen = Math.min(leftLen, rightLen);
        for (int i = 0; i < minLen; ++i) {
            char leftChar = left.charAt(i);
            char rightChar = right.charAt(i);
            if (leftChar != rightChar) {
                if (isKoreanAndEnglish(leftChar, rightChar) || isKoreanAndNumber(leftChar, rightChar) || isEnglishAndNumber(leftChar, rightChar) || isKoreanAndSpecial(leftChar, rightChar)) {
                    return (leftChar - rightChar) * REVERSE;
                } else if (isEnglishAndSpecial(leftChar, rightChar) || isNumberAndSpecial(leftChar, rightChar)) {
                    if (CharUtil.isEnglish(leftChar) || CharUtil.isNumber(leftChar)) {
                        return LEFT_FIRST;
                    } else {
                        return RIGHT_FIRST;
                    }
                } else {
                    return leftChar - rightChar;
                }
            }
        }
        return leftLen - rightLen;
    }

    private static boolean isKoreanAndEnglish(char ch1, char ch2) {
        return (CharUtil.isEnglish(ch1) && CharUtil.isKorean(ch2)) || (CharUtil.isKorean(ch1) && CharUtil.isEnglish(ch2));
    }

    private static boolean isKoreanAndNumber(char ch1, char ch2) {
        return (CharUtil.isNumber(ch1) && CharUtil.isKorean(ch2)) || (CharUtil.isKorean(ch1) && CharUtil.isNumber(ch2));
    }

    private static boolean isEnglishAndNumber(char ch1, char ch2) {
        return (CharUtil.isNumber(ch1) && CharUtil.isEnglish(ch2)) || (CharUtil.isEnglish(ch1) && CharUtil.isNumber(ch2));
    }

    private static boolean isKoreanAndSpecial(char ch1, char ch2) {
        return (CharUtil.isKorean(ch1) && CharUtil.isSpecial(ch2)) || (CharUtil.isSpecial(ch1) && CharUtil.isKorean(ch2));
    }

    private static boolean isEnglishAndSpecial(char ch1, char ch2) {
        return (CharUtil.isEnglish(ch1) && CharUtil.isSpecial(ch2)) || (CharUtil.isSpecial(ch1) && CharUtil.isEnglish(ch2));
    }

    private static boolean isNumberAndSpecial(char ch1, char ch2) {
        return (CharUtil.isNumber(ch1) && CharUtil.isSpecial(ch2)) || (CharUtil.isSpecial(ch1) && CharUtil.isNumber(ch2));
    }
}
/**
 * @author CodeVillains
 */
public class CharUtil {
    public static boolean isEnglish(char ch) {
        return (ch >= (int) 'A' && ch <= (int) 'Z') || (ch >= (int) 'a' && ch <= (int) 'z');
    }

    public static boolean isKorean(char ch) {
        return ch >= Integer.parseInt("AC00", 16) && ch <= Integer.parseInt("D7A3", 16);
    }

    public static boolean isNumber(char ch) {
        return ch >= (int) '0' && ch <= (int) '9';
    }

    public static boolean isSpecial(char ch) {
        return (ch >= (int) '!' && ch <= (int) '/')
                || (ch >= (int)':' && ch <= (int)'@')
                || (ch >= (int)'[' && ch <= (int)'`')
                || (ch >= (int)'{' && ch <= (int)'~');
    }
}

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages