Java collection과 관련된 이름들이 아주 많고, 따라서 어떻게 표현하는지에 따라 가리키는 값이 달라진다.
저번 포스팅에 이어, 오늘은 Collections에 대해 집중적으로 파고 넘어가고자 한다.
: 데이터의 집합이나 그룹
: 인터페이스
(java.util.Collection 프레임워크)
Collection '프레임워크' 내에 있는 Collection '인터페이스'
여러 요소들을 담기 위해 만들어졌기 때문에, Container 객체라고도 불림
Set, List, Queue 인터페이스가 하위 인터페이스로서 있음
ArrayList : Collection 인터페이스 → List 인터페이스 → ArrayList 클래스로 구현을 하는 것!: utility 클래스
(java.util.Collections 클래스)
Collection과 Collections는 뒤의 s자 하나로 칭하는 것이 다르다.
오늘은 3번, Collections 클래스에 대해 Collection과 비교하며 확실히 알아보자.
Collection은, 지난 포스팅에서 알아봤듯 인터페이스이며, Iterable을 상속받는다.

💡 Iterable?
JCF에서 봤던 구조 그림을 떠올리면 된다. Collection 인터페이스의 상위에 있던 인터페이스이다.
: Object를 상속받는 클래스이다.


위의 그림을 보면 두 가지 이름이 가리키는 대상이 확실히 다름을 알 수 있다. 이에 조금 보충설명을 하면 다음과 같다.
Collection(인터페이스) : Set, List, Queue 등의 인터페이스의 상위(부모) 인터페이스
Collections(클래스) : Collection을 이용하기 위한 클래스
이렇게 Collection 인터페이스와 연관하여 Collections라는 클래스가 하는 역할에 대해 알았으니, Collections의 구체적인 기능들에 대해 알아보자.
Collection 인터페이스를 구현한 클래스에 대한 객체 생성, 정렬, 병합, 검색 등의 기능을 안정적으로 수행하도록 도와주는 utility 클래스이다.
Generic 기술을 사용하여 작성되었으며, 정적 메소드의 형태로 되어있다.
💡 Generic?
: 데이터타입을 일반화(generalize)한다는 의미클래스나 메소드에서 사용할 내부 데이터타입을 컴파일 시 미리 지정하는 방법이다.
이렇게 컴파일시 미리 타입 검사(type check)를 하면 다음과 같은 장점이 있다.
- 클래스나 메소드 내부에서 사용되는 객체 안정성을 높임
- 반환값에 대한 타입변환 및 타입 검사에 들어가는 과정 감소
자주 사용되는 알고리즘
주요 method
max : 지정된 컬렉션에서 최대 요소를 반환
min : 지정된 컬렉션에서 최대 요소를 반환
sort : 지정된 컬렉션 정렬
shuffle : 지정된 컬렉션의 요소들의 순서를 무작위로 섞기
synchronizedCollection : 지정된 컬렉션에 의해 지원되는 동기화 된 컬렉션을 재생성해 반환
binarySearch : 지정된 컬렉션에서 이진 탐색 알고리즘을 사용해 지정된 객체를 검색해 인덱스를 반환
disjoint : 2개의 지정된 컬렉션들에서 공통된 요소가 하나도 없는 경우 true 를 반환
copy : 지정된 컬렉션의 모든 요소를 새로운 컬렉션으로 복사해 반환
reverse : 지정된 컬렉션에 있는 순서를 역으로 변경
💡 주의!
리스트가 비어있을 경우 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
정적(static) 메소드
List 인터페이스를 구현하는 컬렉션에 대하여 정렬을 수행함
속도가 비교적 빠르고, 안정성이 보장되는 합병 정렬 (Merge sort) 이용
💡 안전성?
동일한 값을 가지는 원소를 다시 정렬하지 않는 성질
같은 리스트를 반복하여 다른 기준에 따라 정렬할 때 중요하다.
ex) 상품 주문 리스트를 날짜를 기준으로 먼저 정렬하고 이후 주문처를 기준으로 정렬
즉, 한번 정렬된 것이 유지됨 = 안정성 있는 정렬
정렬은 Comparable 인터페이스를 이용하여 이루어짐
List 인터페이스 : Comparable 인터페이스를 상속 → Collections.sort() 이용 가능: Java에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은, 모두 Comparable 인터페이스를 구현하고 있음
Wrapper 클래스의 인스턴스들 : Byte, Short, Character, Integer, Float, Double, Boolean, Long 등 👉🏻 정렬 가능 ( ↔ Boolean : 정렬 불가능)
String, Time, Date 등의 클래스의 인스턴스들 👉🏻 정렬 가능
기본 정렬 순서 : 오름차순
compareTo() 메소드 : 매체 변수 객체를 현재의 객체와 비교하여 작으면 음수, 같으면 0, 크면 양수 반환
💡 (번외) Comparator
: Comparable 인터페이스와 같이 객체를 정렬하는 데에 사용되는 인터페이스
- 기본은 오름차순 정렬이지만 다른 기준 정렬 가능
👉🏻 내림차순, 다른 기준으로 정렬하고 싶을 때 사용 가능- compare() 메소드를 재정의하여 사용!
리스트에 존재하는 정렬을 파괴
정렬과는 반대 동작 수행
정렬된 리스트에서 지정된 원소를 이진탐색함
💡 주의! '정렬된 리스트'에 한해서만 탐색을 진행한다는 점!
반환값 = 양수이면 찾고자 하는 원소의 인덱스값을 출력
반환값 = 음수 : 탐색이 실패하여 원소를 찾지 못했음을 의미
💡주의! 내림차순 정렬이 아니라, 현재 순서를 거꾸로 뒤집는 것!
Collection하고 Collections하고 헷갈렸는데 덕분에 잘 알아갑니다 :)