컬렉션 프레임워크는 간단히 말해, 리스트, 스택, 큐, 트리 등의 자료구조
정렬, 탐색 등의 알고리즘을 구조화해 놓은 프레임워크이다.

여러 개의 데이터 묶음 자료를 효과적으로 처리하기 위해 구조화된 클래스 또는 인터페이스의 모음


1. List 인터페이스

리스트와 배열의 차이점

배열 : 저장공간의 크기가 고정적(固定的)
리스트 : 저장공간의 크기가 가변적(可變的)

🛠 List의 주요 메소드

a. add(E element) : 매개변수로 입력된 원소를 마지막에 추가
b. add(int index, E element) : index위치에 입력된 원소 추가
c. addAll(Collection<? Extends E> c) : 입력된 컬렉션 전체를 마지막에 추가
d. addAll(int index, Collection<? Extends E> c) : index위치에 컬렉션 전체를 추가
e. set(int index, E element) : index위치에 있는 원소값을 입력값으로 변경
f. remove(int index) : index위치의 원소값 삭제
g. remove(Object o) : 입력값과 동일한 객체 삭제
h. clear() : 전체 원소 삭제
i. get(int index) : index위치의 원소값을 꺼내 리턴
j. size() : 리스트 객체 내에 포함된 원소 개수
k. isEmpty() : 리스트의 원소가 하나도 없는지 여부를 리턴
l. toArray() : 리스트를 Object 배열로 변환

대표적인 클래스 3가지

  • 리스트는 인터페이스이기 때문에 객체를 스스로 생성하지 못함 (클래스 필요)
    a. ArrayList
    b. Vertor
    c. LinkedList

① ArrayList

특징

  • 원소를 인덱스로 관리
  • 저장 공간을 동적으로 관리

② Vector

특징

  • 기본적으로 ArrayList와 동일하다, 한가지 차이점은 주요 메소드가 동기화 메소드로 구현돼 있으므로 멀티 쓰레드에 적합하다.
    (동기화 메소드는 하나의 공유 객체를 2개의 쓰레드가 동시에 사용할 수 없도록 만든 메소드)

③ LinkedList

특징
ArrayList와 동일하나 몇 가지 차이점이 있다.

  • LinkedList는 저장용량을 매개변수로 갖는 생성자가 없어 객체를 생성할 때 용량을 지정할 수 없다.
 List<E> aLinkedList1 = new LinkedList<Integer>(); // O
 List<E> aLinkedList1 = new LinkedList<Integer>(20); // X
  • ArrayList는 모든 데이터를 인덱스와 값으로 저장되지만,
    LinkedList는 앞뒤 객체의 정보를 저장하여, 모든 데이터가 서로 연결된 형태이다.

자바완전정복.642p

ArrayList는 배열형태이기 때문에 데이터를 추가하거나 삭제할 때, 밀려나거나 당겨지는 모든 데이터의 위치정보를 수정해줘야한다. 반면, LinkedList는 원소의 앞뒤 객체 정보만 바꿔주면 되기 때문에 데이터를 추가하거나 삭제할 때 훨씬 효율적이다. 다만, 데이터를 검색하는 과정에서는 배열형태의 ArrayList가 훨씬 빠르다.

🔹 데이터 검색: ArrayList 사용
🔹 데이터 수정(추가/삭제) : LinkedList 사용


2. Set 인터페이스

Set 인터페이스 특징

Set는 기본적으로 데이터의 인덱스 정보를 갖고 있지 않다.
그래서 List인터페이스와 다르게 index가 포함된 메소드는 사용할 수 없다.
인덱스 정보가 없기 때문에 데이터를 중복해 저장하면 특정 데이터를 지칭해 꺼낼 방법이 없다.
그래서 Set는 중복 저장을 허용하지 않는다.
(옷 주머니와 비슷한 개념, 한 주머니에 여러 데이터를 모아둔 집합체)
중복값 처리가 필요할 때 사용하면 좋다.

🛠 Set의 주요 메소드

a. add(E element) : 매개변수로 입력된 원소를 리스트에 추가
b. addAll(Collection<? Extends E> c) : 입력된 컬렉션 전체를 추가
c. remove(Object o) : 매개변수와 동일한 객체 삭제
d. clear() : 전체 원소 삭제
e. isEmpty() : Set 객체가 비어있는지 여부를 리턴
f. contains(Object o) : 매개변수로 입력된 원소가 있는지 여부를 리턴
g. size() : 리스트 객체 내에 포함된 원소 개수
h. iterator() : Set객체 내의 데이터를 연속해 꺼내는 Iterator 객체 리턴
i. toArray() : 리스트를 Object 배열로 변환

Set은 인덱스 정보가 없으므로 List처럼 for문을 사용하여 데이터를 1개씩 꺼낼 수가 없다.
그래서 만들어진 메소드가 iterator() 메소드이다.
이 방법 외에도 인덱스 정보가 없이 사용할 수 있는 for-each문을 사용해도 된다.

