# Java 기본 컬렉션 프레임워크

- 다수의 데이터를 쉽고 효율적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 집합
## 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 인스턴스를 이용하여 요소를 저장한다.
> 해시 함수
> 
## `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: `과외(하희영)`