본문 바로가기
Study/JAVA

[Java] 11. 컬렉션 프레임웍(2)

by jeongwle 2022. 9. 30.
728x90
반응형

 

8. HashSet

HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이다. Set인터페이스의 특징대로 중복된 요소를 저장하지 않는다. HashSet은 새로운 요소를 추가할 때 add나 addAll 메서드를 사용하는데 이미 저장되어 있는 요소와 중복된 요소를 추가하려고 하면 이 메서드들이 false를 반환하여 추가에 실패했다고 알린다. HashSet은 저장순서를 유지하지 않는다. 저장순서를 유지하고 싶다면 LinkedHashSet을 사용하자.

생성자 또는 메서드 설 명
 HashSet()  HashSet객체 생성
 HashSet(Collection c)  주어진 컬렉션을 포함하는 HashSet객체 생성
 HashSet(int capacity)  주어진 값을 초기용량으로하는 HashSet객체 생성
 HashSet(int capacity, float loadFactor)  초기용량과 load factor를 지정하는 생성자
 boolean add(Object o)  새로운 객체 추가
 boolean addAll(Collection c)  컬렉션의 모든 객체 추가
 void clear()  저장된 모든 객체 삭제
 Object clone()  HashSet 복제하여 반환 (얕은 복사)
 boolean contains(Object o)  지정된 객체를 포함하고 있는지 여부
 boolean containsAll(Collection c)  컬렉션의 모든 객체를 포함하고 있는지 여부
 boolean isEmpty()  HashSet이 비어있는지 여부
 Iterator iterator()  Iterator를 반환
 boolean remove(Object o)  지정된 객체 삭제
 boolean removeAll(Collection c)  컬렉션의 모든 객체와 동일한 객체 모두 삭제
 boolean retainAll(Collection c)  컬렉션의 모든 객체와 동일한 객체 이외의 모든 객체 삭제
 int size()  저장된 객체의 개수
 Object[] toArray()  저장된 객체를 객체배열의 형태로 반환
 Object[] toArray(Object[] a)  저장된 객체를 a에 담아 반환
*load factor는 컬렉션 클래스에 저장공간이 가득 차기 전에 미리 용량을 확보하기 위한 것으로 이 값을 0.8로 지정할 경우 저장공간의 80%가 채워졌을 때 용량이 두 배로 늘어난다. 기본값은 0.75.

 

9. TreeSet

TreeSet은 이진 검색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다. Set인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장순서를 유지하지도 않는다. 이진 검색 트리는 정렬, 검색, 범위검색(range search)에 높은 성능을 보이는 자료구조이며 TreeSet은 이진 검색 트리의 성능을 향상시킨 레드-블랙 트리(Red-Black tree)로 구현되어 있다. TreeSet에 저장되는 객체가 Comparable을 구현한 것이던가 아니면 TreeSet에 Comparator를 제공해서 두 객체를 비교할 방법을 알려주어야 한다. 그렇지 않으면 TreeSet에 객체를 저장할 때 예외가 발생한다.

생성자 또는 메서드 설 명
 TreeSet()  기본 생성자
 TreeSet(Collection c)  컬렉션을 저장하는 TreeSet 생성
 TreeSet(Comparator comp)  주어진 정렬조건으로 정렬하는 TreeSet 생성
 TreeSet(SortedSet s)  SortedSet을 구현한 컬렉션을 저장하는 TreeSet 생성
 boolean add(Object o)  객체를 추가
 boolean addAll(Collection c)  컬렉션에 포함된 모든 객체를 추가
 Object ceiling(Object o)  지정된 객체와 같은 객체를 반환
 없으면 가장 가까운 큰 값의 객체를 반환
 없으면 null
 void clear()  저장된 모든 객체를 삭제
 Object clone()  TreeSet을 복제하여 반환
 Comparator comparator()  TreeSet의 정렬기준(Comparator)을 반환
 boolean contains(Object o)  지정된 객체가 포함되어 있는지 여부
 boolean containsAll(Collection c)  컬렉션의 모든 객체가 포함되어 있는지 여부
 NavigableSet descendingSet()  TreeSet에 저장된 요소들을 역순으로 정렬해서 반환
 Object first()  정렬된 순서에서 첫 번째 객체 반환
 Object floor(Object o)  지정된 객체와 같은 객체를 반환
 없으면 가장 가까운 작은 값의 객체를 반환
 없으면 null
 SortedSet headSet(Object toElement)  지정된 객체보다 작은 값의 객체들을 반환
 NavigableSet headSet(
 Object toElement, boolean inclusive)
 지정된 객체보다 작은 값의 객체들을 반환
 inclusive가 true이면 같은 값의 객체도 포함
 Object higher(Object o)  지정된 객체와 가장 가까운 큰 값의 객체를 반환
 없으면 null
 boolean isEmpty()  TreeSet이 비어있는지 여부
 iterator iterator()  TreeSet의 Iterator를 반환
 Object last()  정렬된 순서에서 마지막 객체를 반환
 Object lower(Object o)  지정된 객체와 가장 가까운 작은 값의 객체를 반환
 없으면 null
 Object pollFirst()  TreeSet의 첫 번째 요소(제일 작은 값)를 반환
 Object pollLast()  TreeSet의 마지막 요소(제일 큰 값)를 반환
 boolean remove(Object o)  지정된 객체를 삭제
 boolean retainAll(Collection c)  주어진 컬렉션과 일치하는 요소 이외의 요소 삭제
 int size()  저장된 객체의 개수를 반환
 Spliterator spliterator()  TreeSet의 spliterator를 반환
 SortedSet subSet(
 Object fromElement, Object toElement)
 범위 검색(from과 to사이)의 결과를 반환
 toElement는 범위에 포함되지 않음
 NavigableSet<E> subSet(
 E fromElement, boolean fromInclusive,
 E toElement, boolean toInclusive)
 범위검색(from과 to사이)의 결과를 반환
 fromInclusive가 true면 시작 값 포함
 toinclusive가 true면 끝 값 포함
 SortedSet tailSet(Object fromElement)  지정된 객체보다 큰 값의 객체들을 반환
 Object[] toArray()  저장된 객체를 객체배열로 반환
 Object[] toArray(Object[] a)  저장된 객체를 a에 담아 반환

 

