본문 바로가기
공부/자바

컬렉션 프레임워크(Collections Framework)

by xladmt 2024. 6. 10.

컬렉션 프레임워크란? 

  컬렉션은 다수의 데이터, 데이터 그룹을 의미하고, 프레임워크는 표준화된 프로그래밍 방식을 뜻한다. 컬렉션 프레임워크는 데이터 그룹을 저장하는 클래스들을 표준화한 설계를 의미한다. 쉽게 말하자면 자료 구조(Data Structure) 종류의 형태들을 자바 클래스로 구현한 모음집이라고 생각하면 된다.

 

  데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이 Java Collection Frameword(JCF)이다. 직접 자료 구조 클래스를 만들어 사용할 수도 있지만, 알고리즘의 속도와 안정성에 있어 자바 언어 개발진들이 수십년에 걸쳐 JVM(자바 가상 머신)에 최적화시켜 개량해왔기 때문에 Collection Framework를 가져와 사용하면 된다.

 

컬렉션 프레임워크 종류

 

 

컬렉션 프레임워크의 핵심 인터페이스 

인터페이스 특 징
List 순서가 있는 데이터의 집합. 데이터의 중복을 허용한다.
예) 대기자 명단
구현 클래스 : ArrayList, LinkedList, Stack, Vector 등
Set 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다.
예) 양의 정수집합, 소수의 집합
구현 클래스 : HashSet, TreeSet 등
Map 키(Key)와 값(Value)의 쌍(Pair)으로 이루어진 데이터의 집합
순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
예) 우편번호, 지역번호(전화번호)
구현 클래스 : HashMap, TreeMap, Hashtable, Properties 등

 

 

1. Collections 인터페이스

인터페이스 List와 Set의 공통된 부분을 다시 뽑아서 새로운 인터페이스인 Collection을 추가로 정의하였다. 업캐스팅으로 다양한 종류의 컬렉션 자료형을 받아 자료를 삽입하거나 삭제, 탐색 기능을 할 수 있다.(다형성)

핵심 인터페이스간의 상속 계층도

 

2. List 인터페이스

List 인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다. 배열과 마찬가지로 index로 요소에 접근한다. 리스트와 배열의 가장 큰 차이는 리스트는 자료형 크키가 고정이 아닌 데이터 양에 따라 동적으로 늘어났다 줄어들 수 있다는 점이다.(가변) 요소 사이에 빈 공간을 허용하지 않아 삽입/삭제 할 때마다 배열 이동이 일어난다.

List 인터페이스의 상속 계층도

 

클래스 특징
ArrayList 클래스


 
 
» 배열을 이용하여 만든 리스트
» 데이터의 저장순서가 유지되고 중복을 허용
»  데이터량에 따라 공간(capacity)가 자동으로 늘어나거나 줄어들음
»  단방향 포인터 구조로 자료에 대한 순차적인 접근에 강점이 있어 조회가 빠르다.
» 삽입/삭제가 느리다. 
LinkedList 클래스


» 노드(객체)를 연결하여 리스트처럼 만든 컬렉션 (배열 아님)
» 데이터 중간 삽입, 삭제가 빈번할 경우 빠른 성능을 보장
» 이동방향이 단방향이기 때문에 이전 요소에 대한 접근은 어려움.
» 더블 링크드 리스트 : 다음 요소 뿐만 아니라 이전 요소에 대한 참조가 가능하도록 함.
» 이중 원형 연결리스트 : 첫 번째 요소와 마지막 ㅇ;ㅛ소를 서로 연결시킨 것.
Vector 클래스 » ArrayList의 구형 버전 (내부 구정이 거의 비슷함)
» ArrayList와의 차이는 모든 메소드가 동기화(Synchronized) 되어 있어 Thread-Safe 하다.
» 구버전 자바와 호환성을 위해 남겨두었으며 잘 안씀

**Tip!
만약 현업에서 컬렉션에 동기화가 필요하면 Collections.synchronizedList() 메서드를 이용해 ArrayList를 동기화 처리하여 사용한다.
Stack 클래스 » 후입선출(LIFO) 자료구조 : 마지막에 들어온 원소가 먼저 나간다.
» 들어올 때는 push, 나갈 때는 pop 

 

 

* ArrayList와 LinkedList 성능비교

컬렉션 읽기(접근시간) 추가/삭제 비고
ArrayList 빠르다 느리다 순차적인 추가삭제는 더 빠름.
비효율적인 메모리 사용
LinkedList  느리다 빠르다 데이터가 많을수록 접근성이 떨어짐

 

 

 

3. Set 인터페이스

Set인터페이스는 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용된다. 

 

클래스 특징
HashSet 클래스 » 순서 X, 중복X
» 배열과 연결 노드를 결합한 자료구조 형태
» 가장 빠른 임의 검색 접근 속도를 가짐,
» 추가, 삭제, 검색, 접근성이 모두 뛰어남

LinkedHashSet 클래스 » 저장순서를 유지하는 Set 자료
» 추가된 순서 또는 가장 최근에 접근한 순서대로 접근 가능
» 만일 중복을 제거하는 동시에 순서를 유지하고 싶다면 LinkedHashSet을 사용하면 됨

TreeSet 클래스 » 순서 X, 중복 X
» 이진 검색 트리(binary search tree) 자료구조의 형태로 데이터를 저장
» 데이터를 정렬하여 저장하고 있다.
» 범위 검색, 정렬에 높은 성능을 가짐
» 하지만 데이터의 추가/삭제 시간이 오래 걸림

 

 

