Java - Collection

๋ฐ•์ข…ํ˜ธยท2024๋…„ 2์›” 16์ผ
0

Java

๋ชฉ๋ก ๋ณด๊ธฐ
8/8

๐ŸŽƒ Collection

์ปฌ๋ ‰์…˜(Collection) ์ด๋ž€ ์‚ฌ์ „์  ์˜๋ฏธ๋กœ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•ด์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋‹ค์ˆ˜๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ด ๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ 10๊ฐœ์˜ Product ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ด ๋‘๊ณ , ํ•„์š”ํ•  ๋•Œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์ด์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ Product ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, ๊ฒ€์ƒ‰, ์‚ญ์ œํ• ์ง€ ๊ณ ๋ฏผํ•ด์•ผํ•˜๋Š”๋ฐ, ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด์ฃ .

// ๊ธธ์ด 10์ธ ๋ฐฐ์—ด ์ƒ์„ฑ
Product[] productArray = new Product[10];

// ๊ฐ์ฒด ์ถ”๊ฐ€
productArray[0] = new Product("์ƒํ’ˆ0");
productArray[1] = new Product("์ƒํ’ˆ1");
productArray[2] = new Product("์ƒํ’ˆ2");

// ๊ฐ์ฒด ๊ฒ€์ƒ‰
Product model0 = productArray[0];
Product model1 = productArray[1];
Product model2 = productArray[2];

// ๊ฐ์ฒด ์‚ญ์ œ
productArray[0] = null;
productArray[1] = null;
productArray[2] = null;

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


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

์ž๋ฐ”์—์„œ๋Š” ๋ช‡๊ฐ€์ง€ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ, ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ List, Set, Map์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค : ArrayList, Vector, LinkedList
  • Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค : HashSet, TreeSet
  • Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค : HashMap, Hashtable, TreeMap, Properties

List์™€ Set์€ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œ, ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋งŽ์€ ๊ณตํ†ต์ ์ด ์žˆ๋Š”๋ฐ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋“ค์˜ ๊ณตํ†ต๋œ ๋ฉ”์†Œ๋“œ๋งŒ ๋ชจ์•„ Collection ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•ด ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Map์€ ํ‚ค(Key)์™€ ๊ฐ’(Value)์„ ํ•˜๋‚˜์˜ ์Œ์œผ๋กœ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ, ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ List๋‚˜ Set๊ณผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์ „ํ˜€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฑ•ํ„ฐ์—์„œ List, Set, Map ๊ฐ๊ฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•˜์—ฌ ๋”์šฑ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐ŸŽ„ List - ArrayList, LinkedList

List ์ปฌ๋ ‰์…˜์€ ๊ฐ์ฒด๋ฅผ ์ผ๋ ฌ๋กœ ๋Š˜์–ด๋†“์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๋ฐฐ์—ด๋„ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ ์žˆ์ง€๋งŒ, ๋ฐฐ์—ด์€ ์„ ์–ธ ์‹œ์ ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์„ ์–ธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šด ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋‹จ์ ์„ ๋ณด์™„ํ•œ, ์ž๋ฃŒํ˜•์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ณ„์† ๋ณ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์œ ๋ฆฌํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ํ˜•ํƒœ๊ฐ€ ๋ฐ”๋กœ List์ž…๋‹ˆ๋‹ค.
List ์ปฌ๋ ‰์…˜์€ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ์ฒด์˜ ๋ฒˆ์ง€๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. null๋„ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์ธ๋ฑ์Šค๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ List ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ String์œผ๋กœ ์ •ํ•ด๋†“๊ณ  ์ถ”๊ฐ€, ์ฐพ๊ธฐ, ๊ทธ๋ฆฌ๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ์ฝ”๋“œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

List<String> list = ...;
list.add("ํ™๊ธธ๋™");
list.add(1, "์‚ผ๊ธธ๋™");
String str = list.get(1);
list.remove(0);
list.remove("์‚ผ๊ธธ๋™");

๋งŒ์•ฝ ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋‚˜์”ฉ ๋ฐ˜๋ณตํ•ด์„œ ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด for๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

List<String> list = ...;
for (int i = 0; i < list.size; i++) {
	String str = list.get(i);  // i ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ String ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ด
}

์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด ํ–ฅ์ƒ๋œ for๋ฌธ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

for (String str : list) {   // ์ €์žฅ๋œ list ์ด ๊ฐฏ์ˆ˜๋งŒํผ ๋ฃจํ•‘
}

์•„๋ž˜ ํ‘œ๋Š” List ์ปฌ๋ ‰์…˜์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ List ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋“ค์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋กœ ๊ฐ์ฒด ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ๋งค๊ฐœ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ๋ฉ”์†Œ๋“œ์„ค๋ช…
๊ฐ์ฒด ์ถ”๊ฐ€boolean add(E e)์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋งจ ๋์— ์ถ”๊ฐ€
void add(int index, E element)์ฃผ์–ด์ง„ ์ธ๋ฑ์Šค์— ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€
set(int index, E element)์ฃผ์–ด์ง„ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟˆ
๊ฐ์ฒด ๊ฒ€์ƒ‰boolean contains(Object o)์ฃผ์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€
E get(int index)์ฃผ์–ด์ง„ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด
isEmpty()์ปฌ๋ ‰์…˜์ด ๋น„์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€
int size()์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ „์ฒด ๊ฐ์ฒด ์ˆ˜ ๋ฆฌํ„ด
๊ฐ์ฒด ์‚ญ์ œvoid clear()์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์‚ญ์ œ
E remove(int index)์ฃผ์–ด์ง„ ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œ
boolean remove(Object o)์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œ