10. HashMap과 Hashtable

Hashtable과 HashMap의 관계는 Vector와 ArrayList의 관계와 같다. Hashtable보다 새로운 버전인 HashMap을 주로 사용하자. HashMap은 Map을 구현했으므로 앞에서 살펴본 Map의 키와 값을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다. HashMap은 Entry라는 내부 클래스를 정의하고 다시 Entry타입의 배열을 선언하고 있다. 키와 값은 서로 관련된 값이기 때문에 하나의 클래스로 정의해 하나의 배열로 다루는 것이 데이터의 무결성(integrity)적인 측면에서 바람직하기 때문이다. HashMap은 키와 값을 각각 Object타입으로 저장한다. 즉 (Object, Object)의 형태로 저장하기 때문에 어떤 객체가 들어오든 다 저장할 수 있다. 하지만 키는 주로 String을 대문자 또는 소문자로 통일해서 사용한다.

생성자 또는 메서드 설명
 HashMap()  HashMap 객체를 생성
 HashMap(int capacity)  초기용량을 설정한 HashMap 객체 생성
 Hashmap(int capacity, float loadFactor)  초기용량과 load factor를 설정한 HashMap 객체 생성
 HashMap(Map m)  Map의 모든 요소를 포함한 HashMap 객체 생성
 void clear()  모든 객체 제거
 Object clone()  현재 HashMap을 복제해서 반환
 boolean containsKey(Object key)  키가 포함되어 있는지 여부
 boolean containsValue(Object value)  값이 포함되어 있는지 여부
 Set entrySet()  저장된 키와 값을 엔트리(키와 값의 결합)의 형태로
 Set에 저장해서 반환
 Object get(Object key)  키에 대응하는 값을 반환
 못찾으면 null
 Object getOrDefault(
 Object key, Object defaultValue)
 키에 대응하는 값을 반환
 못찾으면 defaultValue를 반환
 boolean isEmpty()  HashMap이 비어있는지 여부
 Set keySet()  HashMap에 저장된 모든 키를 Set형태로 반환
 Object put(Object key, Object value)  키와 값을 저장
 void putAll(Map m)  Map의 모든 요소를 저장
 Object remove(Object key)  키와 대응하는 값 제거
 Object replace(
 Object key, Object value)
 키에 대응하는 값을 value로 교체
 boolean replace(Object key,
 Object oldValue, Object newValue)
 키와 값(oldValue)이 모두 일치하는 요소의 값을
 newValue로 교체
 int size()  저장된 요소의 개수를 반환
 Collection values()  HashMap에 저장된 모든 값을 컬렉션 형태로 반환


해싱과 해시함수
해싱이란 해시함수(hash function)를 이용해서 데이터를 해시테이블(hash table)에 저장하고 검색하는 기법을 말한다. 해시함수는 데이터가 저장되어 있는 곳을 알려주기 때문에 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다. 해싱을 구현한 컬렉션 클래스로는 HashSet, HashMap, Hashtable 등이 잇다. Hashtable은 컬렉션 프레임웍이 도입되면서 HashMap으로 대체되었으나 이전 소스와의 호환성 문제로 남겨두고 있다.

 