대표적인 클래스 3가지

  • Set은 인터페이스이기 때문에 객체를 스스로 생성하지 못함 (클래스 필요)
    a. HashSet
    b. LinkedHashSet
    c. TreeSet

① HashSet

특징

  • Set의 특성상 데이터를 출력할 때 입력 순서와 다를 수 있다.
  • 중복데이터를 입력하면 자동으로 중복처리된다.
hs.add("가");
hs.add("나");
hs.add("가");
// [가, 나]
  • HashSet의 중복 확인 메커니즘(자바완전정복 p.656)

    우선 해시코드가 동일한지 비교하고, 그 다음 equals()메소드로 비교한 후에 다름여부를 판단한다.
    만약 해시코드가 동일하지 않으면 equals메소드 판단 단계로 가기 전에 다른 객체로 미리 판단한다.

② LinkedHashSet

특징

  • LinkedHashSet은 HashSet의 자식 클래스로 모든 기능이 동일한데,
  • 거기에 데이터 간의 연결 정보를 추가한 클래스이다.
  • 그렇기 때문에 HashSet과는 다르게 입출력 순서가 항상 동일하다.
  • 입력 순서를 가지고 있지만, List처럼 중간에 데이터를 추가하거나 특정값을 가져오는 것은 불가능하다.

③ TreeSet

특징

  • Set의 공통기능에 크기에 따른 정렬검색 기능이 추가된 클래스이다.
  • HashSet은 출력할 때 입력 순서와 다를 수 있고, LinkedHashSet은 항상 입력 순서와 동일하다고 했다. TreeSet은 데이터를 입력 순서와 상관없이 크기순으로 출력한다. 즉, HashSet이 데이터의 출력 기준을 두 객체의 동일 여부로 봤다면, TreeSet은 입력 순서와 상관없이 크기순으로 출력한다.
  • TreeSet의 핵심 기능은 정렬과 검색은 SortedSet와 NavigableSet에서 상속받은 것이기 때문에 객체 생성 시 반드시 TreeSet으로 선언해야 정렬 및 검색 메소드를 호출할 수 있다.
TreeSet<String> treeSet = new TreeSet<String>();

🛠 TreeSet의 주요 메소드 (Set의 메소드 이외에 TreeSet에서 추가된 메소드)

a. first() : Set 원소 중 가장 작은 원소값을 리턴
b. last() : Set 원소 중 가장 큰 원소값을 리턴
c. lower(E element) : 매개변수보다 작은 수 중 가장 큰 수
d. higher(E element) : 매개변수보다 큰 수 중 가장 작은 수
e. floor(E element) : 매개변수보다 같거나 작은 수 중 가장 큰 수
f. ceiling(E element) : 매개변수보다 같거나 큰 수 중 가장 작은 수
g. pollFirst() : Set 원소들 중 가장 작은 원소값을 리턴
h. pollLast() : Set 원소들 중 가장 큰 원소값을 리턴
i. headSet(E toElement) : toElement 미만인 모든 원소로 구성된 Set을 리턴(toElement 미포함)
j. headSet(E toElement, boolean inclusive)

toElement 미만/이하인 모든 원소로 구성된 Set을 리턴 (inclusive=true이면 toElement 포 함, inclusive=false이면 inclusive 미포함)

k. tailSet(E fromElement) : toElement 이상인 모든 원소로 구성된 Set을 리턴 (fromElement 포함)


3. Map<K,V> 인터페이스

List인터페이스와 Set인터페이스는 Collection인터페이스를 상속받는 반면, Map<K,V>는 별도의 인터페이스로 존재한다. 따라서 저장의 형태와 방식이 앞 두 인터페이스와는 다르다.

Map<K,V> 특징

Key와 Value 한 쌍으로 데이터를 저장
Map<K,V>는 Key(키)와 Value(값)의 한 쌍으로 데이터를 저장한다. 이 때 한 쌍의 데이터를 엔트리라고 하며, Map.Entry 타입으로 정의된다. 즉, 데이터를 엔트리 단위로 입력받는 것이다.

Key는 중복 불가 X, Value는 중복 가능 O
만일 동일한 Key가 2개 이상이라면 map.get(중복되는 키값)와 같이 실행할 때 어떤 값을 가져올 지 결정할 수 없을 것이다. 따라서 Map<K,V>에서 Key는 중복이 불가하며, Value는 중복이 허용되는 것이다.

자바완전정복(p.680)

Map의 주요 메소드

