-
[Java] 자바 컬렉션 프레임워크(Java Collections Framework)Java 2021. 11. 7. 03:36728x90
개요
다양한 알고리즘 문제를 접하게 되면서 문제를 이해하고 쉽게 푸는 측면에서와 시간 복잡도 측면에서 어떤 자료구조를 사용하는 것이 효율적인지 고민하게 되어서 JCF(java collections framework)에 대해 찾아보게 되었습니다.
Java Collections Framework(JCF)란 무엇일까?
배열을 사용하다가 보면 크기가 고정적이어서 메모리가 낭비되거나 크기를 넘어서게 될 때 데이터를 저장할 수 없어서 비효율적인 문제가 발생하는데 이를 해결하기 위해 자료구조를 바탕으로 객체나 데이터들을 효율적으로 관리(추가, 삭제, 검색, 저장)할 수 있는 자료구조를 만들어 놓았으며 이 라이브러리를 컬렉션 프레임워크라고 합니다.
자바에서의 자료구조 유형
- 순서가 있는 목록인 List
- 순서가 중요하지 않은 목록인 Set
- 먼저 들어온 것이 먼저 나가는 Queue
- key-value의 형태로 저장되는 Map형
Java Collections Frameworks 상속 구조
이제 상속 구조에 따라 좀 더 세부적으로 알아보도록 하겠습니다.
List 인터페이스
순서가 있는 데이터의 집합으로 데이터의 중복을 허용합니다.
ArrayList
단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어납니다.(random access)
index 중간에 값을 추가하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 뒤로 밀려나서 데이터가 늘어날 경우에 악영향을 미침 중간에 데이터를 insert 해야 할 경우가 많다면 ArrayList보다는 LinkedList 활용하면 좋습니다.
thread-safe 보장 안 함
LinkedList
양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치 정보만 수정하면 되기에 유용합니다.
하지만 인덱스가 없기에 특정 요소에 접근하기 위해서는 순차 탐색이 필요하여 탐색 속도가 떨어집니다.
thread-safe 보장 안 함
Vector
ArrayList와 동일한 내부구조를 가지며 차이점은 멀티 스레드가 동시에 이 메서드를 실행할 수 없어서 멀티 스레드 환경에서 안전하게 객체를 추가하고 삭제할 수 있습니다.
스레드가 1개일 때도 항상 동기화하기 때문에 ArrayList보다 성능이 떨어집니다.
thread-safe 보장
Queue/Deque 인터페이스
선입선출 구조로 데이터를 넣은 순서대로 나오는 구조입니다.
Queue는 한 방향으로만 삽입 삭제가 가능하고 Deque는 양방향에서 접근이 가능합니다.
PriorityQueue
우선순위 큐로 우선순위가 높은 데이터가 먼저 나오는 원리입니다.
최댓값과 최솟값을 꺼내 놓을 때 매우 유용하게 사용될 수 있습니다.
LinkedList
일반적인 Queue 또는 Deque를 LinkedList로 생성하여 쓸 수 있습니다.
양방향 혹은 단방향으로 삽입 삭제가 가능하고 Rardom access가 불가능합니다.
Set 인터페이스
중복되는 데이터를 넣지 못한다는 특징을 가집니다.
HashSet
입력 순서를 보장하지 않고 순서도 보장하지 않습니다.
빠르게 중복되는 값인지만 찾으면 될 때 사용합니다.
삽입, 삭제, 색인이 매우 빠른 컬렉션입니다.
LinkedHashSet
중복은 허용하지 않으면서 순서를 보장받고 싶은 경우에 사용합니다.
TreeSet
가중치에 따른 순서대로 정렬된다. 중복은 허용하지 않으면서 특정 규칙에 의해 정렬된 형태의 집합을 쓰고 싶을 때 사용합니다.
다음은 간략하게 어떤 상황에서 어떤 자료구조를 쓰는지에 대한 그림입니다.
Map의 경우는 다루지 않았는데 맨 처음 질문에서 갈리게 됩니다.
간단하게 Map에 대해 말하자면 "키와 값이 쌍으로 이루어진 자료구조"를 의미합니다.
출처
https://coding-factory.tistory.com/550
https://gangnam-americano.tistory.com/41
https://coding-factory.tistory.com/551
https://coding-factory.tistory.com/552?category=758267
https://coding-factory.tistory.com/553?category=758267
https://st-lab.tistory.com/142
'Java' 카테고리의 다른 글
[Java ] String, Stringbuffer, Stringbuilder의 차이 및 장단점(+속도 비교) (0) 2021.11.09 [Java] 공식문서 보는 법 (0) 2021.11.07 [Java] Scanner 와 BufferedReader의 차이점 (0) 2021.11.05 [Java] equals 와 ==의 차이점 (0) 2021.11.03 [Java] 자바의 Hello World (0) 2021.10.29