ArrayList

ArrayList๋Š” List ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋กœ, ArrayList์— ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ๋˜๋ฉด ๊ฐ์ฒด๊ฐ€ ์ธ๋ฑ์Šค๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ArrayList๋Š” ์ธ๋ฑ์Šค๋กœ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์ ์—์„œ๋Š” ๊ฐ™์ง€๋งŒ, ํฐ ์ฐจ์ด์ ์„ ๊ฐ–๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐฐ์—ด์€ ์ƒ์„ฑํ•  ๋•Œ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜๊ณ  ์‚ฌ์šฉ ์ค‘์— ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์ง€๋งŒ, ArrayList๋Š” ์ €์žฅ ์šฉ๋Ÿ‰(capacity)์„ ์ดˆ๊ณผํ•œ ๊ฐ์ฒด๋“ค์ด ๋“ค์–ด์˜ค๋ฉด ์ž๋™์ ์œผ๋กœ ์ €์žฅ ์šฉ๋Ÿ‰(capacity)์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
ArrayList์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋กœ ArrayList๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋‚ด๋ถ€์— 10๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋˜๋Š” ๊ฐ์ฒด ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ์šฉ๋Ÿ‰์ด ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜์ง€๋งŒ, ์ฒ˜์Œ๋ถ€ํ„ฐ ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์žก๊ณ ์‹ถ๋‹ค๋ฉด ํฌ๊ธฐ๋ฅผ ๋งค๊ฐœ๊ฐ’์œผ๋กœ ๋„ฃ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

List<String> list = new ArrayList<String>(30);  //String๊ฐ์ฒด 30๊ฐœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์šฉ๋Ÿ‰

ArrayList์— ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ArrayList์—์„œ ํŠน์ • ์ธ๋ฑ์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋ฐ”๋กœ ๋’ค ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋ชจ๋‘ ์•ž์œผ๋กœ 1์”ฉ ๋‹น๊ฒจ์ง‘๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŠน์ • ์ธ๋ฑ์Šค์— ๊ฐ์ฒด๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ํ•ด๋‹น ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋ชจ๋‘ 1์”ฉ ๋ฐ€๋ ค๋‚ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ๊ทธ๋ฆผ์€ 4๋ฒˆ ์ธ๋ฑ์Šค๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์„ ๋•Œ 5๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋ชจ๋‘ ์•ž์œผ๋กœ 1์”ฉ ๋‹น๊ฒจ์ง€๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.


๋”ฐ๋ผ์„œ ๋นˆ๋ฒˆํ•œ ๊ฐ์ฒด ์‚ญ์ œ์™€ ์‚ฝ์ž…์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ์—์„œ๋Š” ArrayList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ๋ผ๋ฉด, LinkedList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธ๋ฑ์Šค ๊ฒ€์ƒ‰, ๋งจ๋งˆ์ง€๋ง‰์— ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ArrayList๊ฐ€ ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ์˜ˆ์ œ๋Š” ArrayList์— String ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, ๊ฒ€์ƒ‰, ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

public class ArrayListExample {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();

		// String ๊ฐ์ฒด๋ฅผ ์ €์žฅ
		list.add("Java");
		list.add("Spring");
		list.add("Servlet/JSP");
		list.add("DBMS");
		list.add("JPA");

		int size = list.size();
		System.out.println("์ด ๊ฐ์ฒด ์ˆ˜: " + size);
		System.out.println();

		String skill = list.get(2);
		System.out.println("Skill 2: " + skill);
		System.out.println();

		for (int i = 0; i < list.size(); i++) {
			String str = list.get(i);
			System.out.println(i + ": " + str);
		}
		System.out.println();

		list.remove(2);		// 2๋ฒˆ ์ธ๋ฑ์Šค(Servlet/JSP) ์‚ญ์ œ
		list.remove(2);		// 2๋ฒˆ ์ธ๋ฑ์Šค(DBMS) ์‚ญ์ œ 
		list.remove("Java");

		for (int i = 0; i < list.size(); i++) {		// ์ €์žฅ๋œ ์ด ๊ฐ์ฒด ์ˆ˜๋งŒํผ ๋ฃจํ•‘
			String str = list.get(i);
			System.out.println(i + ": " + str);
		}

	}
}

<์‹คํ–‰๊ฒฐ๊ณผ>

์ด ๊ฐ์ฒด ์ˆ˜: 5

Skill 2: Servlet/JSP

0: Java
1: Spring
2: Servlet/JSP
3: DBMS
4: JPA

0: Spring
1: JPA

LinkedList

LinkedList๋Š” List ๊ตฌํ˜„ ํด๋ž˜์Šค์ด๋ฏ€๋กœ ArrayList์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋˜‘๊ฐ™์ง€๋งŒ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ์™„์ „ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
ArrayList๋Š” ๋‚ด๋ถ€ ๋ฐฐ์—ด์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ด์„œ ์ธ๋ฑ์Šค๋กœ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, LinkedList๋Š” ์ธ์ ‘ ์ฐธ์กฐ๋ฅผ ๋งํฌํ•ด์„œ ์ฒด์ธ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

