Back-End/Java

[ JAVA ] Collection

oahee 2023. 8. 17. 00:14

[ JCF ]

  • Java Collection Framework
  • Collection - 데이터의 집합
  • Framework - 표준화 체계(틀, 체제, 뼈대, 개발환경)
  • Collection Framework - 다수의 데이터 집합을 관리(저장, 검색, 수정, 삭제 등)하는 표준화된 체계

 

[ 컬렉션 클래스 ]

  • collection class
  • 컬렉션 프레임워크에 속하는 인터페이스를 구현한 클래스

 

▶ 컬렉션 인터페이스 특징

 

인터페이스 특징 구현 클래스
List<E> 순서 O, 중복허용 O ArrayList, Vector, LinkedList, Stack, Queue
Set<E> 순서 X, 중복허용 X HashSet, TreeSet
Map<K,V> 순서 X, 중복허용 ( key - X ,  value - O ) HashMap, TreeMap, Hashtable, Properties

 

▬ List <E>

  • 순서 O, 중복허용 O
  • ArrayList, LinkedList, Vector, Stack 순서로 가장 많이 사용됨
  • ArrayList, Vector는 거의 동일하나, ArrayList는 Thread에 안전하지 않고, Vector는 Thread에 안전함

          (Thread에 안전하지 않다는 것은 여러 명이 동시에 접근하여 값을 변경할 때 문제가 생긴다는 것임)

 

  • ArrayList

- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어나다.
- 검색이 빠르다. 순차적으로 데이터가 추가된다면 빠르다.
- 하지만 List들의 중간중간 데이터에 빈번한 추가 삭제가 일어난다면 느리다.
- List 컬렉션을 여러 스레드에서 공유해야 한다면 Thread safe 하지 않다.

 

  • LinkedList

- 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 좋은 성능을 발휘한다.
- 하지만 검색이 느리다.

- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임

 

- 단방향 환형 LinkedList : 앞의 노드의 주소를 뒤의 노드가 가지고 있는 LinkedList
- 양방향(double) 환형 LinkedList : 한 노드가 앞의 노드와 뒤의 노드의 주소를 가지고 있는 LinkedList
- 환형 LinkedList : 제일 뒤의 노드가 제일 앞의 노드의 주소를 가지는 경우

 

  • Vector

- 과거에 대용량 처리를 위해 사용했고, 내부에서 자동으로 동기화 처리가 일어나 비교적 성능이 좋지 않고 무거워 최근에는 잘 쓰이지 않는다
- ArrayList와 내부 구조는 동일하지만 Thread safe 하다.

 

  • Stack

- LIFO 구조 ( Last In First Out )
      ────────────┐
 →                         C  B  A  │
      ────────────┘

 → push()
 ← pop() peek()
    empty()
 index search()

- 스택 활용 : 웹브라우저 뒤로/앞으로

 

 

▬ Queue <E>

 

 [ 큐(Queue) ] 
 1. FIFO (First In First Out)
     ────────────
→              C  B  A                →  
     ────────────
 queue :  offer() poll(), peek()
 stack : push() pop(), peek()

 

  • PriorityQueue

- 우선순위가 높은 것부터 꺼내오는 큐

- 내부구조가 힙으로 구성되어 있기에 시간 복잡도는 O(NLogN)임

 

 


 [ 데큐(Dque) ]
 1. Double Queue
      ────────────
→                                           →  
                  C  B  A   

←                                           ← 
      ────────────

 

 

▬ Set <E>

  • 순서 X, 중복허용 X
  • 순서를 유지하되 중복허용이 되지 않는 클래스 → LinkedHashSet
  • HashSet

- 가장 빠른 임의 접근 속도
- 순서를 예측할 수 없다.
- Thread safe 하지 않다.

 

  • TreeSet

- 정렬방법을 지정할 수 있다. (기본은 오름차순 정렬)
- Thread safe 하지 않다.

 

  • LinkedHashSet

- 입력된 순서대로 저장한다.
- Thread safe 하지 않다.

 

 

▬ Map <K, V>

  • 순서 X, 중복허용 ( key - X ,  value - O )
  • Key와 Value로 이루어진 데이터 집합
  • Hashtable

- HashMap보다는 느리지만 동기화 지원
- null불가
- Thread safe 하다.

 

  • HashMap

- 중복과 순서가 허용되지 않으며 null값이 올 수 있다.
- 대부분 HashMap 객체를 생성할 때에는 매개 변수가 없는 생성자를 사용한다. 하지만 HashMap에 담을 데이터의 개수가 많은 경우에는 초기 크기를 지정해주는 것을 권장한다.

 

  • TreeMap

키와 값을 저장하는 동시에 키를 정렬한다.
- 키(key)가 정렬되어 저장되기 때문에 검색 시 빠르다.
- 오름차순으로 정렬되며, 정렬되는 순서는 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글 순이다.
- 정렬을 해야 할 필요가 있다면 HashMap 보다는 TreeMap을 사용하는 것이 더 유리하다.

 

 

 

 

 

 

▶ 컬렉션클래스 주요 메서드

메서드 설명
boolean add(E e) 해당 컬렉션(collection)에 전달된 요소를 추가함. (선택적 기능)
void clear() 해당 컬렉션의 모든 요소를 제거함. (선택적 기능)
boolean contains(Object o) 해당 컬렉션이 전달된 객체를 포함하고 있는지를 확인함.
boolean equals(Object o) 해당 컬렉션과 전달된 객체가 같은지를 확인함.
boolean isEmpty() 해당 컬렉션이 비어있는지를 확인함.
Iterator<E> iterator() 해당 컬렉션의 반복자(iterator)를 반환함.
boolean remove(Object o) 해당 컬렉션에서 전달된 객체를 제거함. (선택적 기능)
int size() 해당 컬렉션의 요소의 총 개수를 반환함.
Object[] toArray() 해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환함.

 

'Back-End > Java' 카테고리의 다른 글

[ JAVA ] java.time  (0) 2023.08.15
[ JAVA ] Date, Calendar  (0) 2023.08.15
[ JAVA ] Date to Calendar / Calendar to Date  (0) 2023.08.13
[ JAVA ] 클래스간의 관계 1) has-a, DI(Dependency Injection)  (0) 2023.08.02
[ JAVA ] 메서드(함수)  (0) 2023.07.23