[자바] Collections _ List 인터페이스
collections의 다른 인터페이스들과 List 인터페이스의 가장 큰 차이는 배열처럼 순서가 있고 중복을 허용한다는 것이다.
위 그림에서 볼 수 있듯이, ArrayList, LinkedList, Vector, Stack이 순서가 있는 Collection으로 많이 사용된다.
ArraysList는 Vector와 거의 동일하지만, ArrayList는 Thread safe를 하지 않고, Vector는 Thread safe를 한다.
Thread Safe?
Thread Safe를 하지 않다는 것은
하나의 개체에 여러 사람이 접근해서 값을 변경하려고 하면 문제가 발생할 수 있다는 것이다.
동기화(Synchronized)와 같은 용어이다.
ArrayList
Vector 클래스를 개선한 것으로, 기능적으론 동일하다.
내부적으로 Object 배열을 이용하는데, 배열과 거의 같다.
배열처럼 인덱스는 0부터 시작하여 1씩 증가하며 데이터는 순서대로 저장된다.
하지만 만약 배열의 공간이 꽉 찬다면, 기존 배열의 크기가 더 늘어나는 것이 아니라, 크기가 늘어난 새로운 배열을 생성하고 그곳에 기존의 데이터를 복사한다.
즉, 동적인 배열이고 이러한 특성은 속도에 악영향을 미치기도 한다.
이러한 배열 형태의 자료구조는 구조가 단순하고 데이터를 읽는 속도가 빠르지만,
크기 변경이 어렵고(새로운 배열 생성), 비순차적 데이터에 대해 삭제나 추가를 할 때 시간이 많이 걸린다.
가장 마지막 인덱스에 있는 데이터의 삭제/추가는 빠르지만, 중간 인덱스에 위치한 데이터를 삭제/추가 하려면 삭제를 위해 또다시 새로운 배열을 생성하고 복사 과정을 거치거나, 중간에 데이터를 추가하기 위해 빈 공간을 만들어야하기 때문이다.
LinkedList
ArrayList의 단점을 극복하기 위한 자료구조이다.
다만, 배열은 연속적으로 데이터가 존재하여 주소가 일정하게 증가하지만,
LinkedList는 주소가 불연속적이고 뒤죽박죽이 연결 형태로 되어있기 때문에 데이터를 읽는 속도가 느릴 수 있다,
하지만 삭제/추가 작업에 대해서는 연결을 끊거나 이어주기만 하면 돼서 배열보다 빠르고 쉽다.
Sorted 인터페이스
위 그림들에서 Set과 Map인터페이스 아래 부분에 Sorted- 가 붙은 SortedSet / SortedMap 인터페이스 / 추상 클래스가 있다.
이들은 각각 TreeSet과 TreeMap이라는 구현체를 만들어 내는데, 이 둘은 Set과 Map의 기능을 갖고 있으면서
추가적으로 정렬 기능이 있다.
즉 정렬 기능이 없는 Set/Map 인터페이스의 구현체는 HashSet, HashMap 이고,
정렬 기능이 있는 Set/Map 인터페이스의 구현체는 TreeSet, TreeMap 이다.
구현 예시
// HashSet -> TreeSet
Set<String> set = new HashSet<String>();
// 코드 진행
Set<String> treeSet = new TreeSet<String>();
treeSet.addAll(set);
// HashMap -> TreeMap
Map<String, Integer> map = new HashMap<String, Integer>();
// 코드 진행
Map<String, Integer> treeMap = new TreeMap<String, Integer>();
treeMap.putAll(map);
TreeSet
- 데이터를 넣을 때 마다 자동으로 오름차순으로 정렬된다.
TreeMap
- Key를 기준으로 오름차순으로 정렬된다.
Comparator
- TreeSet, TreeMap 모두 String이나 기본 데이터 타입과 같은 단순한 타입에는 기본적으로 오름차순 정렬이 되지만,
개발자가 직접 정렬 방식을 지정할 수 있다.
이때 Comparator 인터페이스를 사용한다.
class CustomComparator<T> implements Comparator<T> {
public int compare(T param1, T param2) {
// 비교 방법 구현
}
}