4. Map 인터페이스

Map인터페이스는 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용된다. 키는 중복될 수 없지만 값은 중복을 허용한다. 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.

Map 상속 계층도

 

 

인터페이스/클래스 특징
Map.Entry 인터페이스 » Map 인터페이스 안에 있는 내부 인터페이스
» Map에 저장되는 key-value 쌍의 Node 내부 클래스가 이를 구현하고 있음

HashMap 클래스


» Hashtable을 보완한 컬렉션
» 배열과 연결이 결합된 Hashing 형태로, 키(key)와 값(value)을 묶어 하나의 데이터로 저장
» 순서X, 중복X
» 키와 값으로 null 가능
» 추가, 삭제, 검색, 접근성이 모두 뛰어남.
» HashMap은 비동기로 작동하기 때문에 멀티 스레드 환경에서는 어울리지 않음
(대신, ConcurrentHasgMap 사용)
TreeMap 클래스 » 이진 검색 트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장(TreeSet과 같은 원리)
» TreeMap은 SortedMAp 인터페이스를 구현하고 있어 Key값을 기준으로 정렬되는 특징이 있음
» 정렬된 순서로 키/값 쌍을 저장하므로 빠른 검색(특히 범위)이 가능하다
» 단, 키와 값을 저장하는 동시에 정렬을 하기 때문에 저장시간이 오래 걸림
» 정렬되는 순서는 숫자 > 알파벳 대문자 > 소문자 > 한글 순이다.

HashTable 클래스 » Key를 특정 해시 함수를 통해 해싱한 후 나온 결과를 배열의 인덱스로 사용하여 value를 찾는 방식으로 동작
» HaspMap 보다는 느리지만 동기화가 기본 지원됨
» 키와 값으로 null X

Properties 클래스 » Properties(String, String) 의 형태로 저장하는 단순화된 key-value 컬렉션
» 주로 애플리케이션의 환경 설정과 관련된 속성 파일인 .properties를 설정하는데 사용

 

 

5. Queue 인터페이스

Queue 인터페이스는 선입선출(FIFO) 구조이며 처음 들어온 원소가 가장 먼저 나간다. 자바에서는 Queue는 인터페이스이고 필요에 따라 큐 컬렉션을 골라 사용할 수 있다. 

인터페이스/클래스 특징
PriorityQueue 클래스 » 우선 순위를 가지는 큐(우선순위큐) : 우선순위(priority)를 부여하여 우선 순위가 높은 순으로 정렬되고 꺼낸다.
» 수행할 작업이 여러 개 있고 시간이 제한되어 있을 때 우선순위가 높은 것부터 수행할 때 쓰인다.(네트워크 제어, 작업 스케줄링)
» 우선순위 큐에 저장할 객체는 필수적으로 Comparable 인터페이스를 구현해야한다. compareTo() 메서드로 로직에 따라 자료 객체의 우선순위를 결정하는 식으로 동작되기 때문이다.
» 저장공간으로 배열을 사용하며, 각 요소를 힙(heap) 형태로 저장한다.
» null 불가능

Deque 인터페이스 » Deque(Double-Ended Queue)는 양쪽으로 넣고 빼는 것이 가능하다.
» 스택과 큐를 하나로 합쳐놓은 것과 같으며 스택, 큐로 사용 가능하다.
» Deque의 조상은 Queue이며, 구현체로 ArrayDeque와 LinkedList 등이 있다.

 

 

 

Comparator와 Comparable

  • Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의
  • Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들
  • 주로 Integer와 같은 wrapper 클래스와 String, Date, File 과 같은 것들임.
  • 기본적으로 오름차순, 즉 작은 값에서부터 큰 값의 순으로 정렬되도록 구현되어 있음.
Comparable   기본 정렬기준을 구현하는데 사용
Comparator    기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

 

코드로 이해하기

public interface Comparator {
    int compare(Object o1, Object o2);
    boolean equals(Object obj);
}

public interface Comparable {
    public int compareTo(Object o);    // 주어진 객체(o)를 자신(this)과 비교
}

compare()와 compareTo()는 선언 형태와 이름이 약간 다를 뿐 두 객체를 비교한다는 같은 기능을 목적으로 고안된 것이다. compareTo()의 반환값은 int이지만 실제로는 비교하는 두 개체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야 한다. 이와 마찬가지로 compare()도 객체를 비교해서 음수, 0, 양수 중의 하나를 반환하도록 구현해야한다.

 

 

 

[참고]

▶ Java의 정석11장 (남궁성 저)

▶ https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC#hashtable_%ED%81%B4%EB%9E%98%EC%8A%A4

▶ https://www.google.com/url?sa=i&url=https%3A%2F%2Fkevinntech.tistory.com%2F16&psig=AOvVaw0XfhbEnwtIQ3pZga3jmBmg&ust=1718090550233000&source=images&cd=vfe&opi=89978449&ved=0CAQQjB1qFwoTCJDigJzA0IYDFQAAAAAdAAAAABAK

'공부 > 자바' 카테고리의 다른 글

열거형(Enum)  (0) 2024.07.03
제네릭스(Generics)  (0) 2024.06.12
예외 처리(Exception handling)  (0) 2024.06.04
내부 클래스(inner class)  (0) 2024.06.01
인터페이스(interface)  (0) 2024.05.31