티스토리 뷰
Collections - 컬렉션을 위한 메서드(static)를 제공
- 컬렉션 채우기, 복사, 정렬, 검색 - fill(), copy(), sort(), binarySearch() 등
- 컬렉션의 동기화 -synchronizedXXX()
- 변경불가(readOnly) 컬렉션 만들기 - unmodifiableXXX()
- 싱글톤 컬렉션 만들기 - singletonXXX()
- 한 종류의 객체만 저장하는 컬렉션 만들기 - checkedXXX()
1. 컬렉션 채우기, 복사, 정렬, 검색 - fill(), copy(), sort(), binarySearch() 등

2. 컬렉션의 동기화 -synchronizedXXX()

배열기반 클래스 중 Vector클래스는 동기화를 하는 반면, 새로운 버전인 ArrayList클래스는 기본적으로 '동기화'를 하지 않도록 되어있다. 그리고 필요할 때만 동기화하도록 설계가 바뀌었다. '동기화'가 필요할 때만 synchronizedList메서드를 사용한다. 필요할 때만 동기화하는 코드가 더 나은 코드이다. 메서드 사용법은 다음과 같다.
사용법

동기화되지 않은 List를 인자로 넣어 synchronizedList메서드를 호출하면 동기화된 List를 얻을 수 있다. 그 이후 List를 사용하면 된다. 동기화된 List는 Vector를 사용하는 것과 똑같은 결과를 얻게 된다.
3. 변경불가(readOnly) 컬렉션 만들기 - unmodifiableXXX()
static Collection unmodifiableCollection(Collection c)
static List unmodifiableList(List list)
static Set unmodifiableSet(Set s)
static Map unmodifiableMap(Map m)
static NavigableSet unmodifiableNavigableSet(NavigableSet s)
static SortedSet unmodifiableSortedSet(SortedSet s)
static NavigableMap unmodifiableNavigableMap(NavigableMap m)
static SortedMap unmodifiableSortedMap(SortedMap m)
컬렉션이 변경되지 않는 '읽기 전용' 컬렉션으로 만들어야 할 때 위 메서드들을 사용하면 된다. final int n = 3; 처럼 상수를 만들어 변경 불가로 만드는 것과 같다.
4. 싱글톤 컬렉션 만들기 - singletonXXX()
static List SingletonList(Object o)
static Set Singleton(Object o) // singletonSet이 아님에 주의
static Map SingletonMap(Object key, Object value)
싱글톤 컬렉션은 객체 1개만 저장할 수 있는 컬렉션이다.
5. 한 종류의 객체만 저장하는 컬렉션 만들기 - checkedXXX()
static Collection checkedCollection(Collection c, class type)
static List checkedList(List list, Class type)
static Set checkedSet(Set s, Class type)
static Map checkedMap(Map m, Class keyType, Class valueType)
static Queue. checkedQueue(Queue queue, Class type)
static NavigableSet checkedNavigableSet(NavigableSet s, Class type)
static SortedSet checkedSortedSet(SortedSet s, Class type)
static NavigableMap checkedNavigableMap(NavigableMap m, Class keyType, Class valueType)
static SortedMap checkedSortedMap(SortedMap m, Class keyType, Class valueType)
원래 컬렉션에는 여러 종류의 객체를 저장할 수 있다. 그런데, checkedxxx메서드를 사용하면 한 가지 타입만 저장 가능해진다.
사용법
List list = new ArrayList();
List checkedList = checkedList(list, String.class); // String만 저장 가능
checkedList.add("abc"); // OK.
checkedList.add(new Integer(3)); // 에러. ClassCastException발생
12장에서 지네릭스라는 것을 배운다. 이 '지네릭스'가 컬렉션에 한 가지 종류의 객체만 저장할 수 있게 해준다. 컬렉션에 저장할 요소의 타입을 제한하는 것은 다음 장에서 배울 지네릭스(generics)로 간단히 처리할 수 있는데도 이런 메서드들을 제공하는 이유는 호환성 때문이다. 지네릭스는 JDK1.5부터 도입된 기능이므로 JDK1.5이전에 작성된 코드를 사용할 때는 이 checked메서드들을 이용해서 한 종류의 객체만 저장할 수 있는 컬렉션을 만들어야 할 때가 있다.
예제11-19
addAll(list, 1,2,3,4,5);
System.out.println(list);
위처럼 static메서드 addAll을 클래스명 없이 바로 쓸 수 있는 이유는 static import를 해주었기 때문이다.
import static java.util.Collections.*; // Collections를 생략가능하게 해준다.
public class Ex11_19 {
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);
import static java.util.Collections.*; 코드를 통해 Collections클래스 작성을 생략가능하게 해준다.
컬렉션 클래스 정리 & 요약

