컬렉션 프레임워크
Updated:
강의 사이트
http://tcpschool.com/
컬렉션 프레임워크의 개념
1. 컬렉션 프레임워크란?
- 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미
- 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
- 자바의 인터페이스를 사용하여 구현
2. 컬렉션 프레임워크 주요 인터페이스
- Collection
- List
- Set
- Map
3. 주요 인터페이스 간의 상속 관계
-
List
- Vector
- 가장 오래됨. 쓰지말자
- ArrayList
- 내부적으로 배열을 이용하여 요소를 저장
- 그래서 크기를 늘리기 위해 새로운 배열 생성해야함. 느림
- LinkedList
- ArrayList 단점을 극복하기 위해 만듬
- Stack
- Queue
- Vector
-
Set
-
HashSet
-
Hash 알고리즘 사용
- HashMap 인스턴스를 이용하여 요소를 저장
- LinkedHashSet 을 사용하면 저장 순서 유지할 수 있음
-
-
TreeSet
- 이진 검색 트리의 형태로 요소를 저장(레드-블랙 트리로 구현)
- 데이터 추가, 제거 등 동작 시간이 빠름
-
-
Map
- Hashtable
- 쓰지말자
- TreeMap
- 이진 검색 트리의 형태로 요소를 저장(레드-블랙 트리로 구현)
- HashMap
- Hashtable이후 나온 클래스
- 이거를 쓰자
- Properties
- Hashtable
4. Iterator와 ListIterator
- Enumeration 인터페이스는 Iterator 인터페이스 이전꺼니까 쓰지말자
- Collection 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근하도록 하고 있다.
- ListIterator 인터페이스는 Iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스
- ListIterator 인터페이스는 컬렉션 요소의 대체, 추가 그리고 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원
Comparable과 Comparator
1. Comparable < T > 인터페이스
- Comparable 인터페이스는 객체를 정렬하는 데 사용되는 메소드인 compareTo() 메소드를 정의한다.
- 자바에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.
- Boolean을 제외한 래퍼 클래스나 String, Time, Date와 같은 클래스의 인스턴스는 모두 정렬 가능
- 기본 정렬 순서는 작은 값에서 큰 값으로 정렬되는 오름차순
2. Comparator < T > 인터페이스
- Comparator 인터페이스는 Comparable 인터페이스와 같이 객체를 정렬하는 데 사용
- Comparator 인터페이스는 내림차순이나 아니면 다른 기준으로 정렬하고 싶을 때 사용할 수 있다.
- 이때 Comparator 인터페이스를 구현한 클래스에서는 compare() 메소드를 재정의하여 사용
- 다음 예제는 요소를 내림차순으로 정렬하여 저장하는 TreeSet 인스턴스를 생성하기 위해 Comparator 인터페이스를 구현하는 예제
import java.util.*;
class DescendingOrder implements Comparator<Integer> {
public int compare(Integer o1, Integer o2) {
if(o1 instanceof Comparable && o2 instanceof Comparable) {
Integer c1 = (Integer)o1;
Integer c2 = (Integer)o2;
return c2.compareTo(c1);
}
return -1;
}
}
public class Comparable02 {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>(new DescendingOrder());
ts.add(30);
ts.add(40);
ts.add(20);
ts.add(10);
Iterator<Integer> iter = ts.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
}
/*
40
30
20
10
*/