티스토리 뷰

JAVA

[JAVA] 자바 컬렉션(Collection) - List, Map, Set

까리한 새우 2024. 3. 16. 17:38

자바 컬렉션에서는 List, Map, Set 인터페이스를 기준으로 여러 구현체가 존재합니다.

이 외에도 추가로 Stack과 Queue 인터페이스도 존재합니다.

Stack과 Queue에 관해서는 따로 포스팅을 진행하겠습니다.

 

이번 글에서는 컬렉션이 무엇인지, 컬렉션 프레임워크와 주요 인터페이스들에 대해 알아보도록 하겠습니다.


자바 컬렉션이란?

 

Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며 JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공합니다.

 

그렇다면, 컬렉션 프레임워크(collection Framework)란 무엇일까요?

컬렉션 프레임워크는 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다.

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

 

데이터를 담고 처리하는 방법에는 배열(Array)이 있는데, 왜 굳이 컬렉션(Collection)을 사용할까?

우선 배열과의 차이점은 정적 메모리 할당이 아닌 동적 메모리 할당을 하게 됩니다.

배열은 new int[3]를 하면 3개의 공간밖에 쓰지 못하고 미리 선언을 통해 3개의 공간을 만들어야 하지만(정적메모리 할당), 컬렉션은 공간이 계속 필요한 만큼 추가할 수 있기 때문입니다.(동적 메모리 할당) 

또한, 이는 프로그램의 공간적인 효율성 또한 높여줍니다.

 

다음 그림은 Java 컬렉션 프레임워크의 상속구조를 나타냅니다.

 

Collection 인터페이스는 List, Set, Map 으로 크게 3가지 상위 인터페이스로 분류할 수 있습니다.

그리고 여기서 Map의 경우엔 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류 됩니다.

 

 

Collection 인터페이스의 특징

 

우선 Collection 인터페이스를 간단하게 살펴보고 하나하나 정리해봅시다.

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

 

 

Set 인터페이스

Set 컬렉션순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않습니다. (객체 중복 저장 X)

그렇기에 Set 컬렉션은 순서가 없으므로 인덱스로 객체를 검색해서 가져오는 get(index)메서드도 존재하지 않습니다.

대신 전체 객체을 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공합니다.

반복자는 iterator() 메서드를 호출하면 얻을 수 있습니다.

 

  • HashSet
    1. 가장 빠른 임의 접근 속도
    2. 순서를 예측할 수 없다.
  • TreeSet
    1. 정렬 방법을 지정할 수 있음 (기본은 오름차순 정렬이다.)
  • LinkedHashSet
    1. 입력된 순서대로 저장한다.

Set 컬렉션을 구현하는 대표적인 클래스들은 HashSet과 TreeSet, LinkedHashSet 이 있습니다.

이 3가지 클래스는 Set 인터페이스를 같이 상속하고 있으므로 공통적으로 사용할 수 있는 메서드들이 존재합니다.

다음은 기본적인 Set의 메서드들입니다.

메서드 설명
boolean add(E e) 주어진 객체를 저장 후 성공적이면 true, 중복 객체면 false를 리턴합니다.
boolean contains(Object o) 주어진 객체가 저장되어있는지 여부를 리턴합니다.
Iterator<E> iterator() 저장된 객체를 한번씩 가져오는 반복자를 리턴합니다.
isEmpty() 컬렉션이 비어있는지 조사합니다.
int Size() 저장되어 있는 전체 객체수를 리턴합니다.
void clear() 저장된 모든 객체를 삭제합니다.
boolean remove(Object o) 주어진 객체를 삭제합니다

 

 

 

List 인터페이스

List 컬렉션순서가 있는 데이터의 집합으로 데이터의 중복을 허용합니다.

List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있습니다.

객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공합니다. (인덱스에는 데이터가 저장되어 있는 참조 값을 가지고 있습니다.)

