기술/Java & Spring

[JAVA] Collection Framework의 종류 및 특징

반응형

✏️개요

필자는 Java를 대학교 때 처음 배우면서 어렵다고 느껴졌던 개념들이 여러 가지 존재했는데,

그중 하나가 바로 Collection Framework다. 배우는 과정에서 컬렉션에 대해 배운 것은 ArrayList를 단순히 기존에 배웠던 배열의 한계점과 비교하며 설명한 뒤, 그것에 대한 간단한 사용방법 정도였다.

 

대학 과정 이후, 개인적으로 Java에 대해 추가적으로 학습하는 과정에서 역시 컬렉션에 대한 중요성에 대해 알지 못하였기에 적당히 넘어가는 그런 챕터였다.(?) 그러나, Java 웹 개발자로 취업하는 과정에서 컬렉션에 대한 지식은 면접 때 기본 상식으로 질문을 받게 되었고 중요성을 인지하게 되었다.

 

그러나 취업한 지 2개월 하고 10일이 지난 현재 시점까지 실무의 코드를 분석하는 과정에서 발견하는 수많은 다양한 컬렉션들을 볼 때마다, 왜 수많은 컬렉션 중 이것을 사용한 것일까?라는 생각은 멈추지 않았고 본인 또한 프로그래밍 과정에서 어떠한 상황에 어떤 컬렉션을 사용해야 하는가에 대한 판단을 쉽게 내리지 못하기에 이 글에서 컬렉션의 종류 및 특징들에 대해서 작성해 사용에 익숙해질 때까지 참고자료로서 사용하고자 한다.

 

❗ 본 게시글은 필자 개인적인 의견이므로 틀린 부분이 있을 수 있습니다. 댓글을 통해 지적해주시면 감사하겠습니다.

 

✏️Collection Framework란?

Collection Framework를 소개하고 있는 Oracle 홈페이지의 Overview페이지를 보면, 아래와 같은 문장을 발견할 수 있다.

 A collection is an object that represents a group of objects.

즉, Collection은 객체들의 집단을 대표하는 객체라는 뜻으로, 쉽게 말하면 그냥 객체를 모아놓은 자료구조이다. 그리고 이 자료구조를 조작하기 위한(삽입, 삭제, 조회 등등..) 여러 메서드들을 포함하고 있는 것을 Collection Framework라 할 수 있다. 

객체의 집합이라는 것을 보면 알 수 있는 점은, 우리가 일반적으로 사용하는 Primitive Type을 Collection에 포함시키기 위해서는 Wrapper Class를 사용하여야 한다는 것이다.

 

이 컬렉션에는 List, Set, Map 인터페이스를 구현한 다양한 클래스가 존재하고, 각각의 특징들 또한 다양하다. 그러나 이 글에서는 실무에서 자주 접했고, 범용적으로 많이 사용된다고 알려진 클래스들을 위주로 살펴보고자 한다.

인터페이스를 구현한 클래스들이라는 점에서 알 수 있듯이, 같은 인터페이스를 구현한 클래스들은 (ex. List의 ArrayList, LinkedList) 동일한 추상 메서드를 구현하고 있다. 

 

✏️List

List는 기본적으로 배열을 생각하면 편하다. 데이터 삽입 시, 순서가 존재하고 중복을 허용한다. 

 

ArrayList

  • 가장 배열과 유사하다. 다른 점은, 데이터를 저장하는 공간의 크기를 가변적으로 늘릴 수 있다.
  • index를 이용해 요소를 참조하므로, 검색 성능이 좋다.
  • 데이터의 삽입 및 삭제에 따른 기존 데이터 이동 과정이 불필요하게 많아지므로 삽입, 삭제 성능이 좋지 않다.
  • 멀티 스레드 환경을 고려하지 않아 Thread safe하지 않다.
Thread safe하지 않은 이유와 이를 해결하는 방법은 아래 블로그를 참고하자.
https://cornswrold.tistory.com/209
 

[JAVA] 동기화된 컬렉션(thread-safe collection), 병렬처리 가능한 컬렉션

동기화된 컬렉션(thread-safe한 collection), 병렬처리 컬렉션 컬렉션 프레임워크 대부분 싱글 스레드 환경에서 사용할 수 있도록 설계 Vector, Hashtable은 동기화된 (synchronized) 메소드로 구성되어 있기 때

cornswrold.tistory.com

LinkedList

  • 우리가 자료구조 시간에 배우는 그 LinkedList(Node = data filed + link filed를 활용한)이다. 
  • 데이터가 Array나 ArrayList와 같이 연속된 메모리에 저장되는 것이 아니고, index를 사용하지 않기 때문에, 특정 데이터를 검색하기 위해서는 순차적으로 검색하여 검색 성능이 좋지 않다.
  • 데이터의 삽입 및 삭제 시 각 노드의 주소 정보를 가지고 있는 link filed의 값을 변경하기만 하므로, 데이터들의 이동 연산이 없어 삽입, 삭제 성능이 좋다.

