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 | static Collection synchronizedCollection(Collection c) |
위 메서드를 아래와 같이 사용가능함.
1 | List list = Collections.synchronizedList(New ArrayList(...)); |
1.3 Vector와 ArrayList
공통점 | 차이점 |
---|---|
- List인터페이스를 구현한다. 저장순서가 유지되고 중복을 허용한다. - 데이터의 저장공간으로 배열을 사용한다. |
- Vector는 멀티쓰레드에 대한 동기화가 되어있으나 ArrayList는 그렇지 않다. |
Deep Copy vs Shallow Copy
Shallow : 단순히 참조만 복사하는것, 원본 객체에 영향을 받는다.
Deep : 원본과 같은 데이터를 저장하고 있는 새로운 객체나 배열을 생성하는것. 원본 객체에 영향을 받지 않음
1.4 LinkedList
배열의 단점
- 크기를 변경할 수 없다.
- 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한것.
링크드리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)과 데이터로 구성됨.
1 | class Node{ |
이동방향이 단방향이어서 다음 요소에 대한 접근은 쉽지만 이전요소에 대한 접근은 어렵다.
이 단점을 보완한것이 더블링크드리스트(이중 연렬리스트)
링크드리스트에 참조변수를 하나 추가해서 이전 요소에 대한 참조가 가능하게 한것.
1 | class Node{ |
더블써큘러링크드 리스트두 있음.
- 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
- 중간데이터를 추가/삭제하는 경우에는 LinkedList 가 ArrayList보다 빠르다.
데이터의 개수가 변하지 않는 경우는 ArrayList, 데이터 개수의 변경이 잦다면 LinkedList를 사용하는것이 낫다.
두가지 혼합 방법 : 처음작업전 데이터는 ArrayList에 저장, 작업할때는 LinkenList로 옮겨서 사용
1 | ArrayList al = new ArrayList(1000000); |
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, 웹브라우저 앞으로 뒤로
- 큐의 활용 예 : 최근사용문서, 인쇄작업대기목록, 버퍼