본문 바로가기

Language/Java

[Java] Collection 과 Collections

Java에서 Collection과 Collections는 매우 유사한 이름을 가지고 있어 헷갈리기 쉽다. 하지만 두 개념은 서로 다른 역할을 하며, 이를 정확히 이해하는 것이 중요하다. 이번 글에서 Collection과 Collections의 차이를 살펴보자.


Collection이란?

Collection은 Java 컬렉션 프레임워크의 최상위 인터페이스로, 여러 개의 객체를 담을 수 있는 컨테이너 역할을 한다. Collection 인터페이스를 직접 구현하는 경우는 거의 없으며, 주로 이를 상속한 하위 인터페이스(List, Set, Queue 등)를 사용한다.

Collection 인터페이스의 주요 메서드

public interface Collection<E> extends Iterable<E> {
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    boolean add(E e);
    boolean remove(Object o);
    Iterator<E> iterator();
    void clear();
    Object[] toArray();
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    boolean retainAll(Collection<?> c);
    // ...
}

위 인터페이스를 보면 size(), isEmpty(), add(), remove(), contains() 등 기본적인 컬렉션 조작 메서드가 정의되어 있다.

Collection을 구현하는 주요 인터페이스

Collection 인터페이스를 구현하는 주요 인터페이스는 다음과 같다.

  • List<E>: 순서가 있는 요소의 집합 (ex: ArrayList, LinkedList)
  • Set<E>: 중복을 허용하지 않는 요소의 집합 (ex: HashSet, TreeSet)
  • Queue<E>: FIFO(First-In-First-Out) 방식의 요소 관리 (ex: LinkedList, PriorityQueue)

Collection 에는 Map이 포함되지 않는 이유!

Map은 Collection 인터페이스를 상속하지 않으며, 별도의 인터페이스로 존재한다. 그 이유는 Collection이 단일 요소(Element)를 저장하고 조작하는 구조를 기반으로 설계된 반면, Map은 Key-Value 쌍을 저장하는 구조이기 때문이다.

즉, Collection은 데이터를 단순 리스트 형태로 저장하는 반면, Map은 키를 기반으로 값을 조회하는 기능을 제공하므로, 컬렉션 프레임워크 내에서 다른 계층으로 분류된다.


Collections란?

Collections는 컬렉션을 조작하기 위한 유틸리티 클래스이다. java.util.Collections에 포함되어 있으며, 컬렉션을 정렬하거나, 검색하거나, 동기화하는 등의 기능을 제공한다.

Collections 클래스의 주요 메서드

메서드 설명
sort(List<T>) 리스트를 오름차순으로 정렬
reverse(List<T>) 리스트의 순서를 반대로 변경
shuffle(List<T>) 리스트의 요소들을 랜덤하게 섞음
binarySearch(List<T>, T key) 이진 탐색을 수행하여 특정 요소의 인덱스를 찾음
max(Collection<T>) 가장 큰 요소 반환
min(Collection<T>) 가장 작은 요소 반환
emptyList() 빈 List 생성
singletonList(T o) singleton 객체 생성

예제: Collections 클래스 활용

import java.util.*;

public class CollectionsExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>(Arrays.asList(5, 3, 9, 1, 7));
        
        Collections.sort(numbers); // 오름차순 정렬
        System.out.println("정렬된 리스트: " + numbers);
        
        Collections.reverse(numbers); // 리스트 뒤집기
        System.out.println("반대로 정렬된 리스트: " + numbers);
        
        Collections.shuffle(numbers); // 리스트 무작위 섞기
        System.out.println("셔플된 리스트: " + numbers);
        
        int maxNumber = Collections.max(numbers);
        int minNumber = Collections.min(numbers);
        System.out.println("최대값: " + maxNumber + ", 최소값: " + minNumber);
    }
}

 

Collections에는 Map을 조작하는 메서드도 포함되는 이유!

Collections 클래스는 Collection 인터페이스뿐만 아니라 Map을 다루는 유틸리티 메서드도 제공한다. 이는 Java 컬렉션 프레임워크에서 Map 역시 중요한 자료구조이며, 효율적인 조작이 필요하기 때문이다.

메서드 설명
synchronizedMap(Map<K, V>) 동기화된 Map을 반환
unmodifiableMap(Map<K, V>) 변경할 수 없는 읽기 전용 Map을 반환
singletonMap(K key, V value) 단 하나의 키-값 쌍을 가진 Map 생성
emptyMap() 빈 Map을 반환

예제: Collections의 Map 관련 메서드 활용

import java.util.*;

public class CollectionsMapExample {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        scores.put("Alice", 90);
        scores.put("Bob", 85);
        
        Map<String, Integer> unmodifiableScores = Collections.unmodifiableMap(scores);
        System.out.println("읽기 전용 Map: " + unmodifiableScores);
        
        Map<String, Integer> synchronizedScores = Collections.synchronizedMap(scores);
        System.out.println("동기화된 Map: " + synchronizedScores);
    }
}

Collection vs Collections 차이점 비교

  Collection  Collections
유형 인터페이스 유틸리티 클래스
역할 컬렉션을 나타내는 구조 컬렉션을 조작하는 메서드 제공
상속 여부 List, Set, Queue 등이 상속 단순한 정적 메서드 모음
예제 클래스 ArrayList, HashSet, LinkedList 등 Collections.sort(), Collections.shuffle() 등

Collection과 Collections 

  • Collection은 데이터를 담는 컨테이너(인터페이스)
  • Collections는 컬렉션을 조작하는 도구(유틸리티 클래스)

예를 들어, List<Integer> list = new ArrayList<>();는 Collection을 구현한 ArrayList를 사용하는 것이고,
Collections.sort(list);는 Collections 클래스의 정적 메서드를 사용하는 것이다.

 

'Language > Java' 카테고리의 다른 글

Java 런타임 데이터 영역  (0) 2024.10.08
Java Annotation  (0) 2024.10.01
Java native 키워드로 Rust코드와 연동하기  (2) 2024.09.19
Java Modifier(제어자)  (1) 2024.09.17
Java Reflection(3)  (1) 2024.09.15