11. TreeMap

TreeMap은 이진 검색 트리의 형태로 키와 값의 상으로 이루어진 데이터를 저장한다. 그래서 검색과 정렬에 적합한 컬렉션 클래스이다. 검색은 대부분의 경우 HashMap이 더 성능이 좋으니 HashMap을 사용하고, 범위검색이나 정렬이 필요할 경우에는 TreeMap을 사용하자.

생성자 또는 메서드 설 명
 TreeMap()  TreeMap 객체 생성
 TreeMap(Comparator c)  c를 정렬기준으로 삼는 TreeMap 객체 생성
 TreeMap(Map m)  Map의 모든 요소를 포함하는 TreeMap 객체 생성
 TreeMap(SortedMap m)  m의 모든 요소를 포함하는 TreeMap 객체 생성
 Map.Entry ceilingEntry(Object key)  키와 일치하는 키와 값 쌍을 반환
 없으면 제일 가까운 큰 것의 키와 값 쌍을 반환
 없으면 null
 Object ceilingKey(Object key)  키와 일치하는 키를 반환
 없으면 제일 가까운 큰 것의 키를 반환
 없으면 null
 void clear()  저장된 모든 객체 제거
 Object clone()  현재 TreeMap을 복제해서 반환
 Comparator comparator()  정렬기준이 되는 Comparator 반환
 지정되지 않았다면 null 반환
 boolean containskey(Object key)  키가 포함되어 있는지 여부
 boolean containsValue(Object value)  값이 포함되어 있는지 여부
 NavigableSet descendingKeySet()  저장된 키를 역순정렬하여 NavigableSet에 담아 반환
 Set entrySet();  저장된 키와 값을 엔트리 형태로 Set에 담아 반환
 Map.Entry firstEntry()  저장된 첫번째 키와 값 쌍을 반환
 Object firstKey()  저장된 첫번째 키 반환
 Map.Entry floorEntry(Object key)  키와 일치하는 키와 값의 쌍을 반환
 없으면 제일 가까운 작은 것의 키와 값 쌍을 반환
 없으면 null
 Object floorKey(Object key)  키와 일치하는 키를 반환
 없으면 제일 가까운 작은 것의 키를 반환
 없으면 null
 Object get(Object key)  키의 값을 반환
 SortedMap headMap(Object toKey)  키보다 작은 객체들 반환 (toKey 미포함)
 NavigableMap headMap(
 Object toKey, boolean inclusive)
 키보다 작은 객체들 반환
 inclusive가 true면 toKey 포함
 Map.Entry higherEntry(Object key)  key보다 큰 키 중 제일 작은 키의 쌍 반환
 없으면 null
 Object higherKey(Object key)  key보다 큰 키 중 제일 작은 키 반환
 없으면 null
 boolean isEmpty()  TreeMap이 비어있는지 여부
 Set keySet()  저장된 모든 키를 Set에 담아 반환
 Map.Entry lastEntry()  저장된 마지막 쌍을 반환
 Object lastKey()  저장된 마지막 키를 반환
 Map.Entry lowerEntry(Object key)  key보다 작은 키 중 제일 큰 키의 쌍을 반환
 없으면 null
 Object lowerKey(Object key)  key보다 작은 키 중 제일 큰 키를 반환
 없으면 null
 NavigableSet navigableKeySet()  모든 키가 담긴 NavigableSet을 반환
 Map.Entry pollFirstEntry()  제일 작은 키의 쌍을 제거하면서 반환
 Map.Entry pollLastEntry()  제일 큰 키의 쌍을 제거하면서 반환
 Object put(Object key, Object value)  키와 값을 저장
 void putAll(map m)  Map에 저장된 모든 요소 저장
 Object remove(Object key)  일치하는 키의 쌍을 제거
 Object replace(Object key, Object value)  키에 해당하는 값을 value로 교체
 boolean replace(Object key,
 Object oldValue, Object newValue)
 키에 해당하는 값이 oldValue이면
 newValue로 교체
 int size()  저장된 요소의 개수 반환
 NavigableMap subMap(Object fKey,
 boolean fIn, Object tKey, boolean tIn)
 두 키 사이에 있는 모든 요소 반환
 fKey, tKey 포함 여부 : 각각 inclusive
 SortedMap subMap(
 Object fromKey, Object toKey)
 두 키 사이에 있는 모든 요소 반환
 toKey 미포함
 SortedMap tailMap(Object fromKey)  fromKey부터 마지막 요소까지 반환
 NavigableMap tailMap(
 Object fromKey, boolean inclusive)
 fromKey부터 마지막 요소까지 반환
 inclusive false면 fromKey미포함
 Collection values()  저장된 모든 값을 컬렉션 형태로 반환

 

