[Java] Collections 클래스

DEINGVELOP·2022년 8월 13일
1

Java & OOP

목록 보기
5/5

Java collection과 관련된 이름들이 아주 많고, 따라서 어떻게 표현하는지에 따라 가리키는 값이 달라진다.

저번 포스팅에 이어, 오늘은 Collections에 대해 집중적으로 파고 넘어가고자 한다.


collection vs Collection vs Collections

  • collection

    : 데이터의 집합이나 그룹

    • 객체가 저장되고 반복되는 자료구조

  • Collection

    : 인터페이스
    (java.util.Collection 프레임워크)

    • Collection '프레임워크' 내에 있는 Collection '인터페이스'

    • 여러 요소들을 담기 위해 만들어졌기 때문에, Container 객체라고도 불림

    • Set, List, Queue 인터페이스가 하위 인터페이스로서 있음

      • ex) ArrayList : Collection 인터페이스 → List 인터페이스 → ArrayList 클래스로 구현을 하는 것!

  • Collections           << 🚩 Today!

    : utility 클래스
    (java.util.Collections 클래스)



CollectionCollections는 뒤의 s자 하나로 칭하는 것이 다르다.

오늘은 3번, Collections 클래스에 대해 Collection과 비교하며 확실히 알아보자.



Collection

Collection은, 지난 포스팅에서 알아봤듯 인터페이스이며, Iterable을 상속받는다.

💡 Iterable?
JCF에서 봤던 구조 그림을 떠올리면 된다. Collection 인터페이스의 상위에 있던 인터페이스이다.


Collections

: Object를 상속받는 클래스이다.


Collection vs Collections

위의 그림을 보면 두 가지 이름이 가리키는 대상이 확실히 다름을 알 수 있다. 이에 조금 보충설명을 하면 다음과 같다.

  • Collection(인터페이스) : Set, List, Queue 등의 인터페이스의 상위(부모) 인터페이스

  • Collections(클래스) : Collection을 이용하기 위한 클래스

    • Collection과 관련된 메소드들을 모아놓은 클래스

이렇게 Collection 인터페이스와 연관하여 Collections라는 클래스가 하는 역할에 대해 알았으니, Collections의 구체적인 기능들에 대해 알아보자.



Collections 클래스

  • Collection 인터페이스를 구현한 클래스에 대한 객체 생성, 정렬, 병합, 검색 등의 기능을 안정적으로 수행하도록 도와주는 utility 클래스이다.

  • Generic 기술을 사용하여 작성되었으며, 정적 메소드의 형태로 되어있다.

    💡 Generic?
    : 데이터타입을 일반화(generalize)한다는 의미

    클래스나 메소드에서 사용할 내부 데이터타입을 컴파일 시 미리 지정하는 방법이다.
    이렇게 컴파일시 미리 타입 검사(type check)를 하면 다음과 같은 장점이 있다.

    • 클래스나 메소드 내부에서 사용되는 객체 안정성을 높임
    • 반환값에 대한 타입변환 및 타입 검사에 들어가는 과정 감소
  • 자주 사용되는 알고리즘

    • 정렬 (Sortiing)
    • 섞기 (Shuffling)
    • 탐색 (Searching)

  • 주요 method

    • max : 지정된 컬렉션에서 최대 요소를 반환

    • min : 지정된 컬렉션에서 최대 요소를 반환

    • sort : 지정된 컬렉션 정렬

    • shuffle : 지정된 컬렉션의 요소들의 순서를 무작위로 섞기

    • synchronizedCollection : 지정된 컬렉션에 의해 지원되는 동기화 된 컬렉션을 재생성해 반환

    • binarySearch : 지정된 컬렉션에서 이진 탐색 알고리즘을 사용해 지정된 객체를 검색해 인덱스를 반환

    • disjoint : 2개의 지정된 컬렉션들에서 공통된 요소가 하나도 없는 경우 true 를 반환

    • copy : 지정된 컬렉션의 모든 요소를 새로운 컬렉션으로 복사해 반환

    • reverse : 지정된 컬렉션에 있는 순서를 역으로 변경



Collections.max() / min()

💡 주의!
리스트가 비어있을 경우 NoSuchElementException이 발생함
👉🏻 리스트가 비어있을 경우에 대한 기본값 처리 필수

List<Integer> numbers = List.of(4, 0, 5, 2, 7, 1, 8, 6, 9, 3);
int max = numbers.isEmpty() ? -1 : Collections.max(numbers);
System.out.println("Max: " + max); // Max: 9

Collections.sort()

  • 정적(static) 메소드

  • List 인터페이스를 구현하는 컬렉션에 대하여 정렬을 수행함

  • 속도가 비교적 빠르고, 안정성이 보장되는 합병 정렬 (Merge sort) 이용

    💡 안전성?
    동일한 값을 가지는 원소를 다시 정렬하지 않는 성질
    같은 리스트를 반복하여 다른 기준에 따라 정렬할 때 중요하다.
    ex) 상품 주문 리스트를 날짜를 기준으로 먼저 정렬하고 이후 주문처를 기준으로 정렬
    즉, 한번 정렬된 것이 유지됨 = 안정성 있는 정렬

  • 정렬은 Comparable 인터페이스를 이용하여 이루어짐

    • List 인터페이스 : Comparable 인터페이스를 상속 → Collections.sort() 이용 가능

📌참고) Comparable 인터페이스란?

: Java에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은, 모두 Comparable 인터페이스를 구현하고 있음

  • Wrapper 클래스의 인스턴스들 : Byte, Short, Character, Integer, Float, Double, Boolean, Long 등 👉🏻 정렬 가능 ( ↔ Boolean : 정렬 불가능)

  • String, Time, Date 등의 클래스의 인스턴스들 👉🏻 정렬 가능

  • 기본 정렬 순서 : 오름차순

  • compareTo() 메소드 : 매체 변수 객체를 현재의 객체와 비교하여 작으면 음수, 같으면 0, 크면 양수 반환

💡 (번외) Comparator
: Comparable 인터페이스와 같이 객체를 정렬하는 데에 사용되는 인터페이스

  • 기본은 오름차순 정렬이지만 다른 기준 정렬 가능
    👉🏻 내림차순, 다른 기준으로 정렬하고 싶을 때 사용 가능
  • compare() 메소드를 재정의하여 사용!



Collections.shuffle()

  • 리스트에 존재하는 정렬을 파괴

  • 정렬과는 반대 동작 수행



Collections.binarySearch()

  • 정렬된 리스트에서 지정된 원소를 이진탐색함

    💡 주의! '정렬된 리스트'에 한해서만 탐색을 진행한다는 점!

  • 반환값 = 양수이면 찾고자 하는 원소의 인덱스값을 출력

  • 반환값 = 음수 : 탐색이 실패하여 원소를 찾지 못했음을 의미

    • 그러나, 현재 데이터가 삽입될 수 있는 위치 정보를 알려줌
    • 해당 데이터를 삽입할 수 있는 위치 : (-반환값-1)



Collections.reverse()

  • 리스트의 원소들을 역순으로 바꿈

💡주의! 내림차순 정렬이 아니라, 현재 순서거꾸로 뒤집는 것!

1개의 댓글

comment-user-thumbnail
2024년 1월 7일

Collection하고 Collections하고 헷갈렸는데 덕분에 잘 알아갑니다 :)

답글 달기