์ž๋ฐ”์˜ ์ •์„ - ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›(Collections Framework)

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ integer.blog



์ž๋ฐ”์˜ ์ •์„(๋‚จ๊ถ์„ฑ ์ €) ํ•™์Šต๋‚ด์šฉ ์ •๋ฆฌ

1. ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์› (Collections Framework)

‘๋ฐ์ดํ„ฐ ๊ทธ๋ฃน์„ ๋‹ค๋ฃจ๊ณ  ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์ผํ™”๋œ ๊ตฌ์กฐ’ - Java API๋ฌธ์„œ
JDK1.2 ์ด์ „๊นŒ์ง€๋Š” Vector, Hashtable, Properties์™€ ๊ฐ™์€ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค์„ ๊ฐ์ž์˜ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ

1.1. ํ•ต์‹ฌ ์ธํ„ฐํŽ˜์ด์Šค

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

Vector๋‚˜ Hashtable๊ณผ ๊ฐ™์€ ๊ธฐ์กด์˜ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค์€ ํ˜ธํ™˜์„ ์œ„ํ•ด,
์„ค๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ๋‚จ๊ฒจ๋‘์—ˆ์ง€๋งŒ ์‚ฌ์šฉ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
๋Œ€์‹  ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ArrayList์™€ HashMap ์‚ฌ์šฉ ๊ถŒ์žฅ.

1.2. ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†๊ณ„์ธต๋„

List ์ƒ์†๊ณ„์ธต๋„ - List - Vector - Stack - ArrayList - LinkedList

Set ์ƒ์†๊ณ„์ธต๋„ - List - HashSet - SortedSet - TreeSet

Map ์ƒ์†๊ณ„์ธต๋„ - Map - Hashtable - HashMap - LinkedHashMap - SortedMap - TreeMap

1.3. Map.Entry ์ธํ„ฐํŽ˜์ด์Šค

Map.Entry ์ธํ„ฐํŽ˜์ด์Šค๋Š” Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
Map์— ์ €์žฅ๋˜๋Š” key-value ์Œ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์— Entry ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜.
๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค ์•ˆ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

public interface Map  {
  ...
  interface Entry {
      Object getKey();
      Object getValue();
      Object setValue(Object value);
      boolean equals(Object o);
      int hashCode();
      ...
  }
}

2. ArrayList

ArrayList๋Š” ๊ธฐ์กด์˜ Vector๋ฅผ ๊ฐœ์„ ํ•œ ๊ฒƒ.
ArrayList๋Š” Object ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
๋ฐฐ์—ด์— ๋” ์ด์ƒ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด,
๋ณด๋‹ค ํฐ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์„œ ๊ธฐ์กด ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋‚ด์šฉ์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์ €์žฅํ•œ๋‹ค.
์„ ์–ธ๋œ ๋ฐฐ์—ด์˜ ํƒ€์ž…์ด Object์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

public class ArrayList extends AbstractList
    implements List, RandomAccess, Cloneable, java.io.Serializable  {
        ...
    transient Object[] elementData;  // Object๋ฐฐ์—ด
        ...
}

2.1. list์˜ ๊ณตํ†ต ์š”์†Œ ์‚ญ์ œํ•˜๊ธฐ

for(int i = list2.size()-1; i >= 0; i--)  {
    if(list1.contains(list2.get(i)))
        list2.remove(i);
}

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

2.2. ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ธธ์ด๋กœ ์ž˜๋ผ์„œ ArrayList์— ๋‹ด๊ธฐ

import java.util.*;

class ArrayListEx {
  public static void main(String[] args)  {
  
    final int LIMIT = 10; //์ž๋ฅด๊ณ ์ž ํ•˜๋Š” ๊ธ€์ž์˜ ๊ฐœ์ˆ˜ ์ง€์ •
    String source = "0123456789abcdefghijklmnopqrstuvwxyz"
    int length = source.length();
    
    List list = new ArrayList(length/LIMIT + 10); //ํฌ๊ธฐ๋ฅผ ์—ฌ์œ ์žˆ๊ฒŒ ์žก์Œ
    
    for(int 1=0; i< length; i+=LIMIT) {
        if(i+LIMIT < length)
            list.add(source.substring(i, i+LIMIT));
        else
            list.add(source.substring(i));
    }
    
    for(int i=0; i < list.size(); i++)  {
        System.out.println(list.get(i));
    }
  }
}

๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด์„ ํŠน์ • ํฌ๊ธฐ๋กœ ์ž˜๋ผ์„œ ์ถœ๋ ฅํ•  ๊ฒƒ์ด๋ผ๋ฉด
charAt(int i)์™€ for๋ฌธ์„ ์ด์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ,
ArrayList์— ๋‹ด์Œ์œผ๋กœ์„œ ๋” ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

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

2.3. remove() ๋ฉ”์†Œ๋“œ

Object[] data = null;  // ๊ฐ์ฒด๋ฅผ ๋‹ด๊ธฐ์œ„ํ•œ ๊ฐ์ฒด๋ฐฐ์—ด ์„ ์–ธ
int capacity = 0;  // ์šฉ๋Ÿ‰
int size = 0;  // ํฌ๊ธฐ

public Object remove(int index) {
    Object oldObj = null;
    
    if(index < 0 || index >=size)
        throw new IndexOutOfBoundsException("๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.");
    oldObj = data[index];
    
    if(index != size-1) {
        System.arraycopy(data, index+1, data, index, size-index-1);
    }
    
    data[size-1] = null;
    size--;
    
    return oldObj;
}

๋ฐฐ์—ด์˜ ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ
System.arraycopy()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.

3. LinkedList

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

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

3.1. ์‚ญ์ œ

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

3.2. ์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ (Doubly Linked List)

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

3.3. ArrayList์™€ LinkedList ๋น„๊ต

  • ์ˆœ์ฐจ์ ์ธ ์ถ”๊ฐ€/์‚ญ์ œ์‹œ ArrayList๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.
    • ์ˆœ์ฐจ์ ์œผ๋กœ ์‚ญ์ œํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์—ญ์ˆœ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๊ณ , ArrayList๋Š” ๋‹จ์ง€ ๋งˆ์ง€๋ง‰ ์š”์†Œ์˜ ๊ฐ’์„ null๋กœ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.
  • ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€/์‚ญ์ œ์‹œ LinkList๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.
    • LinkedList๋Š” ๊ฐ ์š”์†Œ๊ฐ„์˜ ์—ฐ๊ฒฐ๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ
    • ๋ฐ˜๋ฉด ArrayList๋Š” ๊ฐ ์š”์†Œ๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ฑฐ๋‚˜ ๋นˆ๊ณต๊ฐ„์„ ์ฑ„์›Œ์•ผ ํ•œ๋‹ค.

4. Stack๊ณผ Queue

Stack์€ ๋งˆ์ง€๋ง‰์— ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ๊บผ๋‚ด๊ฒŒ ๋˜๋Š” LIFO(Last In First Out)๊ตฌ์กฐ.
Queue๋Š” ์ฒ˜์Œ์— ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ๊บผ๋‚ด๊ฒŒ ๋˜๋Š” FIFO(First In First Out)๊ตฌ์กฐ.

4.1. Stack๊ณผ Queue ๊ตฌํ˜„

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

4.2. Stack ๋ฉ”์†Œ๋“œ

  • boolean empty() : Stack์ด ๋น„์–ด์žˆ๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค.
  • Object peek() : Stack์˜ ๋งจ ์œ„์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜. pop()๊ณผ ๋‹ฌ๋ฆฌ Stack์—์„œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์ง€๋Š” ์•Š์Œ
  • Object pop() : Stack์˜ ๋งจ ์œ„์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ธ๋‹ค.
  • Object push(Object item) : Stack์— ๊ฐ์ฒด(item)๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • int search(Object o) : Stack์—์„œ ์ฃผ์–ด์ง„ ๊ฐ์ฒด(o)๋ฅผ ์ฐพ์•„์„œ ๊ทธ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜. ๋ชป์ฐพ์œผ๋ฉด -1 ๋ฐ˜ํ™˜. (๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์œ„์น˜๋Š” 0์ด ์•„๋‹Œ 1๋ถ€ํ„ฐ ์‹œ์ž‘)