LinkedList์—์„œ ํŠน์ • ์ธ๋ฑ์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์•ž๋’ค ๋งํฌ๋งŒ ๋ณ€๊ฒฝ๋˜๊ณ  ๋‚˜๋จธ์ง€ ๋งํฌ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ธ๋ฑ์Šค์— ๊ฐ์ฒด๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ฃ . ArrayList๋Š” ์ค‘๊ฐ„ ์ธ๋ฑ์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋’ค์— ๊ฐ์ฒด๋Š” ์ธ๋ฑ์Šค๊ฐ€ 1์”ฉ ์•ž์œผ๋กœ ๋‹น๊ฒจ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ๋ฒˆํ•œ ๊ฐ์ฒด ์‚ญ์ œ์™€ ์‚ฝ์ž…์— ๋ถˆ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ์ค‘๊ฐ„์— ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•  ๊ฒฝ์šฐ ์•ž๋’ค ๋งํฌ์˜ ์ˆ˜์ •์ด ์ผ์–ด๋‚˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

LinkedList๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ €์žฅํ•  ๊ฐ์ฒด ํƒ€์ž…์„ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ(E)์— ํ‘œ๊ธฐํ•˜๊ณ  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. LinkedList๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ์—๋Š” ์–ด๋– ํ•œ ๋งํฌ๋„ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€๋Š” ๋น„์–ด์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

List<E> list = new LinkedList<E>();

๋‹ค์Œ ์˜ˆ์ œ๋Š” ArrayList์™€ LinkedList์— 10,000๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์ธก์ •ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
0๋ฒˆ ์ธ๋ฑ์Šค์— String ๊ฐ์ฒด๋ฅผ 10,000๋ฒˆ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด List ์ธํ„ฐํŽ˜์ด์Šค์˜ add(int index, E element)๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

public class LinkedListExample {

	public static void main(String[] args) {
		List<String> arrayList = new ArrayList<>();
		List<String> linkedList = new LinkedList<>();

		long startTime;
		long endTime;

		startTime = System.nanoTime();
		for (int i = 0; i < 10000; i++) {
			arrayList.add(0, String.valueOf(i));
		}
		endTime = System.nanoTime();
		System.out.println("ArrayList ๊ฑธ๋ฆฐ์‹œ๊ฐ„: " + (endTime - startTime) + "ns");

		startTime = System.nanoTime();
		for (int i = 0; i < 10000; i++) {
			linkedList.add(0, String.valueOf(i));
		}
		endTime = System.nanoTime();
		System.out.println("LinkedList ๊ฑธ๋ฆฐ์‹œ๊ฐ„: " + (endTime - startTime) + "ns");
	}
}

์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด LinkedList๊ฐ€ ArrayList๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค.

ArrayList ๊ฑธ๋ฆฐ์‹œ๊ฐ„: 56252133ns
LinkedList ๊ฑธ๋ฆฐ์‹œ๊ฐ„: 3332620ns

์‹คํ–‰ ๊ฒฐ๊ณผ์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ค‘๊ฐ„์— ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ•  ๊ฒฝ์šฐ๋Š” ์•ž๋’ค ๋งํฌ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๋Š” LinkedList๊ฐ€ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ArrayList๋Š” ๋’ค์ชฝ ์ธ๋ฑ์Šค๋“ค์„ ๋ชจ๋‘ 1์”ฉ ์ฆ๊ฐ€ ๋˜๋Š” ๊ฐ์†Œ ์‹œํ‚ค๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋А๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿซ  Set - HashSet

List ์ปฌ๋ ‰์…˜๊ณผ Set ์ปฌ๋ ‰์…˜์€ ํฐ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. List ์ปฌ๋ ‰์…˜์€ ์ €์žฅ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ, Set ์ปฌ๋ ‰์…˜์€ ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ค‘๋ณตํ•ด์„œ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค๋Š” ํฐ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Set ์ปฌ๋ ‰์…˜์—๋Š” HashSet, LinkedHashSet, TreeSet ๋“ฑ์ด ์žˆ๋Š”๋ฐ, ๋‹ค์Œ์€ Set ์ปฌ๋ ‰์…˜์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Set ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋“ค์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ๋ฉ”์†Œ๋“œ์„ค๋ช…
๊ฐ์ฒด ์ถ”๊ฐ€boolean add(E e)์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์ €์žฅ, ๊ฐ์ฒด๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜๋ฉด true๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์ค‘๋ณต ๊ฐ์ฒด๋ฉด false๋ฅผ ๋ฆฌํ„ด
๊ฐ์ฒด ๊ฒ€์ƒ‰boolean contains(Object o)์ฃผ์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
isEmpty()์ปฌ๋ ‰์…˜์ด ๋น„์–ด ์žˆ๋Š”์ง€ ์กฐ์‚ฌ
Iterator iterator()์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ˜๋ณต์ž ๋ฆฌํ„ด
int size()์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ „์ฒด ๊ฐ์ฒด ์ˆ˜ ๋ฆฌํ„ด
๊ฐ์ฒด ์‚ญ์ œvoid clear()์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์‚ญ์ œ
boolean remove(Object o)์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œ
Set<String> set = ..;
set.add("์นด๋ฆฌ๋‚˜");
set.add("์œˆํ„ฐ");
set.remove("์นด๋ฆฌ๋‚˜");

Set ์ปฌ๋ ‰์…˜์€ ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋กœ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ธ๋ฑ์Šค๋กœ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์ฃ . ๋Œ€์‹ , ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋ฒˆ์”ฉ ๋ฐ˜๋ณตํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž๋Š” Iterator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ๋งํ•˜๋Š”๋ฐ, iterator() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Set<String> set = ...;
Iterator<String> iterator = set.iterator();

๋‹ค์Œ์€ Iterator ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๋“ค์ž…๋‹ˆ๋‹ค.

