---
# System prepended metadata

title: Java 기본 컬렉션 프레임워크
tags: [과외(하희영)]

---

# Java 기본 컬렉션 프레임워크
![](https://i.imgur.com/26IEkQ1.png)
- 다수의 데이터를 쉽고 효율적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 집합

## List 컬렉션 클래스

- List 인터페이스를 구현한 List 컬렉션 클래스의 특징
    1. 요소의 저장 순서 유지
    2. 같은 요소의 중복 저장 허용

- `ArrayList<E>`
- `LinkedList<E>`
- `Vector<E>`
    - Vector는 기존 코드와의 호환성을 위해 남아있고, 가급적 ArrayList 클래스를 사용하는 것이 좋다.

> List 메서드
>
> |메서드|설명|
> |---|---|
> |`boolean add(E e)`|해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능)|
> |`void add(int index, E e)`|해당 리스트의 특정 위치에 전달된 요소를 추가함. (선택적 기능)|
> |`void clear()`|해당 리스트의 모든 요소를 제거함. (선택적 기능)|
> |`boolean contains(Object o)`|해당 리스트가 전달된 객체를 포함하고 있는지를 확인함.|
> |`boolean equals(Object o)`|해당 리스트와 전달된 객체가 같은지를 확인함.|
> |`E get(int index)`|해당 리스트의 특정 위치에 존재하는 요소를 반환함.|
> |`boolean isEmpty()`|해당 리스트가 비어있는지를 확인함.|
> |`Iterator<E> iterator()`|해당 리스트의 반복자(iterator)를 반환함.|
> |`boolean remove(Object o)`|해당 리스트에서 전달된 객체를 제거함. (선택적 기능)|
> |`boolean remove(int index)`|해당 리스트의 특정 위치에 존재하는 요소를 제거함. (선택적 기능)|
> |`E set(int index, E e)`|해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체함. (선택적 기능)|
> |`int size()`|해당 리스트의 요소의 총 개수를 반환함.|
> |`Object[] toArray()`|해당 리스트의 모든 요소를 Object 타입의 배열로 반환함.|

**예시**
```java=
public static void main(String[] args) {
    // 리스트 생성
    ArrayList<String> arrList = new ArrayList<>();

    // 리스트에 요소의 저장
    arrList.add("넷");
    arrList.add("둘");
    arrList.add("셋");
    arrList.add("하나");

    // 리스트 요소의 출력
    for (int i = 0; i < arrList.size(); i++) {
        System.out.println(arrList.get(i));
    }
}
```

> **Vecotr / ArrayList 차이점**
> 1. 동기화
> - Vector 는 한번에 하나의 스레드만 접근 가능하다.
> - ArrayList는 동시에 여러 스레드가 작업할 수 있다.
>   - 여러 스레드가 동시에 접근하드 경우 개발자가 명시적으로 동기화하는 코드를 추가해야 한다.
> 2. 스레드 안전
> - Vector 는 동기화 되어있기 때문에 한번에 하나의 스레드만 접근할 수 있으므로 Thread Safe 하다.
> - ArrayList는 동기화 되지 않았기 때문에 명시적으로 동기화 할 필요가 있다.
> 3. 성능
> - ArrayList는 동기화 되지 않았기 때문에 Vector보다 빠르다.
> 4. 크기 증가
> - Vector는 현재 배열의 크기의 100%가 증가
> - ArrayList는 현재 배열의 크기의 50% 증가

# Stack & Queue

## Stack

- Vector 클래스를 상속받아, 전형적인 스택 메모리 구조의 클래스를 제공한다

> Stack 메서드
>
> |메서드|설명|
> |---|---|
> |`boolean empty()`|해당 스택이 비어 있으면 true를, 비어 있지 않으면 false를 반환함.|
> |`E peek()`|해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환함.|
> |`E pop()`|해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환하고, 해당 요소를 스택에서 제거함.|
> |`E push(E item)`|해당 스택의 제일 상단에 전달된 요소를 삽입함.|
> |`int search(Object o)`|해당 스택에서 전달된 객체가 존재하는 위치의 인덱스를 반환함.|

**예시**

```java=
public static void main(String[] args) {
    Stack<Integer> st = new Stack<>(); // 스택의 생성

    // push() 메소드를 이용한 요소의 저장
    st.push(4);
    st.push(2);
    st.push(3);
    st.push(1);

    // peek() 메소드를 이용한 요소의 반환
    System.out.println(st.peek());
    System.out.println(st);

    // pop() 메소드를 이용한 요소의 반환 및 제거
    System.out.println(st.pop());
    System.out.println(st);

    // search() 메소드를 이용한 요소의 위치 검색
    System.out.println(st.search(4));
    System.out.println(st.search(3));
}
```