ArrayList, Vector(Object[ ])
배열 기반 컬렉션 클래스. Vector을 이용해서 만든 것이 Stack클래스이다.
Stack
LIFO 구조. Stack을 옆으로 뒤집으면 배열과 같다.
LinkedList
배열의 단점이 '추가 및 삭제'에 불리하다는 것인데, 이러한 기능을 향상시키신 것이 LinkedList이다. LinkedList는 '연결 기반'이다.
Queue
FIFO 구조. LinkedList을 옆으로 뒤집으면 Queue와 같다. Queue는 LInkedList로 구현한 것이다.
HashMap, Hashtable
Hashtable은 배열의 장점과 링크드리스트의 장점을 합한 것이다. HashMap은 Key Value를 한 쌍으로 저장한다. HashMap은 Hashtable의 new 버젼이다.
TreeMap
연결 기반을 변형한 것으로 최대 두 개까지 연결할 수 있는 이진 트리 구조로 이루어져있다. TreeMap은 LinkedList의 검색, 범위검색, 정렬기능을 향상시킨 것이다. TreeMap은 중위 순회하면 정렬된다.
HashSet
HashMap과 Hashtable에서 Key 부분만 가지고 만든 것이 HashSet이다. TreeSet과 HashSet을 까보면, HashMap과 TreeMap으로 만들었다는 것을 알 수 있다.
Properties
HashMap의 변형으로 Properties라는 것이 있다. HashMap은 (key, value)를 저장하는 타입이 (Object, Object)이다. 반면 Properties는 (key, value)를 저장하는 타입이 (String, String)이다. Properties의 장점은 파일의 '읽기'와 '쓰기'가 용이하다. 따라서 많이 사용한다. (자세한 건 Java API 또는 자바의정석 3판을 보자.)
LinkedHashSet, LinkedHashMap
순서 유지 기능이 필요할 때 LinkedHashSet, LinkedHashMap을 사용하면 된다. Linked는 '연결된' 이라는 뜻이다. 무언가를 연결하면 '순서'가 생긴다. 따라서 순서 유지 기능이 필요할 때 사용하면 된다.
숙제
여러분들이 직접 종이에 지금까지 배운 걸, 제가 여기 화면에 그린 것처럼 요약을 해보세요. 자꾸 이렇게 그리는 걸 보기만 하지 마시고 직접 하나, 둘 정리하다보면 공부에 많은 도움이 되실거에요. 11장 공부하신 분들의 공통점이 전체적으로 정리가 안 된다는 건데, 그래서 제가 이렇게 정리하고 요약을 해드렸어요. 여러분 나름대로 정리를 간략하게 해보세요.
'Java의 정석_기초편' 카테고리의 다른 글
| 지네릭스 용어 (0) | 2022.11.07 |
|---|---|
| 지네릭스란 & 타입 변수 (0) | 2022.11.07 |
| HashMap (0) | 2022.11.05 |
| TreeSet (0) | 2022.11.04 |
| HashSet (0) | 2022.11.03 |