๋ฆฌํ„ด ํƒ€์ž…๋ฉ”์†Œ๋“œ๋ช…์„ค๋ช…
booleanhasNext()๊ฐ€์ ธ์˜ฌ ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด true๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์—†์œผ๋ฉด false๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค
Enext()์ปฌ๋ ‰์…˜์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค
voidremove()Set ์ปฌ๋ ‰์…˜์—์„œ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค

Iterator์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” next() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. next() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋จผ์ € ๊ฐ€์ ธ์˜ฌ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์ฃ ? ์ด๋•Œ hasNext() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. hasNext() ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ€์ ธ์˜ฌ ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด true๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ์—†์œผ๋ฉด false๋ฅผ ๋ฆฌํ„ดํ•ด์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ true๊ฐ€ ๋ฆฌํ„ด๋  ๋•Œ next() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Set ์ปฌ๋ ‰์…˜์—์„œ String ๊ฐ์ฒด๋“ค์„ ๋ฐ˜๋ณตํ•ด์„œ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Set<String> set = ...;

Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {		// ์ €์žฅ๋œ ๊ฐ์ฒด ์ˆ˜๋งŒํผ ๋ฃจํ•‘
	String str = iterator.next(); // String ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์˜ด
}

Iterator๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ํ–ฅ์ƒ๋œ for๋ฌธ์„ ์ด์šฉํ•ด์„œ ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Set<String> set = ...;
for (String str : set) {  //์ €์žฅ๋œ ๊ฐ์ฒด ์ˆ˜๋งŒํผ ๋ฃจํ•‘

}

๊ทธ๋ฆฌ๊ณ  Set ์ปฌ๋ ‰์…˜์—์„œ Iterator์˜ next() ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ€์ ธ์˜จ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ ์‹ถ๋‹ค๋ฉด remove() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Iterator์˜ ๋ฉ”์†Œ๋“œ์ด์ง€๋งŒ, ์‹ค์ œ Set ์ปฌ๋ ‰์…˜์—์„œ ๊ฐ์ฒด๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณผ๊ฒŒ์š”.

Set<String> set = ...;

Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {   // ์ €์žฅ๋œ ๊ฐ์ฒด ์ˆ˜๋งŒํผ ๋ฃจํ•‘
	iterator.remove();           // ๊ฐ์ฒด ์ œ๊ฑฐ
}

HashSet

HashSet์€ Set ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. HashSet์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Set<E> set = new HashSet<E>();

์•ž์„œ ๋ดค๋˜ ArrayList, LinkedList์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ E์—๋Š” ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•  ๊ฐ์ฒด ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด String ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” HashSet์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Set<String> set = new HashSet<String>();

HashSet์€ ๊ฐ์ฒด๋“ค์„ ์ˆœ์„œ ์—†์ด ์ €์žฅํ•˜๊ณ  ๋™์ผํ•œ ๊ฐ์ฒด๋Š” ์ค‘๋ณต ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” โ€˜๋™์ผํ•œ ๊ฐ์ฒดโ€™๋Š” ์ž๋ฐ”์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ผํ•œ์ง€ ํŒ๋‹จํ• ๊นŒ์š”? HashSet์ด ํŒ๋‹จํ•˜๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ž€ ๊ผญ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. HashSet์€ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ „์— ๋จผ์ € ๊ฐ์ฒด์˜ hashCode() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์–ป์–ด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ ์ €์žฅ๋˜์–ด์žˆ๋˜ ๊ฐ์ฒด๋“ค์˜ ํ•ด์‹œ์ฝ”๋“œ์™€ ๋น„๊ตํ•˜์ง€์š”. ๋งŒ์•ฝ ๋™์ผํ•œ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ equals() ๋ฉ”์†Œ๋“œ๋กœ ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•ด์„œ true๊ฐ€ ๋‚˜์˜ค๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•˜๊ณ  ์ค‘๋ณต ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋กœ HashSet์— String ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, ๊ฒ€์ƒ‰, ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

public class HashSetExample {
	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("Java");
		set.add("Spring");
		set.add("Servlet/JSP");
		set.add("Java");
		set.add("DBMS");

		System.out.println("์ด ๊ฐ์ฒด์ˆ˜: " + set.size());  // ์ €์žฅ๋œ ๊ฐ์ฒด์ˆ˜ ์ถœ๋ ฅ

		Iterator<String> iterator = set.iterator();    // ๋ฐ˜๋ณต์ž ์–ป๊ธฐ
		while (iterator.hasNext()) {              // ๊ฐ์ฒด ์ˆ˜ ๋งŒํผ ๋ฃจํ•‘
			String element = iterator.next();       // ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค
			System.out.println("\t" + element);
		}

		set.remove("DBMS");      // ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด ์‚ญ์ œ
		set.remove("Java");      // ํ•œ ๊ฐœ์˜ ๊ฐ์ฒด ์‚ญ์ œ
		System.out.println("์ด ๊ฐ์ฒด์ˆ˜: " + set.size());

		iterator = set.iterator();
		while (iterator.hasNext()) { 
			String element = iterator.next();
			System.out.println("\t" + element);
		}

		set.clear();       // ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋น„์›€
		if (set.isEmpty()) {
			System.out.println("๋น„์–ด์žˆ์Œ");
		}
	}
}

<์‹คํ–‰๊ฒฐ๊ณผ>

์ด ๊ฐ์ฒด์ˆ˜: 4
	Java
	Servlet/JSP
	DBMS
	Spring
์ด ๊ฐ์ฒด์ˆ˜: 2
	Servlet/JSP
	Spring
๋น„์–ด์žˆ์Œ

