컬렉션 프레임웍 3

35434 단어 JavaJava

Java의 정석 의 책을 읽고 정리한 내용입니다.

 

📖 K. TreeMap

  • TreeMap은 이름에서 알 수 있듯이 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다. 그래서 검색과 정렬에 적합한 컬렉션 클래스이다.
  • 검색에 관한 대부분의 경우에서 HashMapTreeMap보다 더 뛰어나므로 HashMap을 사용하는 것이 좋다.
  • 다만 범위 검색이나 정렬이 필요한 경우에는 TreeMap을 사용하자!
메서드설명
TreeMap()TreeMap객체를 생성
TreeMap(Comparator c)지정된 Comparator를 기준으로 정렬하는 TreeMap객체를 생성
TreeMap(Map m)주어진 Map에 저장된 모든 요소를 포함하는 TreeMap을 생성
TreeMap(SortedMap m)주어진 SortedMap에 저장된 모든 요소를 포함하는 TreeMap을 생성
Map.Entry ceilingEntry(Object key)지정된 key와 일치하거나 큰 것중 제일 작은 것의 키와 값의 쌍(Map.Entry)를 반환. 없으면 null반환
Object ceilingKey(Object key)지정된 key와 일치하거나 큰 것 중 제일 작은 것의 키를 반환, 없으면 null반환
void clear()TreeMap에 저장된 모든 객체를 제거
Object clone()현재 TreeMap을 복제해서 반환
Comparator comparator()TreeMap의 정렬 기준이 되는 Compartor를 반환, Compartor가 지정되지 않았다면 null을 반환
boolean containsKey(Object key)TreeMap에 지정된 키(key)가 포함되어 있는지 알려줌(포함되어 있으면 true)
boolean containsValue(Object value)TreeMap에 지정된 값(value)가 포함되어 있는지 알려줌(포함되어 있으면 true)
NavigableSet desecendingKeySet()TreeMap에 저장된 키를 역순으로 정렬해서 NavigableSet에 담아서 반환
Set entrySet()TreeMap에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장해서 반환
Map.Entry firstEntry()TreeMap에 저장된 첫번째(가장 작은)키와 값의 쌍(Map.Entry)을 반환
Object firstKey()TreeMap에 저장된 첫번째(가장 작은) 키를 반환
Map.Entry floorEntry(Objec tkey)지정된 key와 일치하거나 작은 것 중에서 제일 큰 키의 쌍(Map.Entry)을 반환, 없으면 null을 반환
Object floorKey(Object key)지정된 key와 일치하거나 작은 것 중에서 제일 큰 키를 반환, 없으면 null을 반환
Object get(Object key)지정된 키(key)의 값(객체)을 반환
SortedMap headMap(Object toKey)TreeMap에 저장된 첫번째 요소부터 지정된 범위에 속한 모든 요소가 담긴 SortedMap을 반환(toKey는 미포함)
NavigableMap headMap(Object toKey, boolean inclusive)TreeMap에 저장된 첫번째 요소부터 지정된 범위에 속한 모든 요소가 담긴 SortedMap을 반환, inclusive의 값이 true이면 toKey도 포함)
Map.Entry higherEntry(Object key)지정된 key보다 큰 키 중에서 제일 작은 키의 쌍(Map.Entry)를 반환, 없으면 null을 반환
boolean isEmpty()TreeMap이 비어있는지 알려준다.
Set keySet()TreeMap에 저장된 모든 키가 저장된 Set을 반환
Map.Entry lastEntry()TreeMap에 저장된 모든 키가 저장된 Set을 반환
Map.Entry lowerEntry(Object key)지정된 key보다 작은 키 중에서 제일 큰 키의 쌍(Map.Entry)을 반환, 없으면 null을 반환
Object lowerKey(Object key)지정된 key보다 작은 키 중에서 제일 큰 키의 쌍(Map.Entry)을 반환, 없으면 null을 반환
NavigableSet naviableKeySet()TreeMap의 모든 키가 담긴 NaviableSet을 반환
Map.Entry pollFirstEntry()TreeMap에서 제일 작은 키를 제거하면서 반환
Map.Entry pollLastEntry()TreeMap에서 제일 큰 기를 제거하면서 반환
Object put(Object key, Object value)지정된 키와 값을 TreeMap에 저장
void putAll(Map map)Map에 저장된 모든 요소를 TreeMap에 저장
Object remove(Object key)TreeMap에 지정된 키로 저장된 값(객체)를 제거
Object replace(Object k, Object v)기존의 키(k)의 값을 지정된 값(v)로 변경
Object put (Object key, Object value)지정된 키와 값을 TreeMap에 저장
void putAll(Map map)Map에 저장된 요소를 TreeMap에 저장
Object remove(Object key)TreeMap에서 지정된 키로 저장된 값(객체)를 제거
Object replace(Object k, Object v)기존의 키(k)의 값을 지정된 값(v)으로 변경
boolean replace(Object key, Object oldValue, Object newValue)기존의 키(k)의 값을 새로운 값(newValue)로 변경, 기존의 값과 지정된 값(oldValue)가 일치해야 함
int size()TreeMap에 저장된 요소의 개수를 반환
NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive)지정된 두개의 키 사이에 있는 모든 요소들이 담긴 NavigableMap을 반환. fromInclusive가 true면 범위에 fromKey 포함. toInclusive가 true이면 범위에 toKey 포함
SotretdMap subMap(Object fromKey, Object toKey)지정된 두 개의 키 사이에 있는 모든 요소들이 담긴 SortedMap을 반환(toKey는 포함되지 않음)
SortedMap tailMap(Object fromkey)지정된 키부터 마지막 요소의 범위에 속한 요소가 담긴 SortedMap을 반환
NaviableMap tailMap(Object fromKey, boolean inclusive)지정된 키부터 마지막 요소의 범위에 속한 요소가 담긴 NaviableMap을 반환, inclusive가 true이면 fromKey도 포함
Collection values()TreeMap에 저장된 모든 값을 컬렉션의 형태로 변환

 

