Collections의 메서드

정순동·2023년 12월 28일
0

자바기초

목록 보기
66/89

Arrays가 배열과 관련된 메서드를 제공하는 것처럼, Collections는 컬렉션과 관련된 메서드를 제공한다. fill(), copy(), sort(), binarySearch() 등의 메서드는 두 클래스에 모두 포함돼 있으며 같은 기능을한다.

동기화

컬렉션의 동기화

멀티 쓰레드(multi-thread) 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 무결성(integrity)을 유지하기 위해서는 공유되는 객체에 동기화(synchronization)가 필요하다.

Vector, Hashtable과 같은 클래스들은 자체적으로 동기화 처리가 돼 있는데, 멀티쓰레드 프로그래밍이 아닌 경우에는 불필요한 기능이 되어 성능을 떨어뜨리는 요인으로 작용하기에 ArrayList, HashMap과 같은 컬렉션은 자체적으로 동기화처리하지 않고 필요한 경우에만 java.util.Collections클래스의 동기화 메서드를 이용해서 동기화 처리가 가능하도록 변경됐다.

Collections에는 다으뫄 같은 동기화 메서드를 제공한다.

    static Collection synchronizedCollection(Collection c)
    static List	      synchronizedList(List list)
    static Set        synchronizedSet(Set s)
    static Map		  synchronizedMap(Map m)
    static SortedSet  synchronizedSortedSet(SortedSet s)
    static SortedMap  synchronizedSortedMap(SortedMap m)

아래와 같이 사용하면 된다.

	List syncList = Collections.synchronizedList(new ArrayList(...));

멀티쓰레딩과 동기화에 대한 내용은 쓰레드 관련 글을 참조하길 바란다.

변경불가, 싱글톤

변경불가 컬렉션 만들기

컬렉션에 저장된 데이터를 보호하기 위해서 컬렉션을 변경할 수 없게 만들어야 할 때가 있다. 주로 멀티 쓰레드 프로그래밍에서 여러 쓰레드가 하나의 컬렉션을 공유하다보면 데이터가 손상될 수 있는데, 이를 방지하려면 아래의 메서드들을 이용하자.

	static Collection   ummodifiableCollection(Collection c)
    static List 	    ummodifiableList(List list)
    static Set		    ummodifiableSet(Set set)
    static Map		    ummodifiableMap(Map map)
    static NavigableSet ummodifiableNavigableSet(NavigableSet set)
    static SortedSet	ummodifiableSortedSet(SortedSet s)
    static NavigableMap ummodifiableNavigableMap(NavigableMap map)
    static SortedMap	ummodifiableSortedMap(SortedMap m)

싱글톤 컬렉션 만들기

단 하나의 객체만을 저장하는 컬렉션을 만들어야 하는 경우가 있다. 이럴 때는 아래의 메서드를 사용하면 된다.

	static List singletonList(Object o)
    static Set  singleton(Object o)	// singletonSet이 아니다!
    static Map  singleton(Object key, Object value)

매개변수로 저장할 요소를 지정하면, 해당 요소를 저장하는 컬렉션을 반환한다. 그리고 반환된 컬렉션은 변경할 수 없다.

단일 컬렉션

한 종류의 객체만 저장하는 컬렉션 만들기

컬렉션은 모든 종류의 객체를 저장할 수 있는데 대부분의 경우에는 한 종류의 객체를 저장한다. 컬렉션에 지정된 종류의 객체만을 저장하는 메서드가 있다.

	static Collection   checkedCollection(Collection c, Class type)
    static List			checkedList(List list, Class type)
    static Set			checkedSet(Set set, Class type)
    static Map			checkedMap(Map map, Class type)
    static Queue		checkedQueue(Queue queue, Class type)
    static NavigableSet checkedNavigableSet(NavigableSet set, Class type)
    static SortedSet	checkedSortedSet(SortedSet set, Class type)
	static NavigableMap	checkedNavigableMap(NavigableMap m, Class keyType, class valueType)
    static SortedMap	checkedSortedMap(SortedMap m, Class keyType, Class valueType)

아래와 같이 두 번째 매개변수에 저장할 객체의 클래스를 지정하면 된다.

	List list = new ArrayList();
    List checkedList = checkedList(list, Sring.class);	// String만 저장가능
    checkedList.add("abc");			// OK
    checkedList.add(new Integer(3))	// 에러. classCastException발생

컬렉션에 저장할 요소의 타입을 제한하는 것은 제네릭(generics)로 간단히 처리할 수 있지만 이런 메서드들을 제공하는데는 호환성 때문이다. JDK5 이전 버전에는 제네릭이 없었기 때문이다.

Collections 예제

import java.util.*;
import static java.util.Collections.*;
/**import static을 사용해서 Collections클래스의 모든 static멤버를 사용할 수 있음.
 *  따라서 Collections.methodName() 형식으로 사용하지 않아도 됨.
*/
public class CollectionExample {
    public static void main(String[] args) {
        List list = new ArrayList();
        System.out.println(list);

        addAll(list, 1,2,3,4,5);
        System.out.println(list);

        rotate(list, 2);    // 오른쪽으로 두 칸씩 이동
        System.out.println(list);

        swap(list, 0, 2);   // 첫 번째와 세 번쨰를 swap함(교환)
        System.out.println(list);

        shuffle(list);  // 저장된 요소의 위치를 임의로 변경
        System.out.println(list);

        sort(list, reverseOrder()); // 역순 정렬 reverse(list); 와 동일
        System.out.println(list);

        sort(list); // 정렬
        System.out.println(list);

        int index = binarySearch(list, 3);  // 3이 저장된 위치(index)를 반환
        System.out.println("index of 3 = " + index);

        System.out.println("max = " + max(list));
        System.out.println("min = " + min(list));
        System.out.println("min = " + max(list, reverseOrder()));

        fill(list, 9);  // list를 9로 채운다.
        System.out.println("list = " + list);

        // list와 같은 크기의 새로운 list를 생성하고 2로 채운다. 단, 결과는 변경불가
        List newList = nCopies(list.size(), 2);
        System.out.println("newList = " + newList);

        System.out.println(disjoint(list, newList));    // 공통 요소가 없으면 true

        copy(list, newList);
        System.out.println("newList = " + newList);
        System.out.println("list = " + list);
        replaceAll(list, 2, 1);
        System.out.println("list = " + list);

        Enumeration e = enumeration(list);
        ArrayList list2 = list(e);

        System.out.println("list2 = " + list2);
    }
}

0개의 댓글