## Queue

- Vector 와 달리 인터페이스 형태로 제공된다

1. `Deque<E>`
2. `BlockingDeque<E>`
3. `BlockingQueue<E>`
4. `TransferQueue<E>`

> Queue 메서드
>
> |메서드|설명|
> |---|---|
> |`boolean add(E e)`|해당 큐의 맨 뒤에 전달된 요소를 삽입함.|
> |`E element()`|만약 삽입에 성공하면 true를 반환하고, 큐에 여유 공간이 없어 삽입에 실패하면 IllegalStateException을 발생시킴.|
> |`boolean offer(E e)`|해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.|
> |`E peek()`|해당 큐의 맨 뒤에 전달된 요소를 삽입함.|
> |`E poll()`|해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.|
> |`E remove()`|만약 큐가 비어있으면 null을 반환함.|

**예시**

```java=
public static void main(String[] args) {
    LinkedList<String> qu = new LinkedList<String>(); // 큐의 생성
    
    // add() 메소드를 이용한 요소의 저장
    qu.add("넷");
    qu.add("둘");
    qu.add("셋");
    qu.add("하나");
    
    // peek() 메소드를 이용한 요소의 반환
    System.out.println(qu.peek());
    System.out.println(qu);
    
    // poll() 메소드를 이용한 요소의 반환 및 제거
    System.out.println(qu.poll());
    System.out.println(qu);
    
    // remove() 메소드를 이용한 요소의 제거
    qu.remove("하나");
    System.out.println(qu);
}
```

# Set

- Set 컬렉션의 특징
    - 요소의 저장 순서를 유지하지 않는다
    - 같은 요소의 중복 저장을 허용하지 않는다
- 대표적인 Set 컬렉션 클래스
    - `HashSet<E>`
    - `TreeSet<E>`

> Set 메서드
> 
> |메서드|설명|
> |---|---|
> |`boolean add(E e)`|해당 집합(set)에 전달된 요소를 추가함. (선택적 기능)|
> |`void clear()`|해당 집합의 모든 요소를 제거함. (선택적 기능)|
> |`boolean contains(Object o)`|해당 집합이 전달된 객체를 포함하고 있는지를 확인함.|
> |`boolean equals(Object o)`|해당 집합과 전달된 객체가 같은지를 확인함.|
> |`boolean isEmpty()`|해당 집합이 비어있는지를 확인함.|
> |`Iterator<E> iterator()`|해당 집합의 반복자(iterator)를 반환함.|
> |`boolean remove(Object o)`|해당 집합에서 전달된 객체를 제거함. (선택적 기능)|
> |`int size()`|해당 집합의 요소의 총 개수를 반환함.|
> |`Object[] toArray()`|해당 집합의 모든 요소를 Object 타입의 배열로 반환함.|


## `HashSet<E>`

- 해시 알고리즘을 사용하며 검색속도가 빠르다
- HashSet 클래스는 내부적으로 HashMap 인스턴스를 이용하여 요소를 저장한다.

