본문 바로가기
JAVA

JAVA / 컬렉션 프레임워크(JCF)와 동기화(SynChronization)

by LWM 2020. 4. 10.
반응형

*동기화

 

컬렉션 프레임워크에 대해 공부하기에 앞서 동기화가 컬렉션과 밀접한 관계에 있기에 동기화를 간단히 짚고 본론으로 들어가보자.

 

동기화란 작업들 사이의 수행시기를 맞추는 것을 말한다. 자바에서 List, Set 그리고 Map과 같은 컬렉션의 구현 클래스를 사용할 때 바로 이 동기화가 중요한 이슈가 될 수 있는데, 동기화가 제공되는 것이 무조건적으로 좋은 것이 아니라 실행 속도 측면에서 성능의 차이가 있기 때문에 상황에 따라서 적절하게 사용하는 것이 좋다.

 

 

 

*자바 컬렉션 프레임워크(JCF)

 

자바에서 컬렉션이란 여러 원소들을 담을 수 있는 자료구조, 즉 데이터의 집합 및 그룹을 의미하며

JCF는 이러한 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.

 

자바에서의 자료구조 유형은 다음과 같다.

  • 순서가 있는 목록인 List형
  • 순서가 중요하지 않은 목록인 Set형
  • 먼저 들어온 것이 먼저 나가는 Queue형
  • Key-Value의 형태로 저장되는 Map형

JCF 상속구조

 

위 이미지는 JCF 상속구조로서 각각의 인터페이스에는 여러가지의 컬렉션이 존재한다. 워낙 내용이 방대하다보니 중요한 부분만 추려 각각의 인터페이스와 그에 해당하는 구현클래스들의 특징이 무엇이있는지 아래에서 살펴보자. 

 

 

▶각각의 컬렉션 특징

Interface 구현클래스 특징
Set HashSet
TreeSet
순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.
List LinkedList
Vector
ArrayList
순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
Queue LinkedList
PriorityQueue
List와 유사
Map Hashtable
HashMap
TreeMap
Key = value의 쌍으로 이루어진 데이터의 집합으로, 순서는 유지되지 않으며 키의 중복을 허용하지 않으나 값의 중복은 허용한다.

 

1. Set(집합)

 

Set은 순서를 유지하지 않는 데이터들의 집합이며, List와는 다르게 요소들의 중복을 허용하지 않는다. 대표적인 구현클래스로는 HashSet과 TreeSet이 있다.

 

  • HashSet

     - 가장 빠른 임의 접근 속도
     - 순서를 예측할 수 없음
     - ArrayList와 마찬가지로 동기화를 제공하지 않음
     - 추가되는 요소들의 순서 보장하지 않음

 

  • TreeSet

    -정렬방법을 지정할 수 있음

 

 

2. List

 

List는 자체적으로 순서가 있는 구성이며 List에 추가되는 요소의 중복을 허용한다. 대표적인 구현클래스로는 LinkedList와 Vector, ArrayList가 있다.

 

  • LinkedList

    - 데이터의 노드가 연계되어 순서대로 늘어져 있는 구조
    - 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
    - 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임
    - 크기가 한정되어 있지않음
    - 리스트 내에서 자료의 이동이 필요하지 않음
    - 사용 후 기억 장소의 재사용이 가능함
    - 연속적인 기억 장소의 할당이 필요하지 않음
    - 포인터의 사용으로 인해 저장 공간의 낭비가 있음
    - 특정 자료의 탐색 시간이 많이 소요됨
    - 연산에 있어서 ArrayList와 다르게 연산속도가 자료양에 영향을 받지않음
    - 알고리즘이 복잡함 

 

  • Vector

    - 인덱스를 가짐
    - 특정 위치에 접근 가능
    - 데이터의 추가가 이루어질때 내부적으로 임시배열을 생성하여 복사하는 방법을 사용
    - 내부에서 자동으로 동기화처리가 발생해 비교적 성능이 좋지 않고 무거워서 잘 쓰이지 않음
    - 대량의 요소를 추가하는 연산 수행시 성능저하
    - 동시접근을 막으며 쓰레드가 동시에 접근하는 데이터 묶음을 임계구역(critical)으로 만듬
    - 채팅에 적합

 

  • ArrayList

    - 가변적이나 원래 크기는 한정되어있고 연산을통해 크기를 늘림
    - 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남
    - 동기화 제공하지 않음(동기화를 할 순 있음)
    - 데이터의 추가가 이루어질때 내부적으로 임시배열을 생성하여 복사하는 방법을 사용
    - 대량의 요소를 추가하는 연산 수행시 성능저하

 

 

 

3. Queue

 

Queue는 순서가 있는 자료구조이며, 먼저 집어넣은 데이터가 먼저나오는 FIFO구조를 가지고 있다. Queue는 put과 get을 이용하여 구현되는데 put은 큐에 자료를 넣는것을, get은 큐에서 자료를 꺼내는 것을 의미한다. 큐는 동시에 데이터가 들어올때 덮어쓰기하지않고 차례로 처리하며, 또한 큐가 꽉차서 더이상 자료를 넣을 수 없는 경우를 오버플로우(Overflow)라고 하고, 큐가 비어 있어 자료를 꺼낼 수 없는 경우를 언더플로우(Underflow)라고 한다. 대표적인 구현클래스로는 LinkedList와 PriorityQueue가 있다.

 

  • PriorityQueue(우선순위 큐)

    - FIFO특징을 가지고있지 않고 들어간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나옴

 

 

 

4. Map

 

Map은 Key와 Value의 쌍으로 이루어진 데이터 집합이며, 순서는 유지되지 않고 Key의 중복을 허용하지 않으나 Value의 중복은 허용하는 특징을 가지고 있다. 대표적인 구현클래스로는 Hashtable과 HashMap, TreeMap이 있다.

 

  • Hashtable

    - HashMap보다는 느리지만 동기화 제공
    - null 불가

 

  • HashMap

    - 동기화 미제공
    - 중복을 허용하지 않고 순서도 보장하지 않음
    - Key 또는 Value의 값으로 null을 허용함
    - Hashtable보다 빠름

 

  • TreeMap

    - 중복을 허용하지 않음
    - 내부적으로 SortedMap을 구현하고 있어 Key값들에 대해서 정렬이 이루어짐
    - 정렬된 순서대로 Key와 Value를 저장하여 검색이 빠름
    - 값을 추가할땐 상대적으로 시간이 더 소요됨
반응형

'JAVA' 카테고리의 다른 글

JAVA / 다형성(polymorphism)  (0) 2020.04.24
JAVA / 제어자  (0) 2020.04.22
JAVA / package와 import  (0) 2020.04.06
JAVA / 오버라이딩(Overriding)  (0) 2020.04.06
JAVA / 상속  (0) 2020.04.03