본문 바로가기
10분 테코톡 정리

JCF(Java Collection Framework)

by 에드박 2021. 9. 13.

JCF란? 

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

즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것

Collection = 데이터의 집합이나 그룹.

 

프레임워크와 라이브러리

프레임워크 : 전체적인 흐름을 스스로 가지고 있음 -> 사용자가 필요한 코드를 주입

라이브러리 : 사용자가 전체적인 흐름을 만듬

 

JCF 도입 배경

JCF가 도입 전 데이터를 그룹핑 하는 방법은?

-> Array, Vector, HashTable

 

Collection의 사용 목적이 같더라도 각각의 Collection에서 사용하는 문법이 다릅니다.

-> 공통 인터페이스를 만들어서 문법을 통일 시킬 필요성을 느껴 JCF가 탄생

 

JCF 계층 구조

Iterable 인터페이스

Map 인터페이스

 

 

List

순서가 있는 데이터의 집합으로 데이터의 중복을 허용

List 인터페이스의 구현 클래스는 ArrayList, LinkedList, Vector, Stack 이 있습니다.

 

ArrayList

크기가 가변적인 선형 리스트로 저장 용량이라는 것이 존재합니다.

저장 용량을 넘어서면 자동으로 증가시켜 요소를 추가할 수 있도록 합니다.

아무런 설정을 하지 않는다면 Default 용량으로 10을 가집니다.

 

용량을 증가시킬 때는 기존의 용량 + 기존용량/2 만큼 증가시킵니다.

(이 때 elementData를 용량을 증가시킨 배열에 copy 시킴)

ex. 10 -> 15 -> 22 -> 33 -> 49 -> 73 -> ...

 

LinkedList

각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 자료 구조입니다.

데이터를 담고 있는 노드들이 연결되어 있고, 노드의 포인터가 이전 노드와 다음 노드와의 연결을 담당

노드만 연결하면 되기 때문에 저장 용량이 존재하지 않습니다.

 

Vector

JDK 1.0 부터 있었던 자료 구조, 호환성을 위해 남겨 놓은 레거시 클래스.

Vector는 ArrayList와 기능상 거의 동일하지만, 한 가지 다른 점이 존재합니다.

-> ArrayList는 비동기 방식이고, Vector는 동기 방식이라는 것

 

ArrayList는 멀티 스레드 환경에서는 사용하면 안되고 Vector를 써야하는가?

동기 방식 -> 요청을 보낸 후, 응답을 받아야 다음 과정이 동작하는 방식

비동기 방식 -> 요청을 보낸 후, 응답과는 상관 없이 다음 과정이 동작하는 방식. 

스레드 안전(Thread safe) -> 멀티 스레드 환경에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻합니다.

 

비동기 방식 -> Thread safe 하지않다.

동기 방식 -> Thread safe 하다.

 

ArrayList는 Collections.synchronizedList() 를 사용해서 동기 방식의 리스트를 만들 수 있습니다.

 

Stack

Vector 를 상속하여 사용하는 LIFO 방식의 클래스

Java 진영에서는 Stack 대신 Deque를 사용하여 구현할 것을 권장합니다.

Deque<Integer> stack = new ArrayDeque<>();

 

 

Queue

FIFO 구조를 가진 자료 구조

주로 LinkedList를 이용하여 구현할 수 있습니다.

Queue를 상속받은 구현제로 Deque와 PriorityQueue가 있습니다.

 

Priority Queue

Queue 인터페이스의 상속을 받으면서 FIFO가 아닌,

특정 우선순위에 따라 요소가 먼저 나가는 방식

 

우선순위는 Comparator를 통해 정의해 주거나, Comparable 인터페이스를 상속한 객체를 이용해야 합니다.

 

null 요소는 허용하지 않습니다.

 

Deque

Deque는 인터페이스입니다.

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

사용 방식에 따라 Stack이 될 수도 있고 Queue가 될 수도 있다.

 

Deque의 구현체로 ArrayDeque와 LinkedList가 있습니다.

 

ArrayDeque

  • 사이즈 제한이 없는 가변 배열
  • null 요소는 저장할 수 없습니다.
  • 비동기 방식
  • 원형 큐 방식으로 구현
  • Stack 목적으로 구현하였을 때 기존의 Stack보다 빠르고, Queue 목적으로 구현하였을 때 LinkedList보다 빠릅니다.

Set

