Java를 사용하던 중 List와 ArrayList의 관계나 차이 점이 궁금해졌습니다. 그러다 생각을 해보니 평소 Java에서 List
나 Map
을 많이 사용하지만 항상 아래와 같은 식으로 기계적으로 사용하는 느낌이 들었습니다.
// ArrayList
List<String> list = new ArrayList<>();
// HashMap
Map<String, Object> map = new HashMap<>();
그래서 이번 글에서는 Java
의 자료구조에 대해서 알아보기로 하였습니다.
JCF (Java Collections Framework)
Java Collections Framework - 위키백과(영어)
The Java collections framework is a set of classes and interfaces that implement commonly reusable collection data structures.
파파고의 힘을 빌려서 번역을 해보았습니다.
Java Collections Framework - 위키백과(한글)
Java collections framework는 공통적으로 재사용 가능한 수집 데이터 구조를 구현하는 클래스 및 인터페이스의 집합이다.
번역을 해도 이해가 잘 가지 않습니다?
그래서 간단히 Java에서 데이터를 저장하는 자료구조들과 그들을 이루는 클래스, 인터페이스들을 제공하는 것 이라고 생각하면 될 것 같습니다. 아래는 JFC
의 상속 구조를 표현하고 있습니다.
조금 더 자세한 내용은 아래 위키백과의 그림을 참고하면 좋을 듯 합니다.
Collection
Map은 Collection인터페이스를 상속하지 않지만 일반적으로 Collection을 이야기 할때 주로 포함 된다고 합니다. 그렇기 때문에 Collection에서 같이 다뤄보겠습니다.
List
순서 있는 데이터의 집합으로 데이터의 중복을 허용합니다. 각 요소의 객체 자체가 아닌 요소 객체의 주소를 참조하여 저장합니다.
- LinkedList
아래와 같이 노드와 노드가 연결된 구조의 자료구조입니다.
이러한 특징으로 검색 보다는 삽입/삭제 가 유리합니다. 아래와 같이 링크만 변경하면 다른 요소들은 변경없이 삽입/삭제가 가능하기 때문입니다.
- ArrayList
객체를 인덱스로 관리합니다. 배열과 달리 사용 중 크기를 변경 할 수 있습니다. 초기 용량을 지정 하려면 생성자를 호출 할 때 지정할 수 있습니다. 지정하지 않는 다면 초기 10개를 저장할 수 있는 크기로 만들어 집니다.
List<T> list = new ArrayList<T>(n);
인덱스로 객체를 관리하기 때문에 검색에 유리하지만 용량을 확장하는 과정이 기존 리스트를 확장하는 것이 아닌 기존보다 확장된 새로운 리스트를 만든 후 기존 리스트를 새로운 리스트로 옮기고 기존 리스트를 삭제하는 과정으로 많은 시간이 소요됩니다
- Vector
ArrayList
와 동일한 내부 구조를 가지고 있습니다. 하지만 동기화된 메소드로 구성되어 있기 때문에 동시에 Vector
메소드를 실행 할 수 없기 때문에 안전한 추가,삭제가 가능합니다. 과거 대용량 처리를 위해 사용했지만 비교적 성능이 좋지 않고 무거워 잘 사용하지 않는다고 합니다.
Set
데이터의 저장 순서를 유지하지 않고 데이터의 중복을 허용하지 않습니다.
- HashSet
- 순서가 필요없는 데이터를
hash table
에 저장합니다. Set중 성능이 가장 좋습니다. - TreeSet
저장된 데이터를 값에 따라 정렬됩니다. red-black tree
타입으로 값이 저장되고 Hash Set 에 비해 성능이 느립니다.
Red-Black Tree - 위키백과
레드-블랙 트리(Red-black tree)는 자가 균형 이진 탐색 트리(self-balancing binary search tree)로써, 대표적으로는 연관 배열 등을 구현하는 데 쓰이는 자료구조다
자세한 내용은 알고리즘 ) Red-Black Tree를 참고해 보시면 좋을 듯 합니다.
- LinkedHashSet
hash table
에 데이터를 저장합니다. 저장된 순서에 따라 값이 정렬됩니다. 세가지 중 가능 성능이 느립니다.
Map
키(key)와 값(value)로 구성된 데이터를 저장합니다. 순서가 유지되지 않고 key 의 중복을 허용하지 않지만 value 의 중복은 허용합니다.
- HashTable
HashMap
보다는 느리지만 동기화를 지원합니다. null 사용이 불가능합니다.
- HashMap
Map인터페이스를 구현하기 위해 hash table
을 사용한 클래스입니다. hash table
과는 다르게 키와 값으로 null값이 허용됩니다.
- TreeMap
정렬된 순서로 데이터를 저장합니다. 그렇기 때문에 검색이 빠릅니다.
마무리
간단하게 자바의 자료구조에 대해서 알아보았습니다. 중간에 hash table
이라는 단어가 많이 나왔는데 그냥 자료구조 중 하나라고만 알고 있었기 때문에 다음에는 hash table
의 동작원리에 대해서도 조금 더 자세히 다뤄 보고 싶습니다. 항상 ArrayList
와 HashMap
만 사용해서 그렇게만 알고 있었지만 이번을 계기로 더 많은 자료구조들을 접해본 것 같습니다.
참고 문서
Java Collection Framework :: 자바의 자료구조 (List, Set, Map)
[JAVA] Java 컬렉션(Collection) 정리