a. put(K key, V value) : 매개변수의 key, value를 Map 객체에 추가
b. putAll(Map<? extends K,? extends V>m) : 매개변수의 Map객체를 통째로 추가
c. replace(K key, V value) : Key에 해당하는 값을 Value값으로 변경
d. replace((K key, V oldValue, V newValue) : oldValue를 newValue로 변경
e. get(Object key) : 매개변수 key값에 해당하는 oldValue를 리턴
f. containsKey(Object key) : 매개변수 Key값이 포함돼 있는지 여부 확인
g. containsValue(Object value) : 매개변수 value값이 포함돼 있는지 여부 확인
h. keySet() : Map 데이터들 중 Key들만 뽑아 Set 객체로 리턴
i. entrySet() : Map의 각 엔트리들을 Set 객체로 담아 리턴
j. size() : Map에 포함된 엔트리의 개수
k. remove(Object key) : 매개변수의 Key를 갖는 엔트리 삭제
l. remove(Object key, Object value) : 매개변수의 key,value를 갖는 엔트리 삭제
m. clear() : Map객체 내의 모든 데이터 삭제

대표적인 클래스 4가지

  • Map<K,V>은 인터페이스이기 때문에 객체를 스스로 생성하지 못함 (클래스 필요)
    a. HashMap<K,V>
    b. Hashtable<K,V>
    c. LinkedHashMap<K,V>
    d. TreeMap<K,V>

① HashMap<K,V>

특징

  • Key값의 중복을 허용하지 않는다. 중복 여부 확인의 메커니즘은 HashSet과 동일하다.
  • HashMap 객체는 개념상으로 Key값을 HashSet으로 구현한 객체이다. 따라서 Key값이 HashSet의 특성을 가지고 있으므로 입출력 순서는 동일하지 않을 수 있다.
  • 단일 쓰레드에 적합

② Hashtable<K,V>

특징

  • HashMap이 구현한 클래스가 단일 쓰레드가 적합한 반면, Hashtable은 멀티 쓰레드에 안정성을 가진다. (내부의 주요 메서드가 동기화 메소드로 구현되어 있음)
  • 그 이외의 모든 점은 HashMap의 특징과 동일하다.

③ LinkedHashMap<K,V>

특징

  • 출력순서가 항상 입력 순서와 동일하다.
  • 그 이외의 모든 점은 HashMap의 특징과 동일하다.

④ TreeMap<K,V>

  • Map의 기본기능에서 정렬검색 기능을 추가한 클래스이다.
    순서와 관계없이 데이터를 Key값의 크기 순으로 저장한다. 그렇기 때문에 반드시 Key객체는 크기 비교의 기준을 갖고 있어야 한다.
    TreeSet과 마찬가지로 Map인터페이스에는 없는 정렬검색 기능을 상속받기 때문에 TreeMap타입으로 선언해야한다. 그래야 정렬,검색 메소드를 사용할 수 있다.

🛠 TreeMap의 주요 메소드 (Map의 메소드 이외에 TreeMap에서 추가된 메소드)

a. firstKey() : Map 원소 중 가장 작은 Key 값 리턴
b. firstEntry() : Map 원소 중 가장 작은 Key값을 갖는 엔트리를 리턴

c. lastKey() : Map 원소 중 가장 큰 Key 값 리턴
d. lastEntry() : Map 원소 중 가장 큰 Key값을 갖는 엔트리를 리턴

e. lowerKey(K key) : 매개변수 Key값보다 작은 Key값 중 가장 큰 Key값 리턴
f. lowerEntryK key) : 매개변수 Key값보다 작은 Key값 중 가장 큰 Key값을 갖는 엔트리를 리턴

g. higherKey(K key) : 매개변수 Key값보다 큰 Key값 중 가장 작은 Key값 리턴
h. higherEntry(K key) : 매개변수 Key값보다 큰 Key값 중 가장 작은 Key값을 갖는 엔트리를 리턴

i. pollFirstEntry() : Map 원소 중 가장 작은 Key값을 갖는 엔트리를 꺼내 리턴
j. pollLastEntry() : Map 원소 중 가장 큰 Key값을 갖는 엔트리를 꺼내 리턴

k. headMap(K toKey)

  • toKey 미만의 Key값을 갖는 모든 엔트리를 포함한 Map객체 리턴(toKey미포함)

l. headMap(K toKey, boolean inclusive)

  • toKey미만/이하의 Key값을 갖는 모든 엔트리를 포함한 Map 객체 리턴

m. tailMap(K fromKey)

  • fromKey 이상인 Key값을 갖는 모든 엔트리를 포함한 Map객체 리턴

n. tailMap(K fromKey, boolean inclusive)

  • fromKey 초과/이상인 Key값을 갖는 모든 엔트리를 포함한 Map객체 리턴

o. subSet(K fromKey,K toKey)

  • fromKey 이상 toKey 미만의 Key값을 갖는 모든 엔트리를 포함한 Map 객체 리턴

p. subSet(K fromKey,boolean frominclusive, K toKey, boolean toinclusive)

  • fromKey 초과/이상 toKey 미만/이하인 Key값을 갖는 모든 엔트리를 포함한 Map 객체 리턴
profile
I'm still hungry.

0개의 댓글