Java Collection Framework 란?

개발자·2023년 2월 16일
0
post-thumbnail

Intro

  • Java 를 접해보지 않은 사람이라도 Collection 이라는 단어를 들으면 느낌적으로 오는 어감이 있을 것입니다. 특히 미술 전시를 할 때 ‘누군가의 컬렉션’ 과 같이 ‘모음’ 또는 ‘수집’ 과 같은 늬앙스로 사용되곤 합니다. Collection Framework 가 만들어진 이유도 비슷할거라고 생각합니다.
  • 저는 Collection Framework 를 보통 알고리즘 문제를 풀거나 어떠한 데이터들을 한 곳에 모아두었다가 꺼내어 쓸 때 사용하곤 합니다. 너무 어렵게 생각하실 필요 없을 것 같습니다.

Collection Framework 란 무엇일까요?

Collection Interface? Collection Framework…?

더 정확히 표기하자면 Java Collection Framework(JCF) 라고 표기할 수 있겠네요. Back-end 개발을 하다보면 데이터를 저장해 두었다가 꺼내 쓰는 등, 특정 데이터들을 용도에 맞게 효과적으로 처리할 수 있도록 도와주는 표준화된 방법들이 담긴 클래스 정도로 이해하시면 될 것 같습니다. 다시 말해, 데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화해서 클래스로 만들어 놓은 것을 말합니다.

아래 사진은 Java Collection Framework의 상속 구조를 나타낸 이미지입니다.

출처 : https://beginnersbook.com/java-collections-tutorials/

Collection 인터페이스는 크게 List와 Queue, Set 3가지 상위 인터페이스로 분류가 됩니다. Map 의 경우에는 Value 만 가지고 있는 Collection 인터페이스와 달리 Key 까지 가지고 있으니 디자인 단계에서 따로 분류가 되었다고 Stack Overflow 에서 본 적이 있습니다.

다시 말해, Map 인터페이스는 Collection 인터페이스를 상속 받고 있지 않지만, Java Collection Framework 에는 포함되는 개념입니다. 우리가 흔히 부르는 Collection 에는 List, Queue, Set 와 Map 이 포함되었다고 생각하시면 쉽습니다.

Collection Interface 들의 특징

인터페이스구현클래스특징
SetHashSet / LinkedHashSet / SortedSet / TreeSet순서를 유지하지 않는 데이터들의 집합이며, 중복을 허용하지 않음
QueueDeque / PriorityQueue먼저 넣은 데이터를 먼저 꺼내는 데이터 집합
ListArrayList / LinkedList / Vector데이터들의 순서가 존재하며, 중복 또한 허용한다
MapHashTable / HashMap / TreeMap키(Key) 와 값(Value) 가 서로 한쌍을 이루는 데이터 집합으로, 순서는 유지하지 않으며, 키(Key) 의 중복은 허용하지 않지만, 값(Value) 의 중복은 허용하는 데이터 집합

Set 인터페이스

순서를 유지할 필요가 없고, 값들의 중복을 허용하고 싶지 않을 때 사용되는 자료구조 입니다.

  • HashSet
    • 순서를 예측할 수 없습니다.

    • 가장 빠른 임의 접근 속도를 가지고 있습니다.

    • Thread Safe 하지 않습니다.

      💡 Thread Safe 란? 스레드 안전(thread 安全, 영어: thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.
  • TreeSet
    • 정렬 방법을 지정할 수 있습니다.(default = 오름차순)
    • Thread Safe 하지 않습니다.
  • LinkedHashSet
    • 입력된 순서대로 저장합니다.
    • Thread Safe 하지 않습니다.

List 인터페이스

데이터들이 저장된 순서를 따르며, 데이터들의 중복을 허용하는 자료구조 입니다.

  • ArrayList
    • 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있기 때문에 조회하는데 있어 성능이 우수합니다.
    • 순차적으로 데이터가 추가된다는 조건하에서는 검색이 빠릅니다.
    • List 컬렉션을 여러 스레드에서 공유한다면 Thread Safe 하지 않습니다.
  • LinkedList
    • 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치 정보만 수정해주면 되기 때문에 좋은 성능을 발휘할 수 있습니다.
    • 검색 속도가 느립니다.
    • Stack, Queue, 양방향 Queue 를 만드는 용도로 주로 사용됩니다.
  • Vector
    • 과거에는 대용량 데이터 처리를 위해 사용했었지만, 내부에서 자동으로 동기화가 일어나기 때문에 비교적 성능이 좋지 못하고, 무거워 최근에는 잘 사용하지 않습니다.
    • ArrayList 와 내부 구조는 같지만, Thread Safe 합니다.

Map 인터페이스

Key(키)와 Value(값) 의 쌍으로 이루어진 자료구조입니다. 순서는 유지하지 않으며, Key(키) 의 중복은 허용하지 않지만, Value(값) 의 중복은 허용합니다.

  • HashTable
    • HashMap 보다 느립니다.
    • null 불가합니다.
    • Thread Safe 합니다.
  • HashMap
    • Key(키) 의 중복을 허용하지 않으며, 순서를 따르지 않습니다.
    • null 값이 올 수 있습니다.
    • 대체로 HashMap 객체를 생성할 때는 매개변수가 없는 생성자를 사용합니다. 하지만 HashMap 에 담을 데이터가 많은 경우에는 초기에 생성해주는 편입니다.
  • TreeMap
    • 다른 Map 들과 마찬가지로 순서를 보장하지 않습니다.
    • 하지만 Key(키) 와 Value(값) 을 저장하는 순간, Key(키) 가 정렬됩니다.
    • 기본적으로 오름차순으로 정렬되며, 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글 순으로 정렬됩니다.
    • Key(키) 의 정렬이 필요할 경우에는 HashMap 보다는 TreeMap 을 사용하길 권장합니다.

마무리

추상적으로 Java Collection 에는 Set, List, Map 등이 있지만, 각 인터페이스들이 어떠한 경우에 사용 되고, 어떤 경우에 유리한 지에 대해 정확하게 정리되어 있지 않았습니다. 보통 자료구조라 하면 ArrayList 에 데이터들을 넣고 반복문을 통해 가져다 쓰는 정도로만 생각을 했었는데, Java Collection 에 대해 정리하다보니 앞으로 개발을 하며 더 많은 활용을 할 수 있겠다 라는 생각을 했습니다.

추가적으로 배열과 컬렉션 인터페이스가 어떤 차이점을 가지고 있는지에 대해서 공부해보는 것도 좋을 것 같습니다.

profile
I DEVELOP THEREFORE, I AM 😄

0개의 댓글