List 컬렉션은 객체 자체를 저장하는 것이 아닌 위 그림과 같이 객체의 주소(번지)값을 저장(참조)합니다.

List 컬렉션은 동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지가 참조됩니다.

null도 저장이 가능한데, 이 경우 해당 인덱스는 객체를 참조하지 않습니다.

 

  • LinkedList
    1. 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용하다.
    2. 스택(Stack), 큐(Queue), 양방향 큐 등을 만들기 위한 용도로 쓰인다.
    3. 검색이 느리다.
  • Vector
    1. 과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화 처리가 일어나 비교적 성능이 좋지 않고 무거워서 잘 사용되지 않는다.
  • ArrayList
    1. 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어나다.
    2. 검색이 빠르고, 순차적으로 데이터가 추가된다면 빠르다.
    3. List들의 중간중간 데이터에 빈번한 추가와 삭제가 일어난다면 느리다.

List 컬렉션을 구현하는 대표적인 클래스들은 LinkedList, Vector, ArrayList가 있으며, 공통적으로 사용할 수 있는 메서드들이 있습니다. 다음 아래 표는 기본적인 List의 메서드들입니다.

메서드 설명
boolean add(E e) 주어진 객체를 맨 끝에 추가합니다.
void add(int index, E element) 주어진 인덱스에 객체를 추가합니다.
set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿉니다.
boolean contains(Object o) 주어진 객체가 있는지에 대한 여부를 검색하여 리턴합니다.
E get(int index) 주어진 인덱스에 저장된 객체를 리턴합니다.
isEmpty() 컬렉션이 비어있는지 여부를 확인합니다.
int size() 저장되어 있는 전체 객체 수를 리턴합니다.
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제합니다.
void clear() 컬렉션에 저장된 모든 객체를 삭제합니다.
boolean remove(Object o) 주어진 객체를 삭제합니다.

 

 

Map 인터페이스

Map 컬렉션키(Key)와 값(Value)으로 구성된 객체를 저장하는 구조를 가지고 있는 자료구조입니다.

키는 중복으로 저장 할 수 없고, 값은 중복으로 저장할 수 있으며 중복된 key 값이 들어온다면 기존의 값은 없어지고 새로운 값으로 대체됩니다.

  • Hashtable
    1. HashMap보다는 느리지만 동기화를 지원한다.
    2. null 값이 불가하다.
  • HashMap
    1. 중복과 순서가 허용되지 않으며, null 값이 올 수 있다.
  • TreeMap
    1. 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠르다.
    2. 키와 값을 저장하는 동시에 키를 정렬한다.
    3. 기본 정렬은 오름차순으로 정렬되며, 정렬 순서는 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글 순이다.
    4. 정렬을 해야 할 필요가 있다면 HashMap 보다는 TreeMap을 사용하는 것이 더 유리하다.

기본적인 Map의 메서드는 다음과 같습니다.

메소드 설명
V put(K key, V value) 주어진 키와 값을 추가하여 저장되면 값을 리턴합니다.
boolean containsKey(Object Key) 주어진 키가 있는지 확인합니다.
boolean containsValue(Object value) 주어진 값이 있는지 확인합니다.
Set<Map.Entry<K,V>> entrySet() 모든 Map.Entry 객체를 Set에 담아 리턴합니다.
Set<K> ketSet() 모든 키를 Set 객체에 담아서 리턴합니다.
V get(Object key) 주어진 키에 있는 값을 리턴합니다.
boolean isEmpty() 컬렉션이 비어있는지 조사합니다.
int Size() 저장되어 있는 전체 객체의 수를 리턴합니다.
Collection<V> values() 저장된 모든 값을 Collection에 담아서 리턴합니다.
void clear() 저장된 모든 Map.Entry를 삭제합니다.
V remove(Object Key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다.

 


 

참고(출처)

https://gangnam-americano.tistory.com/41

https://woo0doo.tistory.com/14

https://coding-factory.tistory.com/550

https://choicode.tistory.com/25