다수의 객체를 다루기 위한 표준화된 프로그래밍 방식
컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공
java.util패키지에 포함
여러 객체(데이터)를 모아 놓은 것
표준화, 정형화된 체계적인 프로그래밍 방식
자유도는 떨어지나, 생산성 증대, 유지보수 용이
기능만 제공
다수의 데이터를 저장할 수 있는 클래스
컬렉션을 위한 static 메서드 제공
1. 컬렉션 채우기, 복사, 검색 : fill(), copy(), sort(), binarySearch() 등
2. 컬렉션 동기화 : synchronizedXXX()
3. 변경불가 컬렉션 만들기 : unmodifiableXXX()
4. 싱글톤 컬렉션 : singletonXXX()
5. 한 종류의 객체만 저장 : checkedXXX()
List, Set 공통 요소
컬렉션에 저장된 데이터를 접근하는데 사용하는 인터페이스
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용한다
List list = new ArrayList();
Iterator it = list.iterator(); // Iterator 객체 반환
Enumerations는 Iterator의 구버전으로 Iterator를 사용하면 됨
ListIterator는 Iterator의 접근성을 향상시킨 것(양방향)
단, Map에는 iterator()가 없다 (Map은 Collection의 자손이 아니다)
☞ keySet(), entrySet(), values()를 호출해야 한다
Map map = new HashMap();
...
Iterator it = map.entrySet().iterator();
boolean hasNext()
Object next()
boolean hasMoreElements()
Object nextElement()
배열을 다루기 편리한 static 메서드 제공
1. 배열 출력 - toString()
2. 배열 복사 - copyOf(), copyOfRange()
3. 배열 채우기 - fill(), setAll()
4. 정렬, 검색 - sort(), binarySearch()
순차탐색 vs 이진탐색
순차탐색 - 정렬X
이진탐색 - 정렬O, 둘로 나누어가며 검색
Comperator : 기본 정렬기준 외 다른 기준으로 정렬하고자 할 때 사용
Comparable : 기본 정렬기준 구현
static void sort(Object[] a) // Comparable에 의한 기본 정렬
static void sort(Object[] a, Comperator c) // 지정한 Comperator에 의한 정렬
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
순서가 있는 데이터의 집합
데이터의 중복을 허용한다
ArrayList, LinkedList, Stack, Vector 등
기존의 Vector(동기화처리 O)를 개선한 것, ArrayList는 동기화처리 X
데이터 저장공간으로 배열을 사용한다
저장순서가 유지되고 중복을 허용한다
ArrayList()
ArrayList(Collection c)
ArrayList(int initialCapacity)
객체의 삭제 과정
list.remove(2); 호출
1) 삭제할 데이터 아래의 데이터를 한 칸씩 뒤로 복사해서 삭제할 데이터를 덮어쓴다
2) 마지막 데이터는 null로 변경
3) size 값을 감소시킨다
LIFO, 배열로의 구현이 효율적이다
Stack 클래스 존재
Stack st = new Stack();
st.push("a");
boolean empty()
Object peek()
Object push()
Object push(Object item)
int search(Obejct o)
수식계산, 수식괄호검사, 워드프로세서의 undo,redo, 웹브라우저의 뒤로/앞으로
장점) 구조가 간단하고 데이터 읽어오는데 걸리는 시간이 짧다
단점) 크기를 변경할 수 없다. 비순차적인 데이터의 추가 및 삭제에 시간이 많이 걸린다.
☞ 배열의 단점을 보완
LinkedList는 불연속적으로 존재하는 데이터를 연결
⎻ 데이터 삭제: 단 한 번의 참조 변경만으로 가능
⎻ 데이터 추가: 한 번의 Node 객체 생성, 두 번의 참조 변경만으로 가능
단, 데이터 접근성이 나쁘다
FIFO, LinkedList가 효율적이다(앞에서부터 삭제)
Queue 인터페이스 존재
☞ Queue 직접 구현
☞ Queue를 구현한 클래스들 중 하나를 사용 :"LinkedList"
Queue q = new LinkedList();
q.offer("a");
boolean add(Object o) - 추가(예외발생)
Object remove() - 삭제(예외발생)
Object element()
boolean offer(Object o) - 추가(예외발생X)
Object poll() - 삭제(예외발생X)
Object peek()
최근사용문서, 인쇄작업 대기목록, 버퍼
순서를 유지하지 않는 데이터의 집합
데이터의 중복을 허용하지 않는다
HashSet, TreeSet 등
Collection 인터페이스와 동일
집합과 관련된 메서드(Collection에 변화가 있으면 true, 아닌면 false)
Set 인터페이스를 구현한 대표적인 컬렉션 클래스
중복을 허용하지 않기 때문에 저장하기 전에 같은 객체 존재 여부 체크
☞ boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
❗️ equals(), hashCode() 오버라이딩 되어 있어야 HashSet이 바르게 동작함
순서를 유지하려면 LinkedHashSet클래스를 사용
HashSet()
HashSet(Collection c)
HashSet(int initialCapacity)
HashSet(int initialCapacity, float loadFactor)
boolean add(Object o)
boolean addAll(Collection c) - 합집합
boolean remove(Object o) - 삭제
boolean removeAll(Collection c) - 교집합
boolean retainAll(Collection c) - 차집합
void clear()
boolean contains(Object o)
boolean containsAll(Collection c)
iterator iterator()
boolean isEmpty()
int size()
Object[] toArray()
Object[] toArray(Object[] a)
이진 탐색 트리로 구현
⎻ 모든 노드가 최대 2개의 하위 노드를 갖는다
⎻ 부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장한다
범위검색과 정렬에 유리한 컬렉션 클래스
HashSet보다 데이터 추가, 삭제에 시간이 더 걸린다(비교횟수 증가)
TreeSet()
TreeSet(Collection c)
TreeSet(Comperator comp) - 주어진 정렬기준으로 정렬하는 TreeSet 생성
boolean add(Object o)
데이터 저장과정
루트부터 트리를 따라 내려가며 값을 비교
값이 작으면 왼쪽, 크면 오른쪽에 저장한다
Object first()
Object last()
Object celing(Object o) - 같은 객체 반환, 없으면 큰 값 가진 객체 중 가장 가까운 값 객체 반환
Object floor(Object o)
Object higher(Object o)
Object lower(Object o)
SortedSet subset(Object fromElement, Object toElement)
SortedSet headset(Obejct toElement) - 지정 객체보다 작은 값
SortedSet tailSet(Object from Element) - 지정 객체보다 큰 값
key와 value의 쌍으로 이루어진 데이터의 집합
순서는 유지되지 않으며, 키는 중복을 허용하지 않으나 값은 중복을 허용한다
HashMap, TreeMap, Hashtable, Properties 등
Map인터페이스를 구현한 대표적인 컬렉션 클래스
순서를 유지하려면 LinkedHashMap클래스 사용
해싱기법으로 데이터를 저장하여 데이터가 많아도 검색이 빠르다
HashMap()
HashMap(int initialCapacity)
HashMap(int initialCapacity, fload loadFactor)
HashMap(Map m)
Object put(Object key, Object value)
void putAll(Map m)
Object remove(Object key)
Object replace(Object key, Object value)
boolean replace(Object key, Object oldValue, Object newValue)
Set entrySet()
Set keySet()
Collection Values()
Object get(Object key)
Object getOrDefault(Object key, Object defaultValue)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
void clear()
Object clone()
범위 검색과 정렬에 유리
HashMap보다 데이터 추가, 삭제에 시간이 더 걸림