์œ„ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ ์ดํ•ด๊ฐ€ ๋˜์…จ๋‹ค๋ฉด ๋‹ค์Œ ํ€ด์ฆˆ๋กœ ๋„˜์–ด๊ฐˆ๊ฒŒ์š”.
์•„๋ž˜ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

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

public class HashSetExample2 {
	public static void main(String[] args) {
		Set<Member> set = new HashSet<>();

		set.add(new Member("ํ™๊ธธ๋™", 30));
		set.add(new Member("ํ™๊ธธ๋™", 30));

		System.out.println("์ด ๊ฐ์ฒด์ˆ˜: " + set.size());
	}
}
public class Member {
	String name;
	int age;

	public Member(String name, int age) {
		this.name = name;
		this.age = age;
	}
}
์ด ๊ฐ์ฒด์ˆ˜: 2

๋‘ ๋ฒˆ ์ค‘๋ณต์œผ๋กœ ์‚ฝ์ž…ํ•œ Member ์ธ์Šคํ„ด์Šค๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์ผํ•˜์ง€๋งŒ, ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ๋‘˜ ๋‹ค ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜๋„ํ•œ ๋ฐ”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๊ฟ”๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Memberํด๋ž˜์Šค์—์„œ hashCode()์™€ equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด์„œ,
์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ฌ๋ผ๋„ ์ด๋ฆ„, ๋‚˜์ด๊ฐ€ ๋™์ผํ•˜๋‹ค๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ์ค‘๋ณต ์ €์žฅ๋˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊ฒŒ์š”.

public class Member {
	String name;
	int age;

	public Member(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		return name.hashCode() + age;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Member) {
			Member member = (Member)obj;
			return member.name.equals(this.name) && member.age == this.age;
		} else {
			return false;
		}
	}
}
import java.util.HashSet;
import java.util.Set;

public class HashSetExample2 {
	public static void main(String[] args) {
		Set<Member> set = new HashSet<>();

		set.add(new Member("ํ™๊ธธ๋™", 30));
		set.add(new Member("ํ™๊ธธ๋™", 30));   // ์ธ์Šคํ„ด์Šค๋Š” ๋‹ค๋ฅด์ง€๋งŒ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์ผํ•˜๋ฏ€๋กœ ๊ฐ์ฒด 1๊ฐœ๋งŒ ์ €์žฅ

		System.out.println("์ด ๊ฐ์ฒด์ˆ˜: " + set.size());
	}
}
์ด ๊ฐ์ฒด์ˆ˜: 1

๐Ÿ—บ๏ธ Map - HashMap, Hashtable

Map ์ปฌ๋ ‰์…˜์€ ํ‚ค(key)์™€ ๊ฐ’(value)์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ‚ค์™€ ๊ฐ’์€ ๋ชจ๋‘ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ํ‚ค๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์ง€๋งŒ ๊ฐ’์€ ์ค‘๋ณต ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ธฐ์กด์— ์ €์žฅ๋˜์—ˆ๋˜ ํ‚ค๊ฐ’๊ณผ ๋™์ผํ•œ ํ‚ค๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๋ฉด ๊ธฐ์กด์˜ ๊ฐ’์€ ์—†์–ด์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์น˜๋ฉ๋‹ˆ๋‹ค.

Map ์ปฌ๋ ‰์…˜์—๋Š” HashMap, Hashtable, LinkedHashMap, Properties, TreeMap ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ํ‘œ๋Š” Map ์ปฌ๋ ‰์…˜์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ๋“ค์ž…๋‹ˆ๋‹ค. โ€˜Keyโ€™๋กœ ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Key๋ฅผ ๋งค๊ฐœ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ๋ฉ”์†Œ๋“œ์„ค๋ช…
๊ฐ์ฒด์ถ”๊ฐ€V put(K key, V value)์ฃผ์–ด์ง„ ํ‚ค์™€ ๊ฐ’์„ ์ถ”๊ฐ€, ์ €์žฅ๋˜๋ฉด ๊ฐ’์„ ๋ฆฌํ„ด
๊ฐ์ฒด๊ฒ€์ƒ‰boolean containsKey(Object key)์ฃผ์–ด์ง„ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
boolean containsValue(Object value)์ฃผ์–ด์ง„ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
Set(Map.Entry<K,V>> entrySet()ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ชจ๋“  Map.Entry ๊ฐ์ฒด๋ฅผ Set์— ๋‹ด์•„์„œ ๋ฆฌํ„ด
V get(Object key)์ฃผ์–ด์ง„ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฐ’์„ ๋ฆฌํ„ด
boolean isEmpty()์ปฌ๋ ‰์…˜์ด ๋น„์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
Set keySet()๋ชจ๋“  ํ‚ค๋ฅผ Set ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ฆฌํ„ด
int size()์ €์žฅ๋œ ํ‚ค์˜ ์ด ๊ฐœ์ˆ˜ ๋ฆฌํ„ด
Collection values()์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’์„ Collection์— ๋‹ด์•„์„œ ๋ฆฌํ„ด
๊ฐ์ฒด์‚ญ์ œvold clear()๋ชจ๋“  Map.Entry(ํ‚ค์™€ ๊ฐ’)๋ฅผ ์‚ญ์ œ
V remove(Object key)์ฃผ์–ด์ง„ ํ‚ค์™€ ์ผ์น˜ํ•˜๋Š” Map.Entry๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๊ฐ’์„ ๋ฆฌํ„ด

์œ„ ํ‘œ์—์„œ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ๋ฆฌํ„ด ํƒ€์ž…์— K, V๋ผ๋Š” ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ์ด๊ฒƒ์€ Map ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์€ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ถ”๊ฐ€๋Š” put() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , key๋กœ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์˜ฌ ๋•Œ์—๋Š” get(key) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์‚ญ์ œ๋Š” remove(key) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Map<String, Integer> map = ...;
map.put("ํ™๊ธธ๋™", 30);          // ๊ฐ์ฒด ์ถ”๊ฐ€
int score = map.get("ํ™๊ธธ๋™");  // ๊ฐ์ฒด ์ฐพ๊ธฐ
map.remove("ํ™๊ธธ๋™");           // ๊ฐ์ฒด ์‚ญ์ œ

key๋ฅผ ์•Œ๊ณ ์žˆ๋‹ค๋ฉด ์œ„ ์ฝ”๋“œ์™€๊ฐ™์ด get() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ, ์ €์žฅ๋œ ๊ฐ์ฒด ์ „์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ์–ป๊ณ ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š”

  1. keySet() ๋ฉ”์†Œ๋“œ๋กœ ๋ชจ๋“  ํ‚ค๋ฅผ Set ์ปฌ๋ ‰์…˜์œผ๋กœ ์–ป์€ ๋‹ค์Œ, ๋ฐ˜๋ณต์ž๋ฅผ ํ†ตํ•ด ํ‚ค๋ฅผ ํ•˜๋‚˜์”ฉ ์–ป๊ณ  get() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์–ป์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
Map<K, V> map = ...;
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
	K key = keyIterator.next();
	V value = map.get(key);
}
  1. entrySet() ๋ฉ”์†Œ๋“œ๋กœ ๋ชจ๋“  Map.Entry๋ฅผ Set ์ปฌ๋ ‰์…˜์œผ๋กœ ์–ป์€ ๋‹ค์Œ, ๋ฐ˜๋ณต์ž๋ฅผ ํ†ตํ•ด Map.Entry๋ฅผ ํ•˜๋‚˜์”ฉ ์–ป๊ณ  getKey()์™€ getValue() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ํ‚ค์™€ ๊ฐ’์„ ์–ป์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
