[CH11. 컬렉션프레임웍과 유용한 클래스] List, Set, Map

1. 컬렉션 프레임웍(Collection Framework)

데이터군을 저장하는 클래스들을 표준화 한 설계.

1.1 컬렉션프레임웍의 핵심 인터페이스 - List, Set, Map

인터페이스 특징
List 순서가 있는 데이터의 집합. 데이터의 중복을 허용한다.
예) 대기자 명단
구현클래스: ArrayList, LinkedList, Stack, Vector 등
Set 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다.
예) 양의 정수집합, 소수의 집합
구현클래스 : HashSet, ThreeSet 등
Map 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합
순서는 유지되지 않으며, 키는 중복을 허용하지 않고 값은 중복을 허용한다.
예) 우편번호, 지역번호(전화번호)
구현클래스: HashMap, ThreeMap, Hashtable, Properties 등

1.1.1 Collection 인터페이스

메서드 설명
boolean add(Object o)
boolean addAll(Collection o)
지정된 객체 또는 컬렉션이 객체들을 Collection 에 추가한다.
void clear() Collection 의 객체를 모두 삭제한다.
boolean contains(Object o)
boolean containsAll(Collection c)
지정된 객체 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다.
boolean equals(Object o) 동일한 Collection인지 비교한다.
int hashCode() Collection의 hash code를 반환한다.
boolean isEmpty() Collection이 비어있는지 확인한다.
Iterator iterator() Collection의 Iterator를 얻어서 반환한다
boolean remove(Object o) 지정된 객체를 삭제한다
boolean removeAll(Collection c) 지정된 Collection에 포함된 객체들을 삭제한다.
boolean retainAll(Collection c) 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제한다. 이 작업으로 인해 Collection에 변화가 있으면 true없으면 false를 반환한다.
int size() Collection에 저장된 객체의 개수를 반환한다.
Object[] toArray() Collection에 저장된 객체를 객체배열(Object[])로 반환한다.
Object[] toArray(Object[] a) 지정된 배열에 Collectiom의 객체를 저장해서 반환한다.

1.1.2 List인터페이스

| 메서드 | 설명 |
| void add(int index, Object element)
addAll(int index, Collection c) | 지정된 위치에 객체를 컬렉션에 포함된 객체들을 추가한다. |
| Object get(int index) | 지정된 위치에 있는 객체를 반환한다. |
| int indexOf(Object o) | 지정된 객체의 위치를 반환한다.
(List의 첫번째 요소부터 순방향으로 찾는다.) |
| int lastIndexOf(Object o) | 지정된 객체의 위치를 반환한다.
(List의 마지막 요소부터 역방향으로 찾는다.) |
| ListIterator listIterator()
ListIterator listIterator(int index) | List의 객체에 접근할 수 있는 ListIterator를 반환한다. |
| Object remove(int index) | 지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환한다. |
| Object set(int index, Object element) | 지졷왼 위치에 객체를 저장한다. |
| List subList(int fromIndex, int toIndex) | 지정된 범위에 있는 객체를 반환한다. |

1.1.3 Set인터페이스

중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용됨. HashSet, ThreeSet등이 있음.

1.1.4 Map인터페이스

