프로그래밍 언어/Java + Kotlin

[Java] Collection과 Collections의 차이

2023. 3. 16. 23:07
목차
  1. 1. Collection 인터페이스
  2. 2. Collections 클래스
  3. 3. 정리
  4. 4. 참고

1. Collection 인터페이스

https://facingissuesonit.com/2019/10/15/java-collection-framework-hierarchy/

Collection에 앞서 컬렉션 프레임워크(collection framework)에 대한 이해가 필요하다. 컬렉션 프레임워크란 다수의 객체(컬렉션)를 다루기 위해 자바에서 제공하는 표준화된 프로그래밍 방식이다. 컬렉션 프레임워크에서는 데이터를 저장하는 자료구조에 따라 List, Set, Map 등의 다양한 인터페이스를 정의하고 있다.

 

Collection은 컬렉션을 다루기 위한 최상위 인터페이스로서 java.util에 정의되어 있다. List, Queue, Set 등이 Collection을 상속하는 반면, Map은 Key, Value라는 별도의 구조를 취하므로 Collection을 상속받지 않는다. 단순하게 생각해서 컬렉션 타입이 여러 개 있고, 이것들이 Collection이라는 인터페이스를 구현함으로써 사용자는 일관된 방식으로 컬렉션을 이용할 수 있다고 생각하면 된다.

public interface Collection<E> extends Iterable<E> {

    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator<E> iterator();

    boolean add(E e);

    boolean remove(Object o);

    // ...생략
}

 

 

2. Collections 클래스

Collections은 컬렉션에 대한 여러 연산을 지원하는 유틸성 클래스로서 java.util에 정의되어 있다. 이는 Collection과 다르게 인터페이스가 아니라 구체 클래스이며, 모든 메서드가 static으로 구현되어 있다. sort나 search 등의 유용한 연산 외에도 빈 컬렉션을 반환하는 메서드도 제공하므로 컬렉션 프레임워크를 사용할 땐 이를 적절히 활용하는 것이 좋다.

public class Collections {
    
    public static <T>
    int binarySearch(List<? extends Comparable<? super T>> list, T key) {
        // ...
    }
    
    public static <T extends Comparable<? super T>> void sort(List<T> list) {
        // ...
    }
    
    public static void reverse(List<?> list) {
        // ...
    }
    
    public static final <T> List<T> emptyList() {
        // ...
    }

    public static final <K,V> Map<K,V> emptyMap() {
        return (Map<K,V>) EMPTY_MAP;
    }
    
    // ... 생략
}

 

 

3. 정리

사실 Collections에서 제공하는 연산은 Collection 인터페이스에 static 메서드로 정의해도 될텐데 왜 별도의 클래스로 분리한 것일까? 이는 Collections 클래스가 인터페이스에 static 메서드가 추가된 Java 8 이전부터 존재했기 때문이다. Java 8 이전의 표준 라이브러리에서는 인터페이스와 관련된 정적 메서드들을 동반 클래스(companion class)에서 제공했으며, Collections가 바로 Collection의 동반 클래스에 해당한다.

 

 

4. 참고

  • https://www.geeksforgeeks.org/collection-vs-collections-in-java-with-example/
  • http://happinessoncode.com/2017/04/19/java8-changes-in-interface/
저작자표시 비영리 (새창열림)

'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글

[Kotlin] 특정 프로퍼티 Json 직렬화/역직렬화 시 제외시키기  (0) 2023.11.09
[Java] 제네릭 타입 소거(Generic Type Erasure)에 대해 알아보자  (0) 2023.08.02
[Java] 생성자 총정리  (0) 2023.01.06
[Kotlin] 코틀린에서 애너테이션 사용하기 (vs 자바)  (0) 2022.12.19
[Java] JVM을 통해 알아보는 자바 프로그램 실행방식  (0) 2022.12.15
  1. 1. Collection 인터페이스
  2. 2. Collections 클래스
  3. 3. 정리
  4. 4. 참고
'프로그래밍 언어/Java + Kotlin' 카테고리의 다른 글
  • [Kotlin] 특정 프로퍼티 Json 직렬화/역직렬화 시 제외시키기
  • [Java] 제네릭 타입 소거(Generic Type Erasure)에 대해 알아보자
  • [Java] 생성자 총정리
  • [Kotlin] 코틀린에서 애너테이션 사용하기 (vs 자바)
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • 장고
  • 그래프
  • 백준
  • dp
  • fastapi
  • 깊이 우선 탐색
  • 파이썬
  • http
  • 브루트포스
  • mysql
  • Git
  • atdd
  • Shortest Path
  • 그래프 탐색
  • BOJ

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[Java] Collection과 Collections의 차이
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.