실제 개발 시에는 다루고자 하는 컬렉션(자료구조)의 특징을 파악하고 어떤 인터페이스를 구현한 컬렉션 클래스를 사용해야하는지 결정할 줄 알아야 한다. 학교 수업 시간에 배운 자바 컬렉션을 '자바의 정석'이라는 책을 통해서 다시 한번 정리 하고자 한다.
데이터 군을 저장하는 클래스들을 표준화한 설계. 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스를 제공.
컬렉션 프레임워크에서는 컬렉션데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 각 컬렉션을 다루는데 필요한 기능을 가진 3가지의 인터페이스를 정의하였다. 그리고 인터페이스 List와 Set의 공통된 부분을 다시 뽑아서 새로운 인터페이스인 Collection을 추가로 정의하였다. 아래 사진에서 볼 수 있듯이 List와 Set을 구현한 컬렉션 클래스들은 서로 많은 공통부분이 있다는 것을 알 수 있다.
인터페이스 | 특징 |
---|---|
List | 순서가 있는 데이터의 집합. 데이터의 중복을 허용한다. ex)대기자 명단, ArrayList, LinkedList, Stack, Vector 등 |
Set | 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다. ex)양의 정수집합, 소수의 집합, HashSet, TreeSet 등 |
Map | 키(Key)와 값(Value)의 쌍(Pair)으로 이루어진 데이터의 집합. 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다 ex) 우편번호, 지역번호(전화번호), HashMap, TreeMap, Hashtable, Properties 등 |
키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스.
키는 중복될 수 없지만 값은 중복을 허용한다.
기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.
values()에서는 반환타입이 Collection, keySet()에서는 반환타입이 Set
컬렉션 프레임워크에서 가장 많이 사용되는 컬렉션 클래스.
ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용.
ArrayList를 생성할 때, 저장할 요소의 개수를 고려해서 실제 저장할 개수보다 약간 여유 있는 크기로 하는 것이 좋다. 생성할 때 지정한 크기보다 더 많은 객체를 저장하면 자동적으로 크기가 늘어나기는 하지만 이 과정에서 처리시간이 많이 소요되기 때문.
ArrayList나 Vector 같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야할 때는 새로운 배열을 생성한 후 기존의 배열로부터 새로 생성된 배열로 데이터를 복사해야하기 때문에 상당히 효율이 떨어진다는 단점을 가지고 있다. 그래서 처음에 인스턴스를 생성할 때, 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성하는 것이 좋다.
배열에 객체를 순차적으로 저장할 때와 객체를 마지막에 저장된 것부터 삭제하면 System.arraycopy()를 호출하지 않기 때문에 작업시간이 짧지만, 배열의 중간에 위치한 객체를 추가하거나 삭제하는 경우 System.arraycopy()를 호출해서 다른 데이터의 위치를 이동시켜 줘야 하기 때문에 다루는 데이터의 개수가 많을수록 작업시간이 오래 걸린다.
배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간(접근시간)이 가장 빠르다는 장점을 가지고 있지만 다음과 같은 단점도 가지고 있다.
배열의 단점
크기를 변경할 수 없다.
비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
이러한 배열의 단점을 보완하기 위해 링크드 리스트라는 자료구조가 고안되었다. 배열은 모든 데이터가 연속적으로 존재하지만 링크드 리스트는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.
class Node {
Node next; //다음 요소의 주소를 저장
Node previous; //이전 요소의 주소를 저장
Obeject obj;
}
이는 링크드 리스트의 단점인 낮은 접근성을 높이기 위한 것이다.
순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.
컬렉션 | 읽기(접근시간) | 추가/삭제 | 비고 |
---|---|---|---|
ArrayList | 빠르다 | 느리다 | 순차적인 추가삭제는 더 빠름. 비효율적인 메모리 사용 |
LinkedList | 느리다 | 빠르다 | 데이터가 많을수록 접근성이 떨어짐 |
다음 포스터에 이어서 Stack, Queue, Set, Map에 대해 정리하도록 하겠다.