컬렉션(Collection)은 Java에서 데이터를 저장하고 관리하는 자료구조를 말한다.
Java에서 제공하는 컬렉션 프레임워크는 다양한 자료구조를 제공하여 프로그래머들이 데이터를 보다 쉽게 다룰 수 있도록 한다.
그 중에 대표적으로 가장 많이쓰이는 3가지의 자료구조가 있는데 오늘 알아볼 List, Set, Map이 그 주인공이다.
순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다. 데이터를 인덱스를 통해 접근할 수 잇으며, ArrayList, LinkedList 등이 있다.
여기서 그러면 ArrayList와 LinkedList의 차이점은 뭘까 ?
ArrayList는 내부적으로 배열(Array)을 사용하여 데이터를 저장한다. 데이터의 접근 속도가 빠르며, 순차적인 데이터의 추가/삭제는 느리지만 임의의 위치에 있는 데이터를 추가/삭제하는 경우 빠르게 처리할 수 있다.
이것을 구현한 글은 다음과 같다.
(ArrayList 자바로 구현하기)
https://velog.io/@leon/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-ArrayList-%EC%9E%90%EB%B0%94%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
LinkedList는 내부적으로 링크(Linked)를 사용하여 데이터를 저장한다. 각각의 데이터 노드(Node)는 이전 노드와 다음 노드를 가리키는 포인터를 가지고 있다. 순차적인 데이터의 추가/삭제는 빠르지만 임의의 위치에 있는 데이터를 접근/추가/삭제하는 경우 ArrayList에 비해 느리게 처리된다.
따라서 ArrayList는 데이터의 접근이 빈번한 경우에, LinkedList는 순차적인 데이터의 추가/삭제가 빈번한 경우에 적합한 자료구조이다.
Set은 순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않는다. 중복된 데이터를 저장하지 않으며 대표적으로 HashSet, TreeSet이 있다.
HashSet은 내부적으로 해시(Hash)를 사용하여 데이터를 저장한다.
(여기서 해시란 임의 크기의 데이터를 고정된 크기의 데이터로 변환하는 것을 말한다) 데이터를 저장할 때, 객체의 해시 코드를 계산하여 인덱스를 구한 뒤, 해당 인덱스에 데이터를 저장한다. 중복된 데이터는 허용하지 않으며, 데이터의 추가/삭제, 데이터의 존재 여부를 빠르게 처리할 수 있다.
TreeSet은 내부적으로 이진 검색 트리를 사용하여 데이터를 저장한다. 데이터를 추가할 때 이진 검색 트리에 추가하며, 중복된 데이터는 허용하지 않는다. 이진 검색 트리는 데이터가 정렬된 상태로 저장되므로, 정렬된 데이터를 빠르게 검색할 수 있다. 하지만 데이터의 추가/삭제는 HashSet에 비해 느리게 처리된다.
HashSet은 데이터의 추가/삭제가 빈번한 경우에, TreeSet은 정렬된 데이터를 검색하는 경우에 적합한 자료구조이다.
Map은 Key-Value 쌍으로 데이터를 저장하는 자료구조로, 중복된 Key값을 허용하지 않는다. Key를 통해 Value에 접근할 수 있으며, HashMap, TreeMap 등이 있다. HashMap과 TreeMap의 구조는 위에 설명한 HashSet, TreeSet의 구조와 비슷하다.
List는 순서가 있는 데이터를 저장하며 중복을 허용하고, Set은 순서가 없는 데이터를 저장하며 중복을 허용하지 않으며, Map은 Key-Value 쌍으로 데이터를 저장하며 중복된 Key값을 허용하지 않는다.