Set<Map.Entry<String, Object>> entries = map.entrySet();
for (Map.Entry<String, Object> entry : entries) {
	String key = entry.getKey();
	Object value = entry.getValue();
}

HashMap

HashMap์€ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ Map ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. HashMap์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ‚ค ํƒ€์ž…๊ณผ ๊ฐ’ ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ๊ณ  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Map<K, V> map = new HashMap<K, V>(); // K: ํ‚ค ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ, V: ๊ฐ’ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ

ํ‚ค์™€ ๊ฐ’์˜ ํƒ€์ž…์€ Primitive type(byte, short, int, float, long, double, boolean, char)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋กœ String ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ’์œผ๋กœ Integer ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” HashMap์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Map<String, Integer> map = new HashMap<String, Integer>();

๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ด๋ฆ„์„ Key๋กœ, ์ ์ˆ˜๋ฅผ Value๋กœ ์ €์žฅํ•˜๋Š” HashMap ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  2๋ฒˆ ๋ถ€ํ„ฐ ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒํ•ด๋ณด์„ธ์š”.

  1. Map ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ
  2. ๊ฐ์ฒด ์ฐพ๊ธฐ : get() ๋ฉ”์†Œ๋“œ ์ด์šฉ
  3. ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ : keySet() ๋ฉ”์†Œ๋“œ ์ด์šฉ
  4. ํŠน์ • ๊ฐ์ฒด ์‚ญ์ œ : remove() ๋ฉ”์†Œ๋“œ ์ด์šฉ
  5. ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ : entrySet() ๋ฉ”์†Œ๋“œ ์ด์šฉ
  6. ๋ชจ๋“  Map.Entry ์‚ญ์ œ
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapExample {
public static void main(String[] args) {
// 1. Map ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ
Map<String, Integer> map = new HashMap<>();

	map.put("ํ™๊ธธ๋™", 80);
	map.put("์นด๋ฆฌ๋‚˜", 85);
	map.put("์ œ์‹œ์นด", 95);
	map.put("ํ™๊ธธ๋™", 80);        // "ํ™๊ธธ๋™" ํ‚ค๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ €์žฅํ•œ ๊ฐ’์œผ๋กœ ์—Ž์–ด์”€
	System.out.println("์ด Entry ์ˆ˜: " + map.size());    // ์ €์žฅ๋œ ์ด Entry ์ˆ˜ ์–ป๊ธฐ

	// 2. ๊ฐ์ฒด ์ฐพ๊ธฐ
	System.out.println("\tํ™๊ธธ๋™: " + map.get("ํ™๊ธธ๋™"));
	System.out.println();

	// 3. ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ
	Set<String> keySet = map.keySet();
	Iterator<String> iterator = keySet.iterator();
	while (iterator.hasNext()) {
		String key = iterator.next();
		Integer value = map.get(key);
		System.out.println("\t" + key + ": " + value);
	}
	System.out.println();

	// 4. ๊ฐ์ฒด ์‚ญ์ œ
	map.remove("ํ™๊ธธ๋™");
	System.out.println("์ด Entry ์ˆ˜: " + map.size());

	// 5. ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌ
	Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); // Map.EntrySet ์–ป๊ธฐ
	for (Map.Entry<String, Integer> entry : entrySet) {
		String key = entry.getKey();
		Integer value = entry.getValue();
		System.out.println("\t" + key + ": " + value);
	}
	System.out.println();

// 6. ๋ชจ๋“  Map.Entry ์‚ญ์ œ
	map.clear();
	System.out.println("์ด Entry ์ˆ˜: " + map.size());
}

}