4.3. Queue ๋ฉ”์†Œ๋“œ

  • boolean add(Object o) : ์ง€์ •๋œ ๊ฐ์ฒด๋ฅผ Queue์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด true ๋ฐ˜ํ™˜. ์ €์žฅ๊ณต๊ฐ„ ๋ถ€์กฑํ•˜๋ฉด IlligalStateException ๋ฐœ์ƒ
  • boolean offer(Object o) : Queue์— ๊ฐ์ฒด๋ฅผ ์ €์žฅ. ์„ฑ๊ณตํ•˜๋ฉดtrue์‹คํŒจํ•˜๋ฉดfalse` ๋ฐ˜ํ™˜
  • Object remove() : Queue์—์„œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด ๋ฐ˜ํ™˜. ๋น„์–ด์žˆ์œผ๋ฉด NoSuchElementException ๋ฐœ์ƒ
  • Object poll() : Queue์—์„œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์„œ ๋ฐ˜ํ™˜. ๋น„์–ด์žˆ์œผ๋ฉด null ๋ฐ˜ํ™˜
  • Object element() : ์‚ญ์ œ์—†์ด ์š”์†Œ๋ฅผ ์ฝ์–ด์˜จ๋‹ค. peek()๊ณผ ๋‹ฌ๋ฆฌ Queue๊ฐ€ ๋น„์—ˆ์„ ๋•Œ NoSuchElementException ๋ฐœ์ƒ
  • Object peek() : ์‚ญ์ œ์—†์ด ์š”์†Œ๋ฅผ ์ฝ์–ด ์˜จ๋‹ค. Queue๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด null ๋ฐ˜ํ™˜

Java์—์„œ๋Š” ์Šคํƒ์„ Stack ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์ œ๊ณตํ•˜๊ณ  ์žˆ์ง€๋งŒ
ํ๋Š” Queue ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•ด๋†“๊ณ  ํด๋ž˜์Šค๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋Œ€์‹  Queue ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

4.4. Stack ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ

import java.util.*;

class MyStack extends Vector  {
  public Object push(Object item) {
    addElement(item);
    return item;
  }
  
  public Object pop() {
    Object obj = peek();  //  Stack์— ์ €์žฅ๋œ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
    removeElementAt(size()-1); // ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ 1์„ ๋นผ์ค€๋‹ค.
    return obj;
  }
  
  public Object peek() {
    int len = size();
    if (len == 0)
      throw new EmptyStackException();
    return elementAt(len -1);
  }
  
  public boolean empty()  {
    return size() == 0;
  }
  
  public int search(Object 0)  {
    int i = lastIndexOf(o);   // ๋์—์„œ๋ถ€ํ„ฐ ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š”๋‹ค.
    if (i >= 0)  {
      return size() - i;
    }
    return -1;  // ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด -1 ๋ฐ˜ํ™˜
  }
}

4.5. Deque(Double-Ended Queue)

Deque๋Š” ์–‘์ชฝ ๋์— ์ถ”๊ฐ€/์‚ญ์ œ ๊ฐ€๋Šฅ
Deque๋Š” ์Šคํƒ๊ณผ ํ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋†“์€ ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฉฐ ์Šคํƒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„, ํ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Deque Queue Stack
offerLast() offer() push()
pollLast() pop()
pollFirst() poll()
peekFirst() peek()
peekLast() peek()

5. Iterator

์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›์—์„œ๋Š” ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ ์ฝ์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ํ‘œ์ค€ํ™”ํ•˜์˜€๋‹ค.
์ปฌ๋ ‰์…˜์— ์ €์žฅ๋œ ๊ฐ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” Iterator์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ ,
Collection ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” Iterator(Iterator๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” iterator()๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

public interface Iterator {
  boolean hasnext();
  Object next();
  void remove();
}

public interface Collection {
  ...
  public Iterator iterator();
  ...
}
  • ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์— ๋Œ€ํ•ด iterator()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Iterator๋ฅผ ์–ป์€ ๋‹ค์Œ ๋ฐ˜๋ณต๋ฌธ(์ฃผ๋กœ while๋ฌธ)์„ ์‚ฌ์šฉํ•ด์„œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์˜ ์š”์†Œ๋“ค์„ ์ฝ์–ด ์˜จ๋‹ค.

    • boolean hasNext() - ์ฝ์–ด์˜ฌ ์š”์†Œ๊ฐ€ ๋‚จ์•„์žˆ๋Š”์ง€ ํ™•์ธ. ์žˆ์œผ๋ฉด true ์—†์œผ๋ฉด false
    • Object next() - ๋‹ค์Œ ์š”์†Œ๋ฅผ ์ฝ์–ด ์˜จ๋‹ค. next()๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— hasNext()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ฝ์–ด ์˜ฌ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „.
    • void remove() - next()๋กœ ์ฝ์–ด ์˜จ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. next()๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ์— remove()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋Š” Key์™€ Value๋ฅผ ์Œ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— iterator()๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  keySet()์ด๋‚˜ entrySet()์„ ํ†ตํ•ด Key์™€ Value๋ฅผ ๊ฐ๊ฐ ๋”ฐ๋กœ Set์˜ ํ˜•ํƒœ๋กœ ์–ป์–ด ์˜จ ํ›„์— ๋‹ค์‹œ iterator()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ Iterator๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

    Map map = new HashMap();
    ...
    Iterator it = map.keySet().iterator();
  • Listํด๋ž˜์Šค๋“ค์€ ์ €์žฅ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Iterator๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ์–ด ์˜จ ๊ฒฐ๊ณผ ์—ญ์‹œ ์ €์žฅ ์ˆœ์„œ์™€ ๋™์ผํ•˜์ง€๋งŒ Setํด๋ž˜์Šค๋“ค์€ ๊ฐ ์š”์†Œ๊ฐ„์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Iterator๋ฅผ ์ด์šฉํ•ด์„œ ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ ์ฝ์–ด ์™€๋„ ์ฒ˜์Œ์— ์ €์žฅ๋œ ์ˆœ์„œ์™€ ๊ฐ™์ง€ ์•Š๋‹ค.

5.1. ListIterator

ListIterator๋Š” Iterator๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์œผ๋กœ, ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ Iterator๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ListIterator๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ์˜ ์ด๋™์ด ๊ฐ€๋Šฅ. ๋‹จ, List์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • void add(Object o) - ์ปฌ๋ ‰์…˜์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด(o)๋ฅผ ์ถ”๊ฐ€
  • hasPrevious() - ์ฝ์–ด ์˜ฌ ์ด์ „ ์š”์†Œ๊ฐ€ ๋‚จ์•„์žˆ๋Š”์ง€ ํ™•์ธ. ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false
  • Object previous() - ์ด์ „ ์š”์†Œ๋ฅผ ์ฝ์–ด ์˜จ๋‹ค. previous()๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— hasPrevious()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ฝ์–ด ์˜ฌ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „.
  • int nextIndex() - ๋‹ค์Œ ์š”์†Œ์˜ index๋ฅผ ๋ฐ˜ํ™˜
  • int previousIndex() - ์ด์ „ ์š”์†Œ์˜ index๋ฅผ ๋ฐ˜ํ™˜
  • void set(Object o) - next() ๋˜๋Š” previous()๋กœ ์ฝ์–ด ์˜จ ์š”์†Œ๋ฅผ ์ง€์ •๋œ ๊ฐ์ฒด(o)๋กœ ๋ณ€๊ฒฝ. ๋ฐ˜๋“œ์‹œ next()๋‚˜ previous()๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•œ ๋‹ค์Œ์— ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.

6. Arrays

Arrays ํด๋ž˜์Šค์—๋Š” ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ๋Š”๋ฐ ์œ ์šฉํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
Arrays์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋‘ static ๋ฉ”์†Œ๋“œ๋‹ค.

6.1. ๋ฐฐ์—ด ๋ณต์‚ฌ - copyOf(), copyOfRange()

copyOf()๋Š” ๋ฐฐ์—ด ์ „์ฒด ๋ณต์‚ฌ, copyOfRange()๋Š” ๋ฐฐ์—ด์˜ ์ผ๋ถ€๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜.
copyOfRange()์— ์ง€์ •๋œ ๋ฒ”์œ„์˜ ๋์€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

int[] arr = {0,1,2,3,4,};
int[] arr2 = Arrays.copyOf(arr, 3); // arr2 = [0,1,2]
int[] arr3 = Arrays.copyOfRange(arr, 2, 4); // arr3 = [2,3]

6.2. ๋ฐฐ์—ด ์ฑ„์šฐ๊ธฐ - fill(), setAll()

fill()์€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ง€์ •๋œ ๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค.
setAll()์€ ๋ฐฐ์—ด์„ ์ฑ„์šฐ๋Š”๋ฐ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.

int[] arr = new int[5];
Arrays.fill(arr, 9);  // arr = [9,9,9,9,9]
Arrays.setAll(arr, () -> (int)(Math.random()*5)+1); // arr = [1,5,2,1,1]

6.3. ๋ฐฐ์—ด ์ •๋ ฌ, ๊ฒ€์ƒ‰ - sort(), binarySearch()

sort()๋Š” ๋ฐฐ์—ด ์ •๋ ฌ, binarySearch()๋Š” ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์š”์†Œ๋ฅผ ๊ฒ€์ƒ‰
binarySearch()๋Š” ๋ฐฐ์—ด์—์„œ ์ง€์ •๋œ ๊ฐ’์ด ์ €์žฅ๋œ ์œ„์น˜(index)๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜. ๋ฐ˜๋“œ์‹œ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋œ ์ƒํƒœ์—ฌ์•ผ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.

int[] arr = { 3, 2, 0, 1, 4,};
Arrays.sort(arr); // arr = [0,1,2,3,4]
int idx = Arrays.binarySearch(arr, 2); // idx = 2

6.4. ๋ฌธ์ž์—ด์˜ ๋น„๊ต, ์ถœ๋ ฅ - equals(), toString()

equals(), toString()์€ ์ผ์ฐจ์› ๋ฐฐ์—ด์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
๋‹ค์ฐจ์› ๋ฐฐ์—ด์—๋Š” deepEquals(), deepToString() ์‚ฌ์šฉ.
deepToString()์€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ ‘๊ทผํ•ด์„œ ๋ฌธ์ž์—ด์„ ๊ตฌ์„ฑํ•˜๋ฏ€๋กœ 3์ฐจ์› ์ด์ƒ์˜ ๋ฐฐ์—ด์—๋„ ๋™์ž‘

  • ๋‹ค์ฐจ์› ๋ฐฐ์—ด์€ ‘๋ฐฐ์—ด์˜ ๋ฐฐ์—ด’์˜ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— equals()๋กœ ๋น„๊ตํ•˜๋ฉด, ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ‘๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋ฐฐ์—ด์˜ ์ฃผ์†Œ’๋ฅผ ๋น„๊ตํ•˜๊ฒŒ ๋œ๋‹ค.

6.5. ๋ฐฐ์—ด์„ List๋กœ ๋ฐ˜ํ™˜ - asList(Object…a)

asList()๋Š” ๋ฐฐ์—ด์„ List์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜.

  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๊ฐ€๋ณ€์ธ์ˆ˜๋ผ์„œ ๋ฐฐ์—ด ์ƒ์„ฑ ์—†์ด ์ €์žฅํ•  ์š”์†Œ๋“ค๋งŒ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ
  • asList()๊ฐ€ ๋ฐ˜ํ™˜ํ•œ List์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ํฌ๊ธฐ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ List๋Š” List list = new ArrayList(Arrays.asList(1,2,3,4,5));

7. Comparator์™€ Comparable

Arrays.sort()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•Œ์•„์„œ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ,
์‚ฌ์‹ค์€ Chractorํด๋ž˜์Šค์˜ Comparable์˜ ๊ตฌํ˜„์— ์˜ํ•ด ์ •๋ ฌ๋˜์—ˆ๋˜ ๊ฒƒ.
Comparble์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ.

public interface Comparator {
  int compare(Object o1, Object o2);
  boolean equals(Object obj);
}

public interface Comparable {
  public int compareTo(Object o);
}

Comparable์€ java.lang ํŒจํ‚ค์ง€์— ์žˆ๊ณ , Comparator๋Š” java.util ํŒจํ‚ค์ง€์— ์žˆ๋‹ค.

  • Comparable : ๊ธฐ๋ณธ ์ •๋ ฌ๊ธฐ์ค€์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ.
  • Comparator : ๊ธฐ๋ณธ ์ •๋ ฌ๊ธฐ์ค€ ์™ธ์— ๋‹ค๋ฅธ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ ์žํ•  ๋•Œ ์‚ฌ์šฉ

8. HashSet

HashSet์€ Set์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ปฌ๋ ‰์…˜.
HashSet์€ ์ €์žฅ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ €์žฅ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด LinkedHashSet ์‚ฌ์šฉ.

  • ๋กœ๋˜๋ฒˆํ˜ธ ์˜ˆ์ œ
import java.util.*;

class HashSetLotto  {
    public static void main(String[] args)  {
        
        Set set = new HashSet();
        
        for (int i = 0; set.size() < 6; i++)  {
            int num = (int)(Math.random()*45) + 1;
            set.add(new Integer(num));
        }
        
        List list = new LinkedList(set);
        Collections.sort(list);
        System.out.println(list);
    }
}

๋ฒˆํ˜ธ๋ฅผ ํฌ๊ธฐ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด Collectionsํด๋ž˜์Šค์˜ sort(List list)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
์ด ๋ฉ”์„œ๋“œ๋Š” ์ธ์ž๋กœ List์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์„ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
LinkedListํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž LinkedList(Collection c)๋ฅผ ์ด์šฉํ•ด์„œ HashSet์— ์ €์žฅ๋œ ๊ฐ์ฒด๋“ค์„ LinkedList์— ๋‹ด์•„์„œ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

9. TreeSet

TreeSet์€ ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ(binary search tree) ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋‹ค.
TreeSet์€ ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ Red-Black tree๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ •๋ ฌ๋œ ์œ„์น˜์— ์ €์žฅํ•˜๋ฏ€๋กœ ์ €์žฅ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค.
TreeSet์€ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ ๊ฐ’ ๊ฒ€์ƒ‰๊ณผ ๋ฒ”์œ„๊ฒ€์ƒ‰, ์˜ˆ๋ฅผ ๋“ค๋ฉด 3๊ณผ 7์‚ฌ์ด์˜ ๋ฒ”์œ„์— ์žˆ๋Š” ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋น ๋ฅด๋‹ค.

  • Binary Search Tree

    • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ์˜ ๊ฐ’์€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ์˜ ๊ฐ’์€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค.
    • ๋…ธ๋“œ์˜ ์ถ”๊ฐ€ ์‚ญ์ œ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.(์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ)
    • ๊ฒ€์ƒ‰(๋ฒ”์œ„๊ฒ€์ƒ‰)๊ณผ ์ •๋ ฌ์— ์œ ๋ฆฌํ•˜๋‹ค.
    • ์ค‘๋ณต๋œ ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • TreeSet์œผ๋กœ ๋งŒ๋“  ๋กœ๋˜๋ฒˆํ˜ธ ์ƒ์„ฑ ํ”„๋กœ๊ทธ๋žจ (HashSet์œผ๋กœ ๋งŒ๋“  ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ์ •๋ ฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ•„์š”์—†๋‹ค. TreeSet์€ ์ €์žฅํ•  ๋•Œ ์ด๋ฏธ ์ •๋ ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—.)

  import java.util.*;
  
  class TreeSetLotto  {
    public static void main(String[]args) {
      Set set = new TreeSet();
      
      for (int i =0; set.size() < 6; i++) {
        int num = (int)(Math.random()*45) + 1;
        set.add(num); // set.add(new Integer(num));
      }
      
      System.out.println(set);
    }
  }
  • headSet()๊ณผ tailSet()์„ ์‚ฌ์šฉํ•˜๋ฉด, TreeSet์— ์ €์žฅ๋œ ๊ฐ์ฒด ์ค‘ ์ง€์ •๋œ ๊ธฐ์ค€ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์˜ ๊ฐ์ฒด๋“ค๊ณผ ์ž‘์€ ๊ฐ’์˜ ๊ฐ์ฒด๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  import java.util.*;
  
  class TreeSetEx2  {
    public static void main(String[] args)  {
      TreeSet set = new TreeSet();
      int[] score = {80, 95, 50, 35, 45, 65, 10, 100};

      for (int i=0; i < score.length; i++)
        set.add(new Integer(score[i]));

      System.out.println("50๋ณด๋‹ค ์ž‘์€ ๊ฐ’ :" + set.headSet(new Integer(50)));
      System.out.println("50๋ณด๋‹ค ํฐ ๊ฐ’ :" + set.tailSet(new Integer(50)));
    }
  }

10. HashMap

Hashtable๊ณผ HashMap์˜ ๊ด€๊ณ„๋Š” Vector์™€ ArrayList์˜ ๊ด€๊ณ„์™€ ๊ฐ™์•„์„œ Hashtable๋ณด๋‹ค๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์ธ HashMap์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒํ•œ๋‹ค.
HashMap์€ Map์„ ๊ตฌํ˜„ํ–ˆ์œผ๋ฏ€๋กœ ํ‚ค์™€ ๊ฐ’์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  hashing์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.

public class HashMap extends AbstractMap 
                    implements Map, Cloneable, Serializable  {
  
  transient Entry[] table;
    ...
  
  static class Entry implements Map.Entry {
    final Object key;
    Object value;
      ...
  }
}

HashMap์€ Entry๋ผ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๋‹ค์‹œ Entryํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค.
ํ‚ค์™€ ๊ฐ’์€ ๋ณ„๊ฐœ์˜ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์„œ๋กœ ๊ด€๋ จ๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—
๊ฐ๊ฐ์˜ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์„œ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ(integrity)์ ์ธ ์ธก๋ฉด์—์„œ ๋” ๋ฐ”๋žŒ์งํ•˜๊ธฐ ๋•Œ๋ฌธ.

  • HashMap์€ ํ‚ค์™€ ๊ฐ’์„ ๊ฐ๊ฐ Object ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
  • (Object, Object)์˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ๊ฐ์ฒด๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ key๋Š” ์ฃผ๋กœ String์„ ๋Œ€๋ฌธ์ž ๋˜๋Š” ์†Œ๋ฌธ์ž๋กœ ํ†ต์ผํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

11. ํ•ด์‹ฑ๊ณผ ํ•ด์‹œํ•จ์ˆ˜

ํ•ด์‹ฑ์ด๋ž€ ํ•ด์‹œํ•จ์ˆ˜(hash function)๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œํ…Œ์ด๋ธ”(hash table)์— ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•
ํ•ด์‹œํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๊ณณ์„ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ๋„ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

  • ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜ - HashSet, HashMap, Hashtable
  • Hashtable์€ Collection Framework๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ HashMap์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์œผ๋‚˜ ์ด์ „์†Œ์Šค์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ๋‚จ๊ฒจ๋‘๊ณ  ์žˆ๋‹ค.

11.1. hashCode()

  • HashMap๊ณผ ๊ฐ™์ด ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์—์„œ๋Š” Objectํด๋ž˜์Šค์— ์ •์˜๋œ hashCode()๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • Objectํด๋ž˜์Šค์— ์ •์˜๋œ hashCode()๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•ด hashCode()๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์„œ๋กœ ์œ ์ผํ•œ ํ›Œ๋ฅญํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • Stringํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ Object๋กœ ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋กœ ๋‹ค๋ฅธ String์ธ์Šคํ„ด์Šค์ผ์ง€๋ผ๋„ ๊ฐ™์€ ๋‚ด์šฉ์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€์กŒ๋‹ค๋ฉด hashCode()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์–ป๋Š”๋‹ค.

12. TreeMap

TreeMap์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ๊ฒ€์ƒ‰๊ณผ ์ •๋ ฌ์— ์ ํ•ฉํ•œ ํด๋ž˜์Šค์ด๋‹ค.
๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—์„œ HashMap์ด TreeMap๋ณด๋‹ค ๋” ๋›ฐ์–ด๋‚˜๋‹ค.
๋‹ค๋งŒ ๋ฒ”์œ„๊ฒ€์ƒ‰์ด๋‚˜ ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ TreeMap์ด ๋‚ซ๋‹ค.

13. Properties

Properties๋Š” HashMap์˜ ๊ตฌ๋ฒ„์ „์ธ Hashtable์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.
Hashtable์€ ํ‚ค์™€ ๊ฐ’์„ (Object, Object)์˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋Š”๋ฐ ๋น„ํ•ด
Properties๋Š” (String, String)์˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋Š” ๋ณด๋‹ค ๋‹จ์ˆœํ™”๋œ ์ปฌ๋ ‰์…˜ํด๋ž˜์Šค์ด๋‹ค.

  • ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™˜๊ฒฝ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ์†์„ฑ(property)์„ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ฝ๊ณ  ์“ฐ๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • Properties๋Š” ์ปฌ๋ ‰์…˜ํ”„๋ ˆ์ž„์› ์ด์ „์˜ ๊ตฌ๋ฒ„์ „์ด๋ฏ€๋กœ Iterator๊ฐ€ ์•„๋‹Œ Enumeration์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • list๋ฉ”์†Œ๋“œ๋กœ Properties์— ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด ๋˜๋Š” ํŒŒ์ผ์— ํŽธํ•˜๊ฒŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  void list(PrintStream out)
  void list(PrintWriter out)

14. Collections

Arrays๊ฐ€ ๋ฐฐ์—ด๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Collections๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
fill(), copy(), sort(), binarySearch() ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

14.1. ์ปฌ๋ ‰์…˜์˜ ๋™๊ธฐํ™”

  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ(multi-thread) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ(consistency)์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณต์œ ๋˜๋Š” ๊ฐ์ฒด์— ๋™๊ธฐํ™”(synchronization)๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ArrayList์™€ HashMap๊ณผ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์€ ๋™๊ธฐํ™”๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ java.util.Collections ํด๋ž˜์Šค์˜ ๋™๊ธฐํ™” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋™๊ธฐํ™”์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

15. ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค ์š”์•ฝ

  • ArrayList : ๋ฐฐ์—ด๊ธฐ๋ฐ˜. ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ์— ๋ถˆ๋ฆฌ. ์ˆœ์ฐจ์ ์ธ ์ถ”๊ฐ€์‚ญ์ œ๋Š” ์ œ์ผ ๋น ๋ฆ„. ์ž„์˜์˜ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์ด ๋›ฐ์–ด๋‚จ.
  • LinkedList : ์—ฐ๊ฒฐ๊ธฐ๋ฐ˜. ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ์— ์œ ๋ฆฌ. ์ž„์˜์˜ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค.
  • HashMap : ๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ์ด ๊ฒฐํ•ฉ๋œ ์ƒํƒœ. ์ถ”๊ฐ€,์‚ญ์ œ,๊ฒ€์ƒ‰,์ ‘๊ทผ์„ฑ์ด ๋ชจ๋‘ ๋›ฐ์–ด๋‚จ. ๊ฒ€์ƒ‰์—๋Š” ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ.
  • TreeMap : ์—ฐ๊ฒฐ๊ธฐ๋ฐ˜. ์ •๋ ฌ๊ณผ ๊ฒ€์ƒ‰(ํŠนํžˆ ๋ฒ”์œ„๊ฒ€์ƒ‰)์— ์ ํ•ฉ. ๊ฒ€์ƒ‰์„ฑ๋Šฅ์€ HashMap๋ณด๋‹ค ๋–จ์–ด์ง.
  • Stack : Vector๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„
  • Queue : LinkedList๊ฐ€ Queue์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
  • Properties : Hashtable์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„
  • HashSet : HashMap์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„
  • TreeSet : TreeMap์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„
  • LinkedHashMap : HashMap๊ณผ HashSet์— ์ €์žฅ์ˆœ์„œ์œ ์ง€๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • LinkedHashSet : HashMap๊ณผ HashSet์— ์ €์žฅ์ˆœ์„œ์œ ์ง€๊ธฐ๋Šฅ ์ถ”๊ฐ€