중복된 요소를 저장하지 않고, 요소의 저장 순서를 유지하지 않는 특징을 가집니다.

 

Set의 구현체로 HashSet, LinkedHashSet, TreeSet 이 있습니다.

 

Set이 중복된 요소를 걸러내는 방법은?

-> equals()와 hashCode()를 사용

  1. 객체를 저장하기 전에 해시 코드를 호출해서 해시 코드를 얻어냄
  2. Set에 저장되어 있는 요소들의 해시 코드와 비교합니다.
  3. 만약 같은 해시코드가 있다면 equals() 메소드로 두 객체를 비교합니다.
  4. equals() 메소드가 true가 나오면 중복으로 판단해 저장을 하지 않습니다.

 

HashSet

Set을 이용하기 위해 가장 많이 사용하는 구현 클래스입니다.

HashSet은 해시 알고리즘을 사용하여 검색 속도가 빠르다는 장점이 있습니다.

 

HashSet의 인스턴스는 HashMap의 인스턴스를 통해 생성합니다.

 

LinkedHashSet

HashSet과 원리는 같으나, 입력된 순서를 저장한다는 특징이 있습니다.

HashSet의 상속을 받으며, LinkedHashMap을 통해 구현되어 있습니다.

 

TreeSet

특정 기준에 따라 요소를 정렬할 수 있습니다.

생성자의 파라미터에 Comparator를 구현해서 정렬을 정의할 수 있습니다.

 

Map

key와 value를 쌍으로 저장하는 자료 구조.

Key는 중복 될 수 없습니다.

Value는 중복을 허용합니다.

 

Key를 통해 Value에 바로 접근이 가능하므로 탐색이 빠릅니다.

 

데이터의 순서를 보장하지 않습니다.

 

맵의 구현클래스

  • HashTable
  • LinkedHashMap
  • HashMap
  • TreeMap

HashTable

Map 인터페이스의 구현 클래스이며, 자바 초기 버전에 나온 레거시 클래스입니다.

Vector처럼 동기화처리 되어있다는 특징이 있습니다.

 

HashTable의 동작 원리

해시 테이블은 key를 특정 해시 함수를 통해 해싱한 후 나온 결과를 배열의 인덱스로 사용하는 Value를 찾는 방식으로 동작합니다.

 

해시 함수 : Key를 해시값으로 바꾸기 위한 함수

 

HashMap

Map 인터페이스의 구현체입니다. HashTable을 보완하였습니다.

HashMap은 비동기로 동작하며 HashTable보다 싱글 스레드 환경에서 성능이 좋습니다.

 

멀티 쓰레드 환경에서는 ConcurrentHashMap을 사용합니다.

 

LinkedHashMap

Map 인터페이스의 구현 클래스인 동시에 HashMap을 상속받았습니다. 데이터의 순서를 보장한다는 특징이 있습니다.

 

데이터의 순서를 보장하는 LinkedList의 구조를 이용해서 데이터의 순서를 보장해줍니다.

 

LinkedList 처럼 Head와 Tail에 대한 Entry를 가지고 있습니다.

 

TreeMap

Map 인터페이스의 구현 클래스이며, Key를 기준으로 원하는 방식으로 정렬을 할 수 있다는 특징이 있습니다.

 

이때, TreeMap은 향상된 이진 탐색 트리인 레드 블랙 트리로 구현 되어있습니다.

 

왜 Map은  Collection 인터페이스에 상속을 받지 않았는가?

Map의 요소는 무엇이 있을까요?

-> Key, Value, Entry

 

Collections.remove(Entry)는 항상 Entry만 지운다. Key를 통해 Value를 지울 수 없다. 

 

Map이라는 자료구조의 요소가 주는 모호함과 구조상 맞지 않는 부분때문에 Collection 인터페이스를 상속받지 않았습니다.

 

비슷한 맥락으로 Iterator()는 iterate할 대상이 Key인가, Value인가, Entry인가?

-> Iterable 인터페이스도 상속받지 않았습니다.

 

참고자료

- [10분 테코톡] 제이온의 JCF 

- [10분 테코톡] 로운의 JCF

 

'10분 테코톡 정리' 카테고리의 다른 글

리눅스의 메모리 관리  (0) 2021.09.19
DTO와 VO 둘 의 사실과 오해 (그리고 Entity)  (1) 2021.01.28
Index  (0) 2021.01.28

댓글