Vector

  • ArrayList와 동일한 내부 구조를 사용하며, 같은 특징을 갖는다.
  • 차이점은 동기화된(Synchronized) 메서드로 구성되어 있어 멀티스레드 환경에서 Thread safe 하다.
  • 단일 스레드 환경에서도 동기화를 하기 때문에 비효율적이며, 성능면에서도 동일한 구조를 갖는 ArrayList보다 떨어져 일반적으로 ArrayList를 많이 사용한다.
기존 코드와의 호환성 문제로 남아있는 것이라고 한다.

 

✏️Set

일반적으로 많이 접하는 List의 ArrayList와 Map의 HashMap과 달리 많이 사용해보지 않았던 컬렉션이다. Set인터페이스를 구현한 컬렉션 클래스들의 특징은 데이터 삽입 시 순서가 없고, 중복을 허용하지 않는다는 점이다.

아래의 Set 컬렉션 클래스들은 모두 Thread safe하지 않다.

 

HashSet

  • Set 컬렉션 클래스 중 가장 많이 사용된다. (Set 컬렉션 클래스 중 성능이 가장 좋다고 한다.)
  • 내부적으로 Hash Algorithm을 사용하여 데이터를 관리하기에 검색 속도 성능이 좋다. 
  • hashCode()와 equals()를 이용해 데이터의 중복을 판단한다.

TreeSet

  • 이진 검색 트리 자료구조를 사용해 데이터를 관리한다.
  • 이진 검색 트리는 정렬, 검색 , 범위 검색의 성능이 좋지만 데이터의 추가, 삭제 성능은 좋지 않다.
  • 데이터의 삽입 시 이진 검색 트리에 의한 기본적인 정렬이 제공되며, Comparator 인터페이스를 이용해 정렬 기준을 정할 수 있다.

LinkedHashSet

  • HashTable과 LinkedList를 이용해 데이터를 관리한다.
  • 가장 큰 특징은 기본적인 Set컬렉션들이 데이터의 입력 순서를 보장하지 않지만, LinkedHashSet은 데이터의 입력 순서를 보장한다. 
HashSet이 성능을 위해서 순서를 허용하지 않았다면, 순서를 보장하기 위해 성능면에서 일정 부분을 희생한 것이 LinkedHashSet.

 

✏️Map

HashMap으로 잘 알려진 Map 컬렉션 클래스들의 특징은, Key & Value 형태로 데이터들을 저장 및 참조하며, Key는 중복을 허용하지 않고 Value는 중복을 허용한다는 것이다.

 

HashMap

  • HashSet과 마찬가지로 Hash Algorithm을 사용하여, 검색 성능이 우수하다.
  • List 컬렉션 클래스의 ArrayList와 Vector의 관계 중 ArrayList의 포지션이다. 즉, 동기화를 지원하지 않아 Thread safe하지 않다.

HashTable

  • HashMap과 동일한 동작을 보장하지만, 내부적으로 동기화된(Synchronized) 메서드로 구성되어 있어 Thread safe 하다는 특징이 있다. 
  • List 컬렉션 클래스의 ArrayList와 Vector의 관계 중 Vector의 포지션이다. 
Vector와 마찬가지로 기존 코드와의 호환성을 문제로 남아있는 것이라고 한다.

TreeMap

  • TreeSet과 마찬가지로 이진 검색 트리 구조로 데이터를 저장한다. 차이점은 Map이기 때문에 Key와 Value의 형태를 따른다는 것이다.
  • 검색과 정렬의 성능이 우수하다는 특징이 있으며, 일반적으로 성능 자체는 HashMap이 더 좋기 때문에 TreeMap이 갖는 범위 검색, 정렬 등의 특징이 필요한 경우가 아니라면 HashMap을 사용하는 것이 좋다.

LinkedHashMap

  • LinkedHashSet과 비슷한 특징을 가지며 마찬가지로, 데이터의 입력 순서를 보장하기 위해서 사용된다. 
  • 차이점은 Set과 Map의 차이이다.
LinkedHashSet과 마찬가지로 데이터의 입력 순서가 보장되어야 하는 상황에서 HashMap은 요구를 만족할 수 없기에, 성능면에서 일정 부분 희생하여 순서를 보장한 것이 LinkedHashMap.

✏️마치며

여기까지 List, Set, Map 컬렉션 클래스들 중 대표적인 클래스들을 알아보았다. 자주 사용하지 않았기 때문에 관련 메서드들을 정리할까 싶기도 했지만, 이는 우리의 친구 Godgle에게 물어보면 쉽게 알 수 있기 때문에 정리하지 않았다. 

Collection Framework에 대한 레퍼런스 역시 다양한 블로그에서 볼 수 있지만, 내 블로그에 작성하는 과정에서 한 번 더 생각하게 되었고 접근 또한 쉽기 때문에 정리하기를 잘한 것 같다.

반응형