메서드 설명
void clear() Map의모든 객체를 삭제한다
boolean containsKey(Object Key) 지정된 key 객체와 일치하는 Map의 key 객체가 있는지 확인한다.
boolean containsValue() 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인한다.
set entrySet() Map에 저장되어있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환한다.
boolean equals(Object o) 동일한 Map인지 비교한다
Object get(Object key) 지정한 key 객체에 대응하는 value 객체를 찾아서 반환한다.
int hashCode() 해시코드를 반환한다.
boolean isEmpty() Map이 비어있는지 확인한다.
Set keySet() Map에 저장된 모든 key 객체를 반환한다.
Object put(Object key, Object value Map에 value객체를 key객체에 연결하여 저장한다.
void putAll(Map t) 지정한 Map의 모든 key-value쌍을 추가한다.
Object remove(Object key) 지정한 key객체와 일치하는 key-value 객체를 삭제한다
int size() Map에 저장된 key-value쌍의 개수를 반환한다.
Collection values() Map에 저장된 모든 value객체를 반환한다.

1.1.5 Map.Entry 인터페이스

1.2 동기화(Synchronization)

Collections클래스에 아래와 같은 동기화 메서드 제공함. 필요할때 사용가능.

1
2
3
4
5
6
static Collection synchronizedCollection(Collection c)
static List synchronizedList(List list)
static Map synchronizedMap (Map m)
static Set synchronizedSet(Set s)
static SortedMap synchronizedSortedMap(SortedMap m)
static SortedSet synchronizedSortedSet(SortedSet s)

위 메서드를 아래와 같이 사용가능함.

1
List list = Collections.synchronizedList(New ArrayList(...));

1.3 Vector와 ArrayList

공통점 차이점
- List인터페이스를 구현한다.
저장순서가 유지되고 중복을 허용한다.
- 데이터의 저장공간으로 배열을 사용한다.
- Vector는 멀티쓰레드에 대한 동기화가 되어있으나 ArrayList는 그렇지 않다.

Deep Copy vs Shallow Copy

Shallow : 단순히 참조만 복사하는것, 원본 객체에 영향을 받는다.
Deep : 원본과 같은 데이터를 저장하고 있는 새로운 객체나 배열을 생성하는것. 원본 객체에 영향을 받지 않음

1.4 LinkedList

배열의 단점

  1. 크기를 변경할 수 없다.
  2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한것.
링크드리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)과 데이터로 구성됨.

1
2
3
4
class Node{
Node next; // 다음요소의 주소를 저장
Object obj; // 데이터를 저장
}

이동방향이 단방향이어서 다음 요소에 대한 접근은 쉽지만 이전요소에 대한 접근은 어렵다.
이 단점을 보완한것이 더블링크드리스트(이중 연렬리스트)
링크드리스트에 참조변수를 하나 추가해서 이전 요소에 대한 참조가 가능하게 한것.

1
2
3
4
5
class Node{
Node next; //다음 요소의 주소를 저장
Node previous; //이전 요소의 주소를 저장
Object obj; // 데이터를 저장
}

더블써큘러링크드 리스트두 있음.

  1. 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
  2. 중간데이터를 추가/삭제하는 경우에는 LinkedList 가 ArrayList보다 빠르다.

데이터의 개수가 변하지 않는 경우는 ArrayList, 데이터 개수의 변경이 잦다면 LinkedList를 사용하는것이 낫다.

두가지 혼합 방법 : 처음작업전 데이터는 ArrayList에 저장, 작업할때는 LinkenList로 옮겨서 사용

1
2
3
4
5
6
7
8
9
ArrayList al = new ArrayList(1000000);
for(int i = 0; i < 1000000; i++) {
al.add(i+"");
}

LinkedList ll = new LinkedList(al);
for(int i = 0; i < 1000; i++) {
al.add(500, "X");
}

1.5 Stack과 Queue

  • Stack은 마지막에 저장된 데이터를 가장 먼저 꺼냄 LIFO
  • Queue는 처음에 저장한 데이터를 가장 먼저 꺼냄 FIFO

Queue는 ArrayList보다 LinkedList로 구현하는것이 더 적합

Stack

메서드 설명
boolean empty() Stack이 비어있는지 알려준다
Object peek() Stack의 맨 위에 저장된 객체를 반환한다. 꺼내지는 않는다. 비어있으면 null을 반환한다.
Object pop() Stack의 맨 위에 저장된 객체를 꺼낸다.
Object push(Object item) Stack에 객체를 저장한다.
int search(Object o) Stack에서 주어진 객체를 찾아서 그 위치를 반환한다.1부터 시작함

Queue

메서드 설명
Object element() 삭제없이 저장된 요소를 읽어온다. peek와 다른점은 queue가 비었을때 Exception을 발생시킴
boolean offer(Object o) Queue에 객체를 저장한다. 성공하면 true, 실패하면 false를 반환한다.
Object peek() 삭제없이 읽어온다. Queue가 비었을때는 null을 반환한다.
Object pool() Queue에서 꺼내온다. 비어있을때는 null을 반환한다.
Object remove() Queue에서 꺼내온다. 비어있으면 에외를 발생시킨다.
  • 스택의 활용 예 : 수식계산. 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저 앞으로 뒤로
  • 큐의 활용 예 : 최근사용문서, 인쇄작업대기목록, 버퍼
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×