12. Properties

Properties는 HashMap의 구버전인 HashTable을 상속받아 구현한 것으로 Hashtable은 키와 값을 (Object, Object)의 형태로 저장하는데 비해 Properties는 (String, String)의 형태로 저장하는 단순화된 컬렉션클래스이다. 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 스는 편리한 기능을 제공한다.

메서드 설명
 Properties()  Properties 객체 생성
 Properties(Properties defaults)  주어진 Properties의 모든 요소를 가진 객체 생성
 String getProperty(String key)  키의 값을 반환
 String getProperty(String key,
 String defaultValue)
 키의 값을 반환
 못찾으면 defaultValue 반환
 void list(PrintStream out)  지정된 Printstream에 저장된 목록을 출력
 void list(PrintWriter out)  지정된 PrintWriter에 저장된 목록을 출력
 void load(InputStream inStream)  지정된 InputStream으로부터 목록을 읽어 저장
 void load(Reader reader)  지정된 Reader로부터 목록을 읽어 저장
 void loadFromXML(InputStream in)  지정된 InputStream으로부터 XML문서를 읽고
 문서에 저장된 목륵을 저장
 Enumeration propertyNames()  목록의 모든 키가 담긴 Enumeration을 반환
 void save(OutputStream out,
 String header)
 deprecated되었으므로 store()을 사용하자
 Object setProperty(String key, String value)  지정된 키와 값을 저장
 이미 존재하면 value로 값을 교체
 void store(OutputStream out,
 String comments)
 저장된 목록을 OutPutStream에 출력
 comments는 목록에 대한 주석으로 저장 
 void stroe(Writer writer, String comments)  저장된 목록을 Writer에 출력
 comments는 목록에 대한 주석으로 저장
 void storeToXML(OutputStream os,
 String comment)
 저장된 목록을 XML문서로 출력
 comment는 목록에 대한 주석으로 저장
 void storeToXML(OutputStream os,
 String comment, String encoding)
 저장된 목록을 해당 인코딩의 XML문서로 출력
 comment는 목록에 대한 주석으로 저장
 Set stringPropertyNames()  저장되어 있는 모든 키를 Set에 담아 반환

 

13. Collections

Collections는 컬렉션과 관련된 메서드를 제공한다. fill(), copy(), sort(), binarySearch()등의 메서드는 Arrays에서 배운 것과 같다.

컬렉션의 동기화
멀티 쓰레드(multi-thread) 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 일관성을 유지하기 위해서 공유되는 객체에 동기화(synchronization)가 필요하다. Vector와 Hashtable과 같은 구버전의 클래스들은 자체적으로 동기화 처리가 되어 있는데 멀티쓰레드 프로그래밍이 아닌 경우에는 불필요한 기능이 되어 성능을 떨어뜨리는 요인이 된다. 그래서 새로 추가된 ArrayList와 HashMap과 같은 컬렉션은 동기화를 필요한 경우에만 java.util.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   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)​


싱글톤 컬렉션 만들기
단 하나의 객체만을 저장하는 컬렉션을 만들고 싶을 경우가 있다. 아래의 메서드를 사용하자.

static List singletonList(Object o)
static Set  singleton(Object o) // singletonSet이 아니다. 주의하자
static Map  singletonMap(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 queue, Class type)
static NavigableSet checkedNavigableSet(NavigableSet s, Class type)
static SortedSet    checkedSortedSet(SortedSet s, Class type)
static NavigableMap checkedNavigableMap(NavigableMap m, Class kt, Class vt)
static SortedMap    checkedSortedMap(SortedMap m, Class kt, Class vt)

// 사용법
List list = new ArrayList();
List checkedList = checkedList(list, String.class);
checkedList.add(new Integer(3)); // error. ClassCastException​


지네릭스(generics)를 배우면 컬렉션에 저장할 요소의 타입을 간단하게 제한할 수 있다. 하지만 이런 메서드를 제공하는 이유는 호환성 때문이다. 지네릭스는 JDK1.5부터 도입된 기능이고 그 이전에 작성된 코드를 사용할 때는 이 메서드가 필요할 수 있다.

 

14. 컬렉션 클래스 정리 & 요약

컬렉션 클래스간의 관게

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

 

728x90
반응형

'Study > JAVA' 카테고리의 다른 글

[Java] 12-1. 지네릭스(Generics)  (2) 2022.10.05
[Java] 11. 컬렉션 프레임웍(1)  (2) 2022.09.27
[Java] 10-3. java.time 패키지  (2) 2022.09.19
[Java] 10-1, 2. 날짜와 시간 & 형식화  (0) 2022.09.16
[Java] 9-2. 유용한 클래스  (0) 2022.09.14

댓글