컬렉션 프레임워크란?
자바에서 데이터를 저장, 관리, 조작하는 데 사용되는 클래스와 인터페이스의 집합.
데이터를 효율적으로 다루고, 코드의 재사용성을 높이며 프로그램의 성능을 최적화하는 데 도움을 준다.
말 그대로 대표 인터페이스가 구현 돼 있고(추상 메서드와 상수들) 그 인터페이스를 구현하는 클래스들의 집합체라고 이해하면 될 듯.
대표 인터페이스 및 클래스
1. List 인터페이스
- 순서가 있는 데이터의 집합 (원소들의 순서가 존재하기 때문에 index 관련 메서드를 사용하여 접근 가능)
- 데이터의 중복 허용 (같은 값의 원소의 공존이 허용됨)
- 대표 구현 클래스
- ArrayList
- LinkedList
- Vector
2. Set 인터페이스
- 순서가 없는 데이터의 집합 (원소들의 순서가 존재하지 않기 때문에 index 관련 메서드 사용 불가)
- 데이터의 중복 허용 X (같은 값의 원소를 추가시킬 시 한 가지만 인정됨)
- 대표 구현 클래스
- HashSet
- TreeSet
3. Map 인터페이스
- 키와 값의 쌍으로 이루어진 데이터 집합
- 순서의 유지 X (키와 값의 쌍이기에 넣는 순서와 무관)
- 대표 구현 클래스
- HashMap
- TreeMap
대표 인터페이스의 추상 메서드들이 있고(추상 메서드니까 구현부가 없음) 그 인터페이스를 구현하는 클래스들 마다 메서드의 구현부가 달라진다.
예를 들어 List 인터페이스의 LinkedList 클래스는 addFirst 메서드부가 오버로딩 돼 구현돼 있지만, ArrayList 클래스엔 addFirst 메서드가 구현부 없는 메서드(추상메서드 형태로)로 남아있다.
위의 특징으로 더 나아가 List(String) myList = new LinkedList <>(); 이와 같이 LinkedList 객체를 갖는 List 타입 변수 myList를 만들면 LinkedList 클래스에 구현 돼 있는 메서드를 사용하면서 List 인터페이스에 있는 추상 메서드를 내 방식대로 구현해 함께 사용할 수 있는 장점이 있다.
클래스별 사용 용도
List 인터페이스
1. ArrayList 클래스
- 수정 작업에 용이, index로의 직접 액세스가 가능해 해당 index 값의 수정이 빠름
- 검색 작업에 용이, index의 직접 액세스 기능으로 검색 속도가 빠름
- 추가 및 삭제가 느림 (LinkedList를 사용해야 하는 이유)
2. LinkedList 클래스
- 추가 및 삭제에 용이, LinkedList는 요소들이 노드로 연결돼 있기 때문에 중간에 요소를 추가하거나 삭제하는 게 빠름
노드(Node)의 구성 요소 :
1. 데이터 요소 : 노드가 저장하는 실제 데이터 값
2. 다음 노드에 대한 링크(참조) : 다음 노드의 위치(주소)를 저장하는 링크
(LinkedList 이름의 유래)
- 수정이 느림, 수정작업을 시행할 때 해당 요소를 처음부터 순회해야 하므로 (노드의 특징) 속도가 늦음
- 검색이 느림, 수정이 느린 이유와 같음
(ArrayList를 사용해야 하는 경우)
결국 해당 요소의 수정 작업엔 ArrayList
기존 요소의 삭제 및 타요소 추가 작업엔 LinkedList
* LinkedList도 index로 접근이 가능하다. 하지만 ArrayList는 해당 요소로 직접 액세스 되는 반면
LinkedList는 노드를 타고 액세스 되기 때문에 비교적 느리다.
Set 인터페이스
1. HashSet 클래스
- 빠른 검색 및 삽입 : 해시 테이블을 기반으로 구현되어 검색 및 요소 삽입이 빠름
해시 테이블이란?
데이터를 저장하고 검색하는 데 사용되는 자료 구조 중 하나
데이터와 데이터에 대한 키(key)를 연관시키는 방식으로 동작한다. (key - value)
데이터의 요소가 키 값이 되며 키 값 > 해시 함수 > 해시 코드 생성 > 해당 코드의 위치에 데이터 저장의 순으로 작업이 이루어진다.
(배열에서 index를 통해 해당 요소를 불러오듯 키값으로 해당 데이터를 불러오기 때문에 속도가 빠름)
- 순서가 없음 : 순서가 중요하지 않은 경우에 적합
- 중복 요소 처리 : 중복된 요소를 효율적으로 처리할 수 있다. 중복된 요소가 추가될 경우 자동으로 하나로 압축 됨
2. TreeSet 클래스
- 정렬된 요소 : 이진 검색 트리를 기반으로 구현되어 내부적으로 요소를 정렬한다.
이진 검색 트리란? (Binary Search Tree, BST)
이진 트리의 한 종류로 각 노드가 최대 두 개의 자식 노드를 갖는다.
1. 루트 노트(root node) : 트리의 최상위 노드로써, 모든 다른 노드는 이 루트 노드를 기준으로 왼쪽 서브트리와 오른쪽 서브트리로 나뉜다.
2. 왼쪽 서브트리(Left Subtree) : 루트 노드의 키보다 작은 값들을 가진 노드들로 이루어진 서브트리.
3. 오른쪽 서브트리(Right Subtree) : 루트 노드의 키보다 큰 값들을 가진 노드들로 이루어진 서브 트리.
- 범위 검색 및 순회 : TreeSet은 범위 검색(예:최솟값부터 최댓값까지) 및 순회에 특히 유용. 범위 내의 요소를 검색하거나 반복적으로 처리하기에 용이하다.
- 정렬된 순서 요구 : 요소들이 정렬된 순서로 피요한 경우 유용
HashSet은 검색 및 삽입 성능이 우수하며 순서가 중요하지 않은 경우에 적합
TreeSet은 정렬과 범위 검색이 필요한 경우 적합
Map 인터페이스
1. HashMap 클래스
- 빠른 검색 및 삽입 : HashSet과 같이 해시 함수를 사용하여 데이터 액세스가 빠르다.
- 데이터 순서에 관계없음 : 데이터의 순서와 관계없이 저장되기 때문에 순서가 중요하지 않은 경우 적합.
- 중복 키 처리 : 중복된 키를 허용하지 않기에 같은 키에 대한 새로운 값을 할당하면 이전 값이 대체됨. (해시 함수의 특징)
2. TreeMap 클래스
- 데이터 정렬 : 데이커가 키(Key)의 자연 순서 또는 지정된 비교자(Comparator)에 따라 정렬되어 저장된다.
(Map 인터페이스는 기본적으로 순서를 유지하지 않는 특징을 갖지만 TreeMap 클래스는 별개로 순서를 유지함)
- 범위 검색 : TreeMap은 데이터를 정렬하므로 범위에 따라 데이터를 검색하는 데 효율적.
- 검색 및 삽입 속도 느림 : 데이터 정렬을 위해 트리 구조가 사용되다 보니 HashMap 보다 속도가 늦다.
데이터를 정렬하여 저장하고 검색해야 하는 경우는 TreeMap
순서 중요 X 및 빠른 데이터 액세스가 필요한 경우는 HashMap
'Java > 개념 정리' 카테고리의 다른 글
연결리스트(LinkedList) (0) | 2023.10.21 |
---|---|
HashMap 이란? (0) | 2023.10.20 |
try-catch문의 변수 사용 용도 (0) | 2023.10.09 |
FileWriter와 PrintWriter의 이어 쓰기 방법 (0) | 2023.10.09 |
FileWriter와 PrintWriter의 사용 용도 차이 (0) | 2023.10.09 |