> 해시 함수
> ![](http://www.tcpschool.com/lectures/img_java_hash_algorithm.png)

## `TreeSet<E>`

- 데이터가 정렬된 상태로 저장되는 이진 검색 트리(binary search tree)의 형태로 요소를 저장한다
- 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다

**예시**

```java=
public static void main(String[] args) {
    HashSet<String> hashSet = new HashSet<>();

    // add() 메소드를 이용한 요소의 저장
    hashSet.add("영희");
    hashSet.add("철수");

    System.out.println(hashSet);

    // contians() 메서드를 이용한 요소 확인
    System.out.println(hashSet.contains("영희"));
    System.out.println(hashSet.contains("민수"));
}
```


# Map

- 키와 값을 하나의 쌍으로 저장하는 컬렉션
    - 여기서  키(key)란 실질적인 값(value)을 찾기 위한 이름의 역할을 한다

- Map 특징
    - 요소의 저장 순서를 유지하지 않는다.
    - 키는 중복을 허용하지 않지만, 값의 중복은 허용한다. 

- 대표적인 Map 컬렉션 클래스
    - `HashMap<K, V>`
    - `TreeMap<K, V>`


## `HashMap<K, V>`

- 해시 알고리즘을 사용하는 Map

> HashMap 메서드
>
> |메서드|설명|
> |---|---|
> |`void clear()`|해당 맵(map)의 모든 매핑(mapping)을 제거함.|
> |`boolean containsKey(Object key)`|해당 맵이 전달된 키를 포함하고 있는지를 확인함.|
> |`boolean containsValue(Object value)`|해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.|
> |`V get(Object key)`|해당 맵에서 전달된 키에 대응하는 값을 반환함.|
> |`boolean isEmpty()`|만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함.|
> |`Set<K> keySet()`|해당 맵이 비어있는지를 확인함.|
> |`V put(K key, V value)`|해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.|
> |`V remove(Object key)`|해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.|
> |`boolean remove(Object key, Object value)`|해당 맵에서 전달된 키에 대응하는 매핑을 제거함.|
> |`V replace(K key, V value)`|해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.|
> |`boolean replace(K key, V oldValue, V newValue)`|해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함.|
> |`int size()`|해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함.|

## `TreeMap<K, V>`

- 이진 검색 트리를 사용하는 Map

> TreeMap 메서드
>
> |메서드|설명|
> |---|---|
> |`Map.Entry<K, V> ceilingEntry(K key)`|해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.|
> |`K ceilingKey(K key)`|해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함.|
> |`void clear()`|만약 해당하는 키가 없으면 null을 반환함."|
> |`boolean containsKey(Object key)`|해당 맵(map)의 모든 매핑(mapping)을 제거함.|
> |`boolean containsValue(Object value)`|해당 맵이 전달된 키를 포함하고 있는지를 확인함.|
> |`NavigableMap<K, V> descendingMap()`|해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.|
> |`Set<Map.Entry<K, V>> entrySet()`|해당 맵에 포함된 모든 매핑을 역순으로 반환함.|
> |`Map.Entry<K, V> firstEntry()`|해당 맵에 포함된 모든 매핑을 Set 객체로 반환함.|
> |`K firstKey()`|해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환함.|
> |`Map.Entry<K, V> floorEntry(K key)`|해당 맵에서 현재 가장 작은(첫 번째) 키를 반환함.|
> |`K floorKey(K key)`|해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.|
> |`V get(Object key)`|해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함.|
> |`SortedMap<K, V> headMap(K toKey)`|만약 해당하는 키가 없으면 null을 반환함.|
> |`Map.Entry<K, V> higherEntry(K key)`|해당 맵에서 전달된 키에 대응하는 값을 반환함.|
> |`K higherKey(K key)`|만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함.|
> |`Set<K> keySet()`|해당 맵에서 전달된 키보다 작은 키로 구성된 부분만을 반환함.|
> |`Map.Entry<K, V> lastEntry()`|해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.|
> |`K lastKey()`|해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함.|
> |`Map.Entry<K, V> lowerEntry(K key)`|만약 해당하는 키가 없으면 null을 반환함.|
> |`K lowerKey(K key)`|해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.|
> |`Map.Entry<K, V> pollFirstEntry()`|해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환함.|
> |`Map.Entry<K, V> pollLastEntry()`|해당 맵에서 현재 가장 큰(마지막) 키를 반환함.|
> |`V put(K key, V value)`|해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.|
> |`V remove(Object key)`|해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함.|
> |`boolean remove(K key, V value)`|만약 해당하는 키가 없으면 null을 반환함.|
> |`V replace(K key, V value)`|해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함.|
> |`boolean replace(K key, V oldValue, V newValue)`|해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함.|
> |`int size()`|해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.|
> |`SortedMap<K, V> subMap(K fromKey, K toKey)`|해당 맵에서 전달된 키에 대응하는 매핑을 제거함.|
> |`SortedMap<K, V> tailMap(K fromKey)`|해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.|

**예시**

```java=
public static void main(String[] args) {
    HashMap<String, Integer> hm = new HashMap<>();

    // put() 메소드를 이용한 요소의 저장
    hm.put("삼십", 30);
    hm.put("십", 10);
    hm.put("사십", 40);
    hm.put("이십", 20);

    // Enhanced for 문과 get() 메소드를 이용한 요소의 출력
    System.out.println("맵에 저장된 키들의 집합 : " + hm.keySet());
    for (String key : hm.keySet()) {
        System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
    }

    // remove() 메소드를 이용한 요소의 제거
    hm.remove("사십");

    // iterator() 메소드와 get() 메소드를 이용한 요소의 출력
    Iterator<String> keys = hm.keySet().iterator();
    while (keys.hasNext()) {
        String key = keys.next();
        System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
    }

    // replace() 메소드를 이용한 요소의 수정
    hm.replace("이십", 200);

    for (String key : hm.keySet()) {
        System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
    }

    // size() 메소드를 이용한 요소의 총 개수
    System.out.println("맵의 크기 : " + hm.size());
}
```

###### tags: `과외(하희영)`