# 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: `과외(하희영)`