📖 L. Properties

  • PropertiesHashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable은 키와 값을 (Object, Object)의 형태로 저장하는데 비해 Properties는 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션 클래스이다.
  • 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다.
  • 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결될 수 있다.
메서드설명
Proeperties()Properties객체를 생성한다.
Properties(Propertis defaults)지정된 Properties에 저장된 목록을 가진 Properties 객체를 생성한다.
String getProperty(String key)지정된 키(key)와 값(value)를 반환한다.
String getProperty(String key, String defaultValue)지정된 키(key)의 값(value)를 반환한다. 키를 못찾으면 defaultValue를 반환한다.
void list(PrintStream out)지정된 PrintStream에 저장된 목록을 출력한다.
void list(PrintWriter out)지정된 PrintWriter에 저장된 목록을 출력한다.
void load(InputStream inStream)지정된 InputStream으로부터 목록을 읽어서 저장한다.
void loatFromXML(InputStream in)지정된 InputStream으로부터 XML문서를 읽어서, XML문서에 저장된 목록을 읽어다 담는다. (load & store)
Enumeration propertyNames()목록의 모든 키(key)가 담긴 Enumberation을 반환한다.
void save(OutputStream out, String header)deprecated되었으므로 store()를 사용
Object setProperty(String key, String value)지정된 키와 값을 저장한다. 이미 존재하는 키(key)면 새로운 값(value)로 바뀐다.
void store(Writer writer, String comments)저장된 목록을 지정된 Writer에 출력(저장)한다. comments는 목록에 대한 설명(주석)으로 저장된다.
void store(OutputStream out, String comments)저장된 목록을 지정된 OutputStream에 출력(저장)한다. comments는 목록에 대한 설명(주석)으로 저장된다.
void storeToXML(OutputStream os, String comment, String encoding)저장된 목록을 지정된 출력스트림에 해당 인코딩의 XML문서로 출력(저장)한다. comment는 목록에 대한 설명(주석)으로 저장된다.
Set StringPropertyNames()Propertyies에 저장되어 있는 모든 키(key)를 Set에 담아서 반환한다.

 

Object setProperty(String key, String value)
  • 데이터를 저장하는데 사용되는 setProperty()는 단순히 Hashtableput메서드를 호출할 뿐이다.
  • setProperty()는 기존에 같은 키로 저장된 값이 있는 경우 그 값을 Object타입으로 반환하며, 그렇지 않을 때는 null을 반환한다.

 

String getProperty(String key)
String getProperty(String key, String defaultValue)
  • getProperty()Properties에 저장된 값을 읽어오는 일을 하는데, 만일 읽어오려는 키가 존재하지 않으면 지정된 기본값(defaultValue)을 반환한다.
  • Properties는 컬렉션 프레임웍의 이전의 구버전이므로 Iterator가 아닌 Enumeration을 사용한다.
  • Map의 특성상 저장순서를 유지하지 않기 때문에 출력된 순서가 저장순서와는 무관하다.

 

