본문 바로가기
Language/Java

[Java API] java.util.Collections 메서드

by 클레어몬트 2024. 10. 27.

https://claremont.tistory.com/entry/Java-API-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%ACCollection-Framework

 

[Java API] 컬렉션 프레임워크(Collection Framework)

https://claremont.tistory.com/category/Computer%20Science/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0 'Computer Science/자료구조' 카테고리의 글 목록전자정보통신공학, 컴퓨터공학 전공claremont.tistory.comhttps://claremont.tistory.com/cat

claremont.tistory.com

 

Collection 이 아닌 Collections 를 통해 다양한 유틸리티 메서드들을 이용할 수 있다.

Java의 Collection인터페이스이다. List, Set, Queue와 같은 컬렉션 타입의 부모 인터페이스로, 컬렉션의 기본적인 동작(추가, 삭제, 포함 여부 확인 등)을 정의한다. 반면에, Collections유틸리티 클래스이다. java.util.Collections 클래스는 Collection 인터페이스를 구현한 컬렉션 객체들을 쉽게 다룰 수 있는 static 메서드들을 제공한다. 예를 들어, 정렬, 검색, 최댓값/최솟값 찾기, 스레드-안전한 컬렉션 생성 등의 작업을 수행할 수 있다.

 

 

 

[Collections 메서드]

- max() : 정렬 기준으로 최대값을 찾아서 반환

- min() : 정렬 기준으로 최소값을 찾아서 반환

- shuffle() : 컬렉션을 랜덤하게 섞는다

 

- sort() : 정렬 기준으로 컬렉션을 정렬

- binarySearch() : 이진 탐색을 통해 특정 요소의 위치를 찾는다 (반드시 사용 전에 정렬이 선행되어야 한다)

- reverse() : 정렬 기준의 반대로 컬렉션을 정렬

 

- synchronizedList() : 일반 리스트를 멀티 스레드 상황에서 동기화 문제가 발생하지 않는 안전한 리스트로 전환

package collection.utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CollectionsMain {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(4);

        System.out.println("list = " + list);
        Integer max = Collections.max(list);
        System.out.println("max = " + max);
        Integer min = Collections.min(list);
        System.out.println("min = " + min);
        Collections.shuffle(list);
        System.out.println("shuffle list = " + list);
        System.out.println();

        Collections.sort(list); // list.sort()를 더 추천!
        System.out.println("sort list = " + list);
        System.out.println("5의 Idx = " + Collections.binarySearch(list, 5));
        Collections.reverse(list);
        System.out.println("reverse list = " + list);
        System.out.println("5의 Idx = " + Collections.binarySearch(list, 5, Comparator.reverseOrder()));
        System.out.println();

        System.out.println("list class = " + list.getClass());
        // 일반 리스트를 멀티 스레드 상황에서 동기화 문제가 발생하지 않는 안전한 리스트로 변경
        List<Integer> synchronizedList = Collections.synchronizedList(list);
        System.out.println("synchronizedList class = " + synchronizedList.getClass());
        // 동기화 작업으로 인해 성능은 더 느리다
    }
}

 

 

 

편리한 불변 컬렉션 생성: List.of() / Set.of() / Map.of()

package collection.utils;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class OfMain {
    public static void main(String[] args) {
        // 편리한 불변 컬렉션 생성
        List<Integer> list = List.of(1, 2, 3);
        Set<Integer> set = Set.of(1, 2, 3);
        Map<Integer, String> map = Map.of(1, "one", 2, "two");

        // list.add(4); 불변이라 안된다
        // java.lang.UnsupportedOperationException 예외 발생

        System.out.println("list = " + list);
        System.out.println("set = " + set);
        System.out.println("map = " + map);
        System.out.println("list class = " + list.getClass());

    }
}

 

 

불변 리스트를 가변 리스트 전환: new ArrayList() 사용

+ 불변 리스트로 다시 전환: Collections.unmodifiableList() 사용

package collection.utils;

import java.util.*;

public class ImmutableMain {
    public static void main(String[] args) {
        // 불변 리스트 생성
        List<Integer> list = List.of(1, 2, 3);

        // 가변 리스트 전환: new ArrayList() 사용
        ArrayList<Integer> mutableList = new ArrayList<>(list);
        mutableList.add(4); // 가능
        System.out.println("mutableList = " + mutableList);
        System.out.println("mutableList class = " + mutableList.getClass());

        // 불변 리스트로 다시 전환: Collections.unmodifiableList() 사용
        List<Integer> unmodifiableList = Collections.unmodifiableList(mutableList);
        System.out.println("unmodifiableList class = " + unmodifiableList.getClass());

        // unmodifiableList.add(5); 불변이라 안된다
        // java.lang.UnsupportedOperationException 예외 발생
    }
}

당연히 Set이나 Map에도 모두 동일하게 적용 가능하다

 

 

빈 리스트 생성

package collection.utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class EmptyListMain {
    public static void main(String[] args) {
        // 빈 가변 리스트 생성
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new LinkedList<>();

        // 빈 불변 리스트 생성
        List<Integer> list3 = Collections.emptyList(); // Java 5 (비추천)
        List<Integer> list4 = List.of(); // Java 9 (추천)

        System.out.println("list3 = " + list3.getClass());
        System.out.println("list4 = " + list4.getClass());
    }
}

빈 불변 리스트 생성은 일관성을 고려하여 List.of를 추천한다 (Java 9 이상이라면)