Collections Framework |
데이터 군을 다루고 표현하기 위한 단일화된 구조
핵심 인터페이스
Collections Framework에서는 컬레션데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 각 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의하였다.
- List
순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.
구현클래스: ArrayList, LinkedList, Stack, Vector 등 - Set
순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.
구현클래스: HashSet, TreeSet 등 - Map
키와 값의 쌍으로 이루어진 데이터의 집합
순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
구현클래스: HashMap, TreeMap, Hashtable, Properties 등
Collection인터페이스
Collection인터페이스는 List와 Set의 조상이다.
Collection인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메서드들을 정의하고 있다.
- boolean add(Object o) / boolean addAll(Collection c)
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가한다. - void clear()
Collection의 모든 객체를 삭제한다. - boolean contatins(Object o) / boolean containsAll(Collection c)
지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다. - int hashCode()
Collection의 hash code를 반환한다. - boolean isEmpty()
Collection이 비어있는지 확인한다. - Iterator iterator()
Collection의 iterator를 얻어서 반환한다. - boolean remove(Object o)
지정된 객체를 삭제한다. - boolean removeAll(Collection c)
지정된 Collection에 포함된 객체들을 삭제한다. - boolean retainAll(Collection c)
지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제한다. 이 작업으로 인해 Collection에 변화가 있으면 true를 그렇지 않으면 false를 반환한다. - int size()
Collection에 저장된 객체의 개수를 반환한다. - Object[] toArray()
Collection에 저장된 객체를 객체배열(Object[])로 반환한다. - Object[] toArray(Object [] a)
지정된 배열에 Collection의 객체를 저장해서 반환한다.
List인터페이스
List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다.
- void add(int index, Object element) / boolean addAll(int index, Collection c)
지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 추가한다. - Object get(int index)
지정된 위치(index)에 있는 객체를 반환한다. - int indexOf(Object o)
지정된 객체의 위치(index)를 반환한다.
(List의 첫 번째 요소부터 순방향으로 찾는다.) - int lastIndexOf(Object o)
지정된 객체의 위치(index)를 반환한다.
(List의 마지막 요소부터 역방향으로 찾는다.) - ListIterator listIterator() / ListIterator listIterator(int index)
List의 객체에 접근할 수 있는 ListIterator를 반환한다. - Object set(int index, Object element)
지정된 위치(index)에 객체(element)를 저장한다. - void sort(Comparator c)
지정된 비교자(comparator)로 List를 정렬한다. - Lsit subList(int fromIndex, int toIndex)
지정된 범위(fromIndex부터 toIndex)에 있는 객체를 반환한다.
List인터페이스
List인터페이스는 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용된다.
Map인터페이스
Map인터페이스는 키(key)와 값(value)을 하나의 싸으로 묶어서 자장하는 컬렉션 클래스를 구현하는 데 사용한다.
키는 중복될 수 없지만 값은 중복을 허용한다.
- void clear()
Map의 모든 객체를 삭제한다. - boolean containsKey(Object key)
지정된 key객체와 일치하는 Map의 key객체가 있는지 확인한다. - boolean containValue(Object value)
지정된 value객체와 일치하는 Map의 value객체가 있는지 확인한다. - Set entrySet()
Map에 저장되어 있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환한다. - boolean equals(Object o)
동일한 Map인지 비교한다. - Object get(Object key)
지정한 key객체에 대응하는 value객체를 찾아서 반환한다. - int hashCode()
hash code를 반환한다. - boolean isEmpty()
Map이 비어있는지 확인한다. - Set keySet()
Map에 저장된 모든 key객체를 반환한다. - Object put(Object key, Object value)
Map에 value객체를 key객체에 연결하여 저장한다. - void putAll(Map t)
지정된 Map의 모든 key-value쌍을 추가한다. - Object remove(Object key)
지정한 key객체와 일치하는 key-value객체를 삭제한다. - int size()
Map에 저장된 key-value쌍의 개수를 반환한다. - Collection values()
Map에 저장된 모든 value객체를 반환한다.
Map.Entry인터페이스
Map인터페이스의 내부 인터페이스.
Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 Entry인터페이스를 정의해 놓음
- boolean equals(Object o)
동일한 Entry인지 비교한다 - Object getKey()
Entry의 key객체를 반환한다. - Object getValue()
Entry의 value객체를 반환한다. - int hashCode()
Entry의 hash code를 반환한다. - Object setValue()
Entry의 value객체를 지정된 객체로 바꾼다.
ArrayList |
ArrayList는 기존의 Vector를 개선한 것으로 Vector와 구현원리와 기능적인 측면에서 동일한다.
ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장되며, 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장된다.
- java.util.ArrayList 참고
https://docs.oracle.com/javase/8/docs/api/index.html?help-doc.html
Java Platform SE 8
docs.oracle.com
LinkedList |
배열의 단점을 보완하기 위해서 LinkedList라는 자료구조가 고안 되었다.
배열의 단점
- 크기를 변경할 수 없다.
- 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야한다.
- 실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다. - 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
- 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만, 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다.
LinkedList의 구성
class Node{
Node next; //다음 요소의 주소를 저장
Object obj; //데이터를 저장
}
각 Node들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.
LinkedList의 데이터 삭제
삭제하고자 하는 요소의 이전요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하기만 하면 된다.
단 하나의 참조만 변경하면 삭제가 이루어지는 것이므로, 배열처럼 데이터를 이동하기 위해 복사하는 과정이 없어 처리속도가 빠르다.
더블 링크드 리스트
class Node{
Node next; //다음 요소의 주소를 저장
Node previous; //이전 요소의 주소를 저장
Object obj; //데이터를 저장
}
링크드 리스트는 이동방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전요소에 대한 접근이 어렵다. 이점을 보완한 것이 더블 링크드 리스트(이중 연결리스트, doubly linked list)이다. 실제로 LinkedList클래스는 더블 링크드 리스트로 구현 되어 있다.
doubly circular linked list
더블 링크드 리스트의 첫 번째 Node와 마지막 Node를 서로 연결 시킨 것이다.
ArrayList VS LinkedList
컬렉션 | 읽기(접근시간) | 추가/삭제 | 비고 |
ArrayList | 빠르다 | 느리다 | 순차적인 추가삭제는 더 빠름 비효율적인 메모리사용 |
LinkedList | 느리다 | 빠르다 | 데이터가 많을수록 접근성이 떨어짐 |
Stack & Queue |
Stack
마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조
메서드 | 설명 |
boolean empty() | Stack이 비어있는지 알려준다. |
Object peek() | Stack의 맨 위에 저장된 객체를 반환. pop()과 달리 Stack에서 객체를 꺼내지는 않음.(비었을 때는 EmptyStackException발생) |
Object pop() | Stack의 맨 위에 저장된 객체를 꺼낸다. (비었을 때는 EmptyStackException 발생) |
Object push(Object item) | Stack에 객체(item)를 저장한다. |
int search(Object o) | Stack에서 주어진 객체(o)를 찾아서 그 위치를 반환, 못 찾으면 -1를 반환.(배열과 달리 위치는 0이 아닌 1부터 시작) |
Queue
처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out) 구조
메서드 | 설명 |
boolean add() | 지정된 객체를 Queue에 추가한다. 성공하면 true를 반환. 저장공간이 부족하면 IllegalStateException 발생 |
Object remove() | Queue에서 객체를 꺼내 반환. 비어있으면 NoSuchElementExcpetion발생 |
Object element() | 삭제없이 요소를 읽어온다. peek와 달리 Queue가 비어있을 때 NoSuchElementExcpetion발생 |
boolean offer(Object o) | Queue에 객체를 저장. 성공하면 true, 실패하면 false를 반환 |
Object poll() | Queue에서 객체를 꺼내서 반환, 비어있으면 null을 반환 |
Object peek() | 삭제없이 요소를 읽어 온다. Queue가 비어있으면 null을 반환 |
PriorityQueue
저장 순서와 관계없이 우선순위가 높은 것부터 꺼낸다. null을 저장 할 수 없다(NullPointerExceprion 발생). 힙을 이용하여 구현
DeQue
Queue의 변형으로, 한 쪽 끝으로만 추가/삭제할 수 있는 Queue와 달리, Deque 양쪽 끝에 추가/삭제가 가능
Deque의 조상은 Queue이며, 구현체로는 ArrayList, LinkedList등이 있다.
Iterator |
Iterator
컬렉션 프레임워크에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 하였다.
public interface Iterator{
boolean hashNext();
Object next();
void remove();
}
public interface Collection{
...
public Iterator();
...
}
iterator()는 Collection인터페이스에 정의된 메서드이므로 Collection인터페이스의 자손이 List와 Set에도 포함되어 있다.
메서드 | 설명 |
boolean hashNext() | 읽어 올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다. |
Object next() | 다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다. |
void remove() | next()로 읽어 온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야한다.(선택적 기능) |
ArrayList에 저장된 요소들을 출력하기 위한 코드
Collection c = new ArrayList();
Iterator it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
ListIterator와 Enumeration
Enumeration Iterator의 구버전ListIterator Iterator에 양방향 조회기능추가(List를 구현한 경우만 사용가능)
Enumeration인터페이스의 메서드
메서드 | 설명 |
boolean hashMoreElements() | Iterator의 hashNext()와 같다 |
Object nextElement() | Iterator의 next()와 같다 |
ListIterator의 메서드
메서드 | 설명 |
boolean add() | 컬렉션에 새로운 객체(o)를 추가한다.(선택적 기능) |
boolean hasNext() | 읽어 올 다음 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환 |
boolean hasPrevious() | 읽어 올 이전 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환 |
Object next() | 다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다. |
Object previous() | 다음 요소를 읽어 온다. previous()를 호출하기 전에 hasprevious()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다. |
int nextIndex() | 다음 요소의 index를 반환한다. |
int previousIndex() | 이전 요소의 index를 반환한다. |
void remove() | next() 또는 prevoius()로 읽어 온 요소를 삭제한다. 반드시 next()나 previous()를 먼저 호출한 다음에 이 메서드를 호출해야 한다.(선택적 기능) |
void set(Object o) | next() 또는 previous()로 읽어 온 요소를 지정된 객체(o)롤 변경한다. 반드시 next()나 previous()를 먼저 호출한 다음에 이 메서드를 호출해야한다.(선택적기능) |
Arrays |
Arrays클래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다.
배열의 복사 - copyOf(), copyOfRange()
copyOf는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 만들어 반환한다.
int[] arr = {0, 1, 2, 3, 4};
int[] copy1 = Arrays.copyOf(arr, arr.length); //{0,1,2,3,4}
int[] copy2 = Arrays.copyOfRange(arr, 2, 4); //{2,3}
배열채우기 - fill(), setAll()
fill()은 배열의 모든 요소를 지정된 값으로 채운다. setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다.
int[] arr = new int[5];
Arrays.fill(arr, 9); //{9,9,9,9,9}
Arrays.setAll(arr, i -> (int)(Math.random()*5)+1); //{2,4,2,2,3}
배열의 정렬과 검색 - sort(), binarySearch()
sort()는 배열을 정렬할 때, 그리고 배열에 저장된 요소를 검색할 때는 binarySearch()를 사용한다. binarySearch()는 반드시 배열이 정렬되어 있어야 한다.
nt[] arr = {5,4,0,1,2,3};
int idx = Arrays.binarySearch(arr, 2); //4
Arrays.sort(arr); //{0,1,2,3,4,5}
idx = Arrays.binarySearch(arr, 2) //2
배열의 비교와 출력 - equals(), toString()
equals()는 두배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다. toString()은 배열의 모든 요소를 문자열로 편하게 출력할 수 있다.
String[] arrStr1 = {"aaa"};
String[] arrStr2 = {"aaa"};
String[][] arr2DStr1 = {{"aaa"},{"bbb"}};
String[][] arr2DStr2 = {{"aaa"},{"bbb"}};
System.out.println(Arrays.equals(arrStr1, arrStr2));
System.out.println(Arrays.deepEquals(arr2DStr1, arr2DStr2));
int[] arr = {0,1,2,3,4};
int[][] arr2D = {{11,12},{21,22}};
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.deepToString(arr2D));
배열을 List로 변환 - asList(Object...a)
asList()는 배열을 List에 담아서 반환한다. 매개변수 타입이 가변인수라서 배열 생성없이 저장할 요소들만 나열하는 것도 가능하다. 한 가지 주위할 점은 asList()가 반환한 List의 크기를 변경할 수 없다는 것이다.
List list = Arrays.asList(new Integer[] {1,2,3,4,5});
List list = Arrays.asList(1,2,3,4,5);
parallelXXX(), spliterator(), stream()
이 메서드들은 보다 빠른 결과를 얻기 위해 여러 쓰레드가 작업을 나누어 처리하도록 한다.
Comparator & Comparable |
Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있으며, Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들, 주로 Integer와 같은 wrapper클래스와 String, Date, File과 같은 것들이며 기본적으로 오름차순, 즉 작은 값에서부터 큰 값의 순으로 정렬되도록 한다.
//Comparable 기본 정렬기준을 구현하는데 사용
public interface Comparable{
public int compareTo(Object o);
}
//Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
public interface Comparator{
int compare(Object o1, Object o2);
booleand equals(Object obj);
}
static void sort(Object[] a) //객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c) // 지정한 Comparator에 의한 정렬
//내림차순 예제
class Decending implements Comparator{
public int compare(Object o1, Object o2) {
if(o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
return c1.compareTo(c2) * -1;
}
return -1;
}
}
Comparator와 Comparable은 자바에서 객체 정렬을 구현하기 위한 인터페이스입니다.
Comparable
Comparable 인터페이스는 자신의 기본 정렬 기준을 구현하는데 사용됩니다. 즉, 객체의 특정 필드를 기준으로 정렬하고 싶을 때, 해당 객체에서 Comparable 인터페이스를 구현하고, compareTo() 메서드를 재정의하여 필드 값을 비교하여 정렬합니다.
예를 들어, 아래 코드는 Student 클래스가 Comparable 인터페이스를 구현한 경우입니다. Student 클래스의 기본 정렬 기준은 학번입니다.
class Student implements Comparable<Student> {
private int id;
private String name;
// ... constructor, getter, setter
@Override
public int compareTo(Student other) {
return this.id - other.id;
}
}
Comparator
Comparator 인터페이스는 기존에 구현된 Comparable 인터페이스의 기본 정렬 기준 외에 다른 정렬 기준을 제공하는데 사용됩니다. 즉, 객체의 다른 필드를 기준으로 정렬하고 싶을 때, Comparator 인터페이스를 구현하고, compare() 메서드를 재정의하여 필드 값을 비교하여 정렬합니다.
예를 들어, 아래 코드는 Student 클래스를 id, name, score를 기준으로 정렬하는 경우입니다.
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
if (s1.getId() != s2.getId()) {
return s1.getId() - s2.getId();
} else if (!s1.getName().equals(s2.getName())) {
return s1.getName().compareTo(s2.getName());
} else {
return s1.getScore() - s2.getScore();
}
}
}
위의 코드에서 compare() 메서드는 먼저 id 값을 비교하고, 만약 같은 경우에는 name 값을 비교하고, 그래도 같은 경우에는 score 값을 비교하여 정렬합니다.
Comparator 인터페이스를 사용하면, 객체를 정렬할 때 기본 정렬 기준 외에 다른 기준을 추가하여 정렬할 수 있습니다.
HashSet |
HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 Hashset은 중복된 요소를 저장하지 않는다. HashSet은 내부적으로 hashMap을 이용해서 만들어 졌으며, HaashSet이란 이름은 hasing을 이용해서 구현했기 때문에 붙여진 것이다.
TreeSet |
TreeSet의 특징
1. TreeSet은 이진 검색 트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다.
2. TreeSet은 이진 검색 트리의 성능을 향상시킨 'Red-Black tree'로 구현되어 있다.
3. Set인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장순서를 유지하지도 않음
HashMap & HashTable |
HashMap은 Map을 구현했으므로 Map의 특징 , 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다. 그리고 hashing을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다. HashTable보다는 새로운 버전인 HashMap을 사용하는 것을 권장한다.
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable{
transient Entry[] table;
...
static class Entry implements Map.Entry{
final Object key;
Object value;
...
}
}
키(key) 컬렉션 내의 키(key) 중에서 유일해야 한다.
값(value) 키(key)와 달리 데이터의 중복을 허용한다.
해싱과 해시함수
해싱이란 해시함수를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법을 말한다. 해시함수는 데이터가 저장되어 있는 곳을 알려 주기 때문에 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다.해싱에서 사용하는 자료구조는 배열과 링크드 리스트의 조합으로 되어있다. 저장할 데이터의 키를 해시함수에 넣으면 배열의 한 요소를 얻게 되고, 다시 그 곳에 연결되어 있는 링크드 리스트에 저장하게 된다.
HashMap에서 저장된 데이터를 찾는 과정1. 검색하고자 하는 값의 키로 해시함수를 호출한다.2. 해시함수의 계산결과(해시코드)로 해당 값이 저장되어 있는 링크드 리스트를 찾는다.3. 링크드 리스트에서 검색한 키와 일치하는 데이터를 찾는다.
Treemap
TreeMap은 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다. 따라서, 검색과 정렬에 적합한 컬렉션클래스이다.
properties |
Properties는 HashMap의 구버전인 HashTable을 상속받아 구현한 것으로, Hashtable은 키와 값을 (Object, Object)의 형태로 저장하는데 비해 Properties는 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션클래스이다.
주로 애플리케이션 환경설정과 관련된 속석(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결 될 수 있다.
setProperty()
Hashtable의 put 메서드를 호출, 기존에 같은 키로 저장된 값이 있으면 그 값을 Object타입으로 반환하며, 그렇지 않을 때는 null을 반환
getProperty()
저장된 값을 읽어오는 일을 하는데, 만일 읽어오려는 키가 존재하지 않으면 지정된 기본값을 반환한다.
Properties properties = new Properties();
//txt 데이터로 저장
properties.store(new FileOutputStream("output.txt"), "Properties Example");
//xml데이터로 저장
properties.storeToXML(new FileOutputStream("output.xml"), "Properties Example");
//시스템과 관련된 속성
Properties sysProp = System.getProperties();
Collections |
컬렉션의 동기화
멀티 쓰레드 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 일관성을 유지하기 위해서는 공유되는 객체에 동기화가 필요하다.
//동기화 메서드
static Collection synchronizedCollection(Collection c)
static List synchronizedList(List l)
static Set synchronizedCollection(Set s)
static Map synchronizedCollection(Map m)
static StoredSet synchronizedCollection(StoredSet s)
static StoredMap synchronizedCollection(StoredMap m)
//사용
List list = Collections.synchronizedList(new ArrayList(...));
변경불가 컬렉션 만들기
컬렉션에 저장된 데이터를 보호하기 위해서 컬렉션을 변경할 수 없게, 즉 읽기전용으로 만들어야 할 때 사용
static Collection unmodifiableCollection(Collection c)
static List unmodifiableList(List l)
static Set unmodifiableSet(Set s)
static Map unmodifiableSet(Map m)
static NavigableSet unmodifiableCollection(Navigableset s)
static SortedSet unmodifiableCollection(SortedSet s)
static NavigableMap unmodifiableCollection(NavigableMap m)
static SortedMap unmodifiableCollection(SortedMap m)
싱글톤 컬레션 만들기
단 하나의 객체만을 저장하는 컬렉션을 만들고 싶을 경우 사용.
static List singletonList(Object o)
static Set singleton(Object o)
static Map singletomMap(Object key, Object value)
매개변수로 저장할 요소를 지정하면, 해당 요소를 저장하는 컬렉션을 반환한다. 반환된 컬렉션은 변경할 수 없다.
한 종류의 객체만 저장하는 컬렉션 만들기
컬렉션에 지정된 종류의 객체만 저장할 수 있도록 제한하고 싶을 때 사용
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 q, 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)
List list = new ArrayList();
List checkedList = Collections.checkedList(list, String.class); //String만 저장 가능
checkedList.add("abc"); //OK
checkedList.add(new Integer(3)); //에러. ClassCastException 발생
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA 이론] 쓰레드 (0) | 2022.03.16 |
---|---|
[JAVA 이론] Generics, Enumeration, Annotation (0) | 2022.03.13 |
[JAVA 이론] 날짜와 시간 & 형식화 (0) | 2022.02.18 |
[JAVA 이론] java.lang package & util classes (0) | 2022.01.27 |
[JAVA 이론] 예외처리 (0) | 2022.01.27 |