Collection Framework

데이터 군을 저장하는 클래스들을 표준화한 설계
컬렉션 Collection :  다수의 데이터. 데이터 그룹
프레임웍 Framework :  표준화된 프로그래밍 방식.





java.util.Collections Class

컬렉션과 관련된 메서드를 제공한다.
fill(), copy(), sort(), binarySearch()등의 Arrays와 동일한 메서드가 있으며 같은 기능을 한다.




컬렉션의 동기화 Synchronization

멀티 쓰레드(Multi-Thread) 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에
데이터의 일관성을 유지하기 위해서 공유되는 객체를 동기화한다.

•  Vector, Hashtable 등의 구 버전(JDK1.2 이전) 클래스
    자체적으로 동기화 처리.
    멀티 쓰레드 프로그래밍이 아닌 경우에는 불필요한 기능이 되어 성능을 떨어트린다.

•  ArrayList, HashMap과 같은 컬렉션
    필요한 경우에만 java.util.Collections 클래스의 동기화 메서드를 이용하여 동기화 처리.




동기화 메서드

static Collection synchronizedCollection(Collection c)
static List synchronizedList(List list)
static <K, V> Map<K, V> synchronizedMap(Map<K, V> m)
static Set synchronizedSet(Set s)
static <K, V> SortedMap<K, V> synchronizedSortedMap(SortedMap<K, V> m)
static SortedSet synchronizedSortedSet(SortedSet s)
•  사용하는 방법
Collection<String> c = Collections.synchronizedCollection(new Vector<String>());

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List syncList = Collections.synchronizedList(list);




변경불가 컬렉션 만들기

멀티 쓰레드 프로그래밍할 때 여러 쓰레드가 하나의 컬렉션을 공유하면서 데이터가 손상되는 것을 방지한다.
컬렉션에 저장된 데이터를 보호하기 위해 컬렉션을 읽기 전용으로 만든다.
static Collection unmodifiableCollection(Collection<? extends T> c)
static List unmodifiableList(List<? extends T> list)
static <K, V> Map<K, V> unmodifiableMap(Map<? extends K, ? extends V> m)
static Set unmodifiableSet(Set<? extends T> s)
static <K, V> SortedMap<K, V> unmodifiableSortedMap(SortedMap<K, ? extends V> m)
static SortedSet unmodifiableSortedSet(SortedSet s)




싱글톤 컬렉션 만들기

'singleton'으로 시작하는 메서드.
인스턴스를 new 연산자가 아닌 메서드를 통해서만 생성하게 해서 생성할 수 있는 인스턴스의 개수를 제한하는 방법과 같은 기능을 제공한다.
반환된 컬렉션은 변경할 수 없다.
static Set singleton(T o)
static List singletonList(T o)
static <K, V> Map<K, V> singletonMap(K key, V value)




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

컬렉션에 지정된 종류의 객체만 저장할 수 있도록 제한할 때 사용한다.
JDK1.5 이전(지네릭스 도입 전)에 작성된 코드를 사용할 때 사용된다.
static Collection checkedCollection(Collection c, Class type)
static List checkedList(List list, Class type)
static <K, V> Map<K, V> checkedMap(Map<K, V> m, Class keyType, Class valueType)
static Set checkedSet(Set s, Class type)
static <K, V> SortedMap<K, V> checkedSortedMap(SortedMap<K, V> m, Class keyType, Class valueType)
static SortedSet checkedSortedSet(SortedSet s, Class type)
•  사용하는 방법
ArrayList<Integer> list = new ArrayList<>();
List checkList = Collections.checkedList(list, Integer.class);
checkList.add("abs");        // error
checkList.add(1);




그 외 메서드 예제

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<Integer> list = new ArrayList<>();
        print(list + "");                                       // []

        Collections.addAll(list, 1, 2, 3, 4, 5);
        print(list + "");                                       // [1, 2, 3, 4, 5]

        print(Collections.binarySearch(list, 2) + "");          // 1

        Collections.rotate(list, 3);
        print(list + "");                                       // [3, 4, 5, 1, 2]

        Collections.swap(list, 0, 2);
        print(list + "");                                       // [5, 4, 3, 1, 2]

        Collections.shuffle(list);
        print(list + "");                                       // [2, 1, 3, 5, 4]

        Collections.sort(list);
        print(list + "");                                       // [1, 2, 3, 4, 5]

        Collections.sort(list, Collections.reverseOrder());     // == Collections.reverse(list);
        print(list + "");                                       // [5, 4, 3, 2, 1]

        Collections.reverse(list);
        print(list + "");                                       // [1, 2, 3, 4, 5]


        Collections.replaceAll(list, 3, 1);
        print(list + "");                                       // [1, 2, 1, 4, 5]

        Enumeration e = Collections.enumeration(list);
        print(new ArrayList(Collections.list(e)) + "");         // [1, 2, 1, 4, 5]

        List newList = Collections.nCopies(list.size(), 2);
        print(newList + "");                                    // [2, 2, 2, 2, 2]

        print(Collections.disjoint(list, newList) + "");        // false. 공통 요소가 없으면 true

        Collections.copy(list, newList);
        print(list + "");                                       // [2, 2, 2, 2, 2]

        Collections.fill(list, 8);
        print(list + "");                                       // [8, 8, 8, 8, 8]
    }


    public void print(String str) {
        Log.d("TAG_", str);
    }
}




•  참고 서적: 자바의 정석 3판 2