void list(PrintStream out)
void list(PrintWriter out)
  • list메서드를 이용하면 Properties에 저장된 모든 데이터를 화면 또는 파일에 편리하게 출력할 수 있다.

 

💡 참고

  • key에 문자 =를 포함시키고자 한다면 escape문자 \를 사용하여 \=와 같이 표현한다.

 

📖 M. Collections

  • Collections는 컬렉션과 관련된 메서드를 제공한다.
  • java.util.Collection은 인터페이스고, java.util.Collections는 클래스이다.

 

✔️ 컬렉션의 동기화

  • 멀티 쓰레드(multi-thread) 프로그래밍에서 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 일관성(consistency)을 유지하기 위해서는 공유되는 객체에 동기화(synchronization)가 필요하다.
  • 새로 추가된 ArrayListHashMap과 같은 컬렉션은 동기화를 자체적으로 처리하지 않고 필요한 경우에만 java.util.Collections 클래스의 동기화 메서드를 이용해서 동기화처리가 가능하도록 변경하였다.

 

동기화가 필요할 때 Collections클래스가 제공하는 동기화메서드를 사용하면 된다.

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

 

사용 방법

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

 

✔️ 변경불가 컬렉션 만들기

읽기전용으로 만들어야할 때 사용한다.

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 unmodifiableNaviableMap(NaviableMap m)
static SortedMap unmodifiableSortedMap(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 s, Class type)
static Map checkedMap(Map m, Class keytype, Class valueType)
static NavigableSet checkedNavigableSet(NavigableSet s, Class type)
static SortedSet checkedSortedSet(SortedSet s, Class type)
static NavigableMap checkedNaviableMap(NaviableMap m, Class keytype, Class valueType)
static SortedMap checkedSortedMap(SortedMap m, Class keytype, Class valueType)

 

사용방법으로 두 번째 매개변수에 저장할 객체의 클래스를 지정하면 된다.

List list = new ArrayList();
List checkedList = checkedList(List, String.class); // String만 저장 가능
checkList.add("abc");  // OK  
checkList.add(new Integer(3)); // 에러. ClassCastException 발생
  • 컬렉션에 저장할 요소의 타입을 제한하는 것은 지네릭스(generics)로 간단히 처리할 수 있는데도 이런 메서드들을 제공하는 이유는 호환성 때문이다.

 

import java.util.*;
import static java.util.Collections.*;

class CollectionsEx {

	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); // 정렬
		System.out.println(list);

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

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

		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);

	}

}
[]
[1, 2, 3, 4, 5]
[4, 5, 1, 2, 3]
[1, 5, 4, 2, 3]
[4, 1, 2, 3, 5]
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
index of 3 = 2
max=5
min=1
min=1
list=[9, 9, 9, 9, 9]
newList=[2, 2, 2, 2, 2]
true
newList=[2, 2, 2, 2, 2]
list=[2, 2, 2, 2, 2]
list=[1, 1, 1, 1, 1]
list2=[1, 1, 1, 1, 1]

 

📝 컬렉션 클래스 정리 & 요약

각 컬렉션 클래스마다 장단점이 있으므로 구현원리와 특징을 잘 이해해서 상황에 가장 적합한 것을 선택해서 사용해야한다.

 

컬렉션특징
ArrayList배열기반, 데이터의 추가와 삭제에 불리, 순차적인 추가삭제는 제일 빠름, 임의의 요소에 접근성(accessibility)가 뛰어남
LinkedList연결기반. 데이터의 추가와 삭제에 유리, 임의의 요소에 대한 접근성이 좋지 않다.
HashMap배열과 연결이 결합된 형태, 추가,삭제,검색,접근성이 모두 뛰어남, 검색에는 최고성능을 보인다.
TreeMap연결기반, 정렬과 검색(특히 범위검색)에 적합. 검색성능은 HashMap보다 떨어짐
StackVector를 상속받아 구현
QueueLinkedList가 Queue인터페이스를 구현
PropertiesHashtable을 상속받아 구현
HashSetHashMap을 이용해서 구현
TreeSetTreeMap을 이용해서 구현
LinkedHashMap, LinkedHashSetHashMap과 HashSet에 저장순서유지기능을 추가

좋은 웹페이지 즐겨찾기