프로그래밍언어/Java

Java Collection FrameWork(JCF)란?

멍토 2021. 10. 25.

왜 나오게 되었을까?

예전에는 자료구조를 이용할 때 같은 역할이나 목적이 같지만 구현체의 메서드명이 달라 여러움을 느꼈다. (Vector, Array, HashTable)

즉, 확장이 쉽지 않았으며, 표준 인터페이스를 구현하지 않다.

이러한 부분을 해결하기 위해 JCF가 나오게 되었다.

JDK 1.2 버전부터 나왔다.

 

그래서 JCF가 먼데?

다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합이다.

간단히 생각하면 자료구조 모음이라고 생각해도 될 것 같다.

 

JCF의 계층 구조

크게 Iterable을 상속한 인터페이스와 Map을 상속한 인터페이스로 나눌 수 있다.

Iterable에 포함된 인터페이스는 List, Queue, Set이다.

 

List

ArrayList : 크기가 가변적인 선형리스트이다.

배열을 사용하기 때문에 정해진 크기가 존재하며 용량을 넘으면 자동으로 용량을 증가시켜 추가한다.

LinkedList : 각 노드가 다음 노드의 위치를 가르키고 있는 자료구조이다.

Vector : JDK 1.0에서 부터 존재하는 자료구조이다. 호환성을 위해 남겨둔 레거시 자료구조이므로 사용하지 말자.

ArrayList와 비슷한 역할을 하고 있지만 동기방식으로 처리하고 있기 때문에 성능적인 문제가 발생할 수 있다. 또한 메서드에 동기화가 처리되어 있기 때문에 스레드세이프 하지도 않다.

스레드세이프한 리스트를 만들고 싶다면 Collections.synchronizedList(List)를 이용하라고 한다.

Stack : Vector를 상송하여 만든 LIFO 방식의 클래스이다. 이것 역시 호환성을 위해 남겨둔 레거시 자료구조이므로 사용하지 말자.

Stack을 사용하고 싶다면 Deque를 이용하도록 하자.

 

Queue

Priority Queue : FIFO의 순서가 아니라 우선순위에 따라 요소가 먼저 나가는 방식이다.

우선순위를 위한 대소비교가 필요하기 때문에 Comparator를 정의하거나 Comparable을 상속한 객체를 이용해야 한다.

null을 허용하지 않는다.

 

Deque

Double Ended Queue의 약자로 양쪽에 추가와 삭제가 일어날 수 있는 자료구조이다.

그렇기 때문에 Stack이나 Queue처럼 이용이 가능하다.

구현 클래스로는 LinkedList와 ArrayDeque가 있다.

ArrayDeque : ArrayList와 비슷한 특징들을 가지고 있다.

null을 저장할 수 없으며 비동기 방식이다.

원형큐 방식으로 구현되어 있다.

 

Set

중복 요소를 저장하지 않는다는 특징을 가지고 있으며 순서를 유지하지 않는다.

중복된 요소를 걸러내기 위해 equals와 HashCode를 이용한다.

HashSet : Set을 사용하기 위해 가장 흔하게 사용하는 자료구조이다.

검색속도가 빠른 장점이 있다.

HashMap을 이용하여 Set을 구현한다.

LinkedHashSet : HashSet과 원리가 같으나 순서를 유지한다는 특징이 있다.

순서를 유지해야 하기 때문에 HashSet보다 느리다.

LinkedHashMap을 이용하여 구현이 되어있다.

TreeSet : 중복 요소를 저장하지 않으며 정렬이 가능하다.

우선순위를 위한 대소비교가 필요하기 때문에 Comparator를 정의하거나 Comparable을 상속한 객체를 이용해야 한다.

 

Map

Key와 Value를 쌍으로 저장하는 자료구조이다.

Key는 중복이 될 수 없으며 Value는 중복이 가능하다.

Key를 통해 Value에 접근함으로 속도가 빠르며 데이터의 순서를 보장하지 않는다.

Key를 해시함수를 통해 인덱스를 만들고 해당 인덱스를 이용하여 value를 찾는 방식으로 value를 가져온다.

HashMap : 비동기로 동작하며 다른 Map들에 비해 성능이 좋다.

LinkedHashMap : HashMap을 상속받았다는 특징이 있으며 순서를 보장한다.

순서는 LinkedList를 이용하여 보장한다.

HashTable : 호환성을 위해 남겨둔 레거시 클래스이다. 대부분의 메서드가 동기화 처리가 되어있기 때문에 성능적인 문제가 발생할 수 있다. 왠만하면 사용하지 말자.

TreeMap : SortedMap 인터페이스를 상속받아 사용하고 있다.

Key에 따라 정렬이 되는 특징을 가지고 있다.

향상된 이진 탐색 트리인 레드블랙트리로 구현이 되어있다.

ConcurrentHashMap : 멀테스레드 환경에서 사용하기 위해 만들어진 HashMap이다.

 

왜 Map은 Collection을 상속받지 않았을까?

요소의 모호함과 구조상 맞지 않기 때문에 상속받지 않았다.

출처 : https://www.youtube.com/watch?v=SLifMOhW1VA&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=72&t=515s

댓글

💲 광고입니다.