<์‹คํ–‰๊ฒฐ๊ณผ>

```java
์ด Entry ์ˆ˜: 3
	ํ™๊ธธ๋™: 80

	์ œ์‹œ์นด: 95
	ํ™๊ธธ๋™: 80
	์นด๋ฆฌ๋‚˜: 85

์ด Entry ์ˆ˜: 2
	์ œ์‹œ์นด: 95
	์นด๋ฆฌ๋‚˜: 85

์ด Entry ์ˆ˜: 0

๋‹ค์Œ ์˜ˆ์ œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ์ฒด์ธ Student๋ฅผ Key๋กœ ํ•˜๊ณ  Value๋กœ๋Š” ์ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” HashMap์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class Student {
	private int no;
	private String name;

	public Student(int no, String name) {
		this.no = no;
		this.name = name;
	}

	@Override
	public boolean equals(Object obj) {  // ํ•™๋ฒˆ๊ณผ ์ด๋ฆ„์ด ๋™์ผํ•  ๊ฒฝ์šฐ true
		if (obj instanceof Student) {
			Student student = (Student)obj;
			return (no == student.no) && (name.equals(student.name));
		}
		return false;
	}

	@Override
	public int hashCode() {     // ํ•™๋ฒˆ๊ณผ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋ฉด ๋™์ผํ•œ ๊ฐ’์„ ๋ฆฌํ„ด
		return no + name.hashCode();
	}
}
import java.util.HashMap;
import java.util.Map;

public class HashMapExample2 {
	public static void main(String[] args) {
		Map<Student, Integer> map = new HashMap<>();

		map.put(new Student(50, "ํ™๊ธธ๋™"), 95);        // ํ•™๋ฒˆ๊ณผ ์ด๋ฆ„์ด ๋™์ผํ•œ Student๋ฅผ ํ‚ค๋กœ ์ €์žฅ
		map.put(new Student(50, "ํ™๊ธธ๋™"), 95);

		System.out.println("์ด Entry ์ˆ˜: " + map.size());    // ์ €์žฅ๋œ ์ด Map.Entry ์ˆ˜ ์–ป๊ธฐ
	}
}

<์‹คํ–‰๊ฒฐ๊ณผ>

์ด Entry ์ˆ˜: 1

Hashtable

HashMap๊ณผ ๋™์ผํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ Hashtable์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค. HashMap๊ณผ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋ผ๋ฉด Hashtable์€ ๋™๊ธฐํ™”๋œ(synchronized) ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ณ , ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰์„ ์™„๋ฃŒํ•ด์•ผ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์„ ๊ฐ–๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ thread safe ํ•˜๋‹ค๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

Hashtable์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ HashMap๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์€๋ฐ์š”, ํ‚ค ํƒ€์ž…๊ณผ ๊ฐ’ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ‚ค๋ณด๋“œ๋กœ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ, Hashtable์— ์ €์žฅ๋œ ํ‚ค(์•„์ด๋””)์™€ ๊ฐ’(๋น„๋ฐ€๋ฒˆํ˜ธ)์œผ๋กœ ๋น„๊ตํ•œ ํ›„ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

package Chapter12.hashtable;

import java.util.Hashtable;
import java.util.Map;
import java.util.Scanner;

public class HashTableExample {
  public static void main(String[] args) {
      Map<String, String> map = new Hashtable<>();
      map.put("taeyuniya12", "rladbs12!@");
      map.put("kkunh97", "rjsgur12!@");
      map.put("dlawhdfbf12", "rornf713!@");
      map.put("qkrwlstjd", "qkrwls12!@");

      Scanner scanner = new Scanner(System.in);

      while (true) {
          System.out.println("์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
          System.out.println("์•„์ด๋””: ");
          String id = scanner.nextLine();        // ํ‚ค๋ณด๋“œ๋กœ ์ž…๋ ฅํ•œ ์•„์ด๋””๋ฅผ ์ฝ๋Š”๋‹ค

          System.out.println("๋น„๋ฐ€๋ฒˆํ˜ธ: ");
          String password = scanner.nextLine();
          System.out.println();

          if (map.containsKey(id)) {
              if (map.get(id).equals(password)) {
                  System.out.println("๋กœ๊ทธ์ธ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค");
                  break;
              } else {
                  System.out.println("๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!");
              }
          } else {
              System.out.println("์ž…๋ ฅํ•˜์‹  ์•„์ด๋””๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!\n");
          }
      }


  }
}

<์‹คํ–‰๊ฒฐ๊ณผ>

๐Ÿงฑ LIFO , FIFO ์ปฌ๋ ‰์…˜ - Stack๊ณผ Queue

ํ›„์ž…์„ ์ถœ (LIFO: Last In First Out)์€ ๋‚˜์ค‘์— ๋„ฃ์€ ๊ฐ์ฒด๊ฐ€ ๋จผ์ € ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์„ ์ž…์„ ์ถœ(First In First Out)์€ ๋จผ์ € ๋„ฃ์€ ๊ฐ์ฒด๊ฐ€ ๋จผ์ € ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์—์„œ๋Š” ํ›„์ž…์„ ์ถœ(LIFO) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” Stack, ์„ ์ž…์„ ์ถœ(FIFO) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” Queue ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


Stack

Queue

Stack (ํ›„์ž…์„ ์ถœ, LIFO)

์Šคํƒ์€ ๋งˆ์ง€๋ง‰์— ๋„ฃ์€ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋น ์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ทธ๋ฆผ์œผ๋กœ ์Šคํƒ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ด๋ณผ๊ฒŒ์š”. ๊ณผ๊ฑฐ์— ํƒ์‹œ์—์„œ ์ฃผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋™์ „์ผ€์ด์Šค์ธ๋ฐ, ์ด ์ผ€์ด์Šค์—์„œ ๋™์ „์„ ๋„ฃ๊ณ , ๋บ„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋กœ ์Šคํƒ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์Šคํƒ ๊ตฌ์กฐ์—์„œ ๋งจ ์ฒ˜์Œ์— ๋„ฃ์€ ๋™์ „์€ ๋งจ ๋‚˜์ค‘์— ๋บ„ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (LIFO)


Stack ํด๋ž˜์Šค๋Š” LIFO ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค ์ด๊ณ , ๋‹ค์Œ ํ‘œ๋กœ Stack ํด๋ž˜์Šค์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ๋“ค์„ ๋ณด์‹œ์ฃ .

๋ฆฌํ„ด ํƒ€์ž…๋ฉ”์†Œ๋“œ์„ค๋ช…
Epush(E item)์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค
Epeek()์Šคํƒ์˜ ๋งจ ์œ„ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ฐ์ฒด๋ฅผ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
Epop()์Šคํƒ์˜ ๋งจ ์œ„ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ฐ์ฒด๋ฅผ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

Stack ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ €์žฅํ•  ๊ฐ์ฒด ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ‘œ๊ธฐํ•˜๊ณ  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Stack<E> stack = new Stack<E>();
package Chapter13;

import java.util.Stack;

public class StackExample {
  public static void main(String[] args) {
      Stack<String> stack = new Stack<>();
      stack.push("๋น„ํŠธ์ฝ”์ธ");
      stack.push("์ด๋”๋ฆฌ์›€");
      stack.push("์—์ด๋‹ค");
      stack.push("์†”๋ผ๋‚˜");

      System.out.println(stack.peek()); //paek๊ณผ pop์˜ ์ฐจ์ด๋Š” ๋ญ˜๊นŒ์š”?
      System.out.println(stack.peek());
      System.out.println(stack.peek());
      System.out.println(stack.peek());

      System.out.println("- - - - - -");

      System.out.println(stack.pop());
      System.out.println(stack.pop());
      System.out.println(stack.pop());
      System.out.println(stack.pop());
  }
}

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

Queue (์„ ์ž…์„ ์ถœ, FIFO)

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


๋‹ค์Œ ๊ทธ๋ฆผ์œผ๋กœ ํ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Queue ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋Ÿฐ FIFO ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํ‘œ์—์„œ Queue ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฆฌํ„ด ํƒ€์ž…๋ฉ”์†Œ๋“œ์„ค๋ช…
booleanoffer(E e)์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๋„ฃ๋Š”๋‹ค.
Epeek()๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ฐ์ฒด๋ฅผ ํ์—์„œ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
Epoll()๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ฐ์ฒด๋ฅผ ํ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

Queue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ ํด๋ž˜์Šค๋Š” LinkedList ์ž…๋‹ˆ๋‹ค.

LinkedList๋Š” List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— List ์ปฌ๋ ‰์…˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋Š” LinkedList ๊ฐ์ฒด๋ฅผ Queue ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

Queue<E> queue = new LinkedList<E>();

๋‹ค์Œ์€ Queue๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ๋„ฃ์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ˜๋Œ€์ชฝ์œผ๋กœ ๋จผ์ € ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋„ฃ์€ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ์œ ์ถ”ํ•ด๋ณด์‹œ๊ณ , ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด๋ฉด์„œ ์‹คํ–‰๊ฒฐ๊ณผ์™€ ๊ฐ™์€ ์ถœ๋ ฅ์„ ํ•˜๋„๋ก ํ•ด๋ด…์‹œ๋‹ค.

public class Message {
	private String command;
	private String to;

	public String getCommand() {
		return command;
	}

	public String getTo() {
		return to;
	}

	public Message(String command, String to) {
		this.command = command;
		this.to = to;
	}
}
import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
	public static void main(String[] args) {
		Queue<Message> messageQueue = new LinkedList<>();

		messageQueue.offer(new Message("sendMail", "ํ™๊ธธ๋™"));
		messageQueue.offer(new Message("sendSms", "์ œ๋‹ˆ"));
		messageQueue.offer(new Message("sendKakaoTalk", "๋ฆฌ์‚ฌ"));

		while (!messageQueue.isEmpty()) {        // ๋ฉ”์‹œ์ง€ ํ๊ฐ€ ๋น„์—ˆ๋Š”์ง€ ํ™•์ธ 
			Message message = messageQueue.poll(); // ๋ฉ”์‹œ์ง€ ํ์—์„œ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€ ๊บผ๋ƒ„
			switch (message.getCommand()) {
				case "sendMail":
					System.out.println(message.getTo() + "์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.");
					break;
				case "sendSms":
					System.out.println(message.getTo() + "์—๊ฒŒ SMS๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.");
					break;
				case "sendKakaoTalk":
					System.out.println(message.getTo() + "์—๊ฒŒ ์นดํ†ก์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.");
					break;
			}
		}
	}
}

<์‹คํ–‰๊ฒฐ๊ณผ>

ํ™๊ธธ๋™์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
์ œ๋‹ˆ์—๊ฒŒ SMS๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
๋ฆฌ์‚ฌ์—๊ฒŒ ์นดํ†ก์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
profile
Studying in Tech University of Korea

0๊ฐœ์˜ ๋Œ“๊ธ€