상세 컨텐츠

본문 제목

Set, Map 컬렉션

기록 - 프로그래밍/Java

by wjjun 2024. 2. 9. 01:09

본문

 

Set 컬렉션

List 컬렉션은 저장 순서를 유지하지만 Set 컬렉션은 저장 순서가 유지되지 않습니다. 객체를 중복해서 저장할 수 없고 하나의 null만 저장 가능합니다. Set 컬렉션은 집합에 비유될 수 있습니다. 집합의 특성은 순서와 상관없고 중복이 허용되지 않습니다.

기능 메서드 설명
객체추가 boolean(E e) 주어진 객체를 저장, 객체가 성공적으로 저장되면 true 리턴합니다. 중복 객체면 false 리턴
객체검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
isEmpty() 컬렉션이 비어있는지 조사
Iterator<E> iterator() 저장된 객체를 한번씩 가져오는 반복자 리턴
int size() 저장되어 있는 전체 객체 수 리턴
객체 삭제 void clear() 저장된 모든 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

 

Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메서드가 없습니다. 대신 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자를 제공합니다.

리턴 타입 메서드명 설명
boolean hasNext() 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다
E next() 컬렉션에 하나의 객체를 가져온다
void remove() Set 컬렉션에서 객체를 제거한다

Iterator를 사용하지 않더라도 향상된 for문을 이용하여 전체 객체를 대상으로 반복할 수 있습니다.

Set<String> set = ...;
for(String str : set) { }

 

 

HashSet 

타입 파라미터 E에는 컬렉션에 저장할 객체 타입을 지정하면 됩니다.

Set<E> set = new HashSet<E>();
Set<String> set = new HashSet<String>();

 

HashSet은 객체를 저장하기 전 먼저 객체의 hashCode() 메서드를 호출해 해시코드를 얻습니다. 그리고 기존 저장된 객체들의 해시코드와 비교합니다. 동일한 해시코드가 있디면 equals() 메서드로 두 객체를 비교해서 true가 나오면 동일 객체로 판단하여 중복 저장하지 않습니다.

 

 

Map 컬렉션

키와 값으로 구성된 Entity 객체를 저장하는 구조입니다. 키는 중복될 수 없지만 값은 중복될 수 있습니다. Map 컬렉션에는 HashMap, HashTable, LinkedHashMap, Properties, TreeMap 등이 있습니다.

기능 메서드 설명
객체추가 V put(K key, V value) 주어진 키와 값을 추가, 저장되면 값을 리턴
객체검색 boolean containsKey(Object key) 주어진 키가 있는지 여부
객체탐색 boolean containsValue(Object value) 주어진 값이 있는지 여부
Set<Map.Entry<K,V>> entrySet() 주어진 키가 있는 값을 리턴
V get(Object key) 주어진 키가 있는 값을 리턴
boolean isEmpty() 컬렉션이 비어있는지 여부
Set<K> keySet() 모든 키를 Set 객체에 담아서 리턴
Collection<V> values() 저장된 모든 값을 Collection에 담아 리턴
void clear() 모든 Map.Entry(키와 값)을 삭제
V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

위 표에서 메서드의 매개 변수 타입과 리턴 타입에 K와 V라는 타입 파라미터가 있습니다. 이것은 Map 인터페이스가 제네릭 타입이기 때문입니다. 구체 타입은 구현 객체를 생성할 때 결정됩니다. 객체 추가는 put() 메서드를 사용하고, 키로 객체를 찾아올 때는 get() 메서드를 사용합니다. 그리고 객체 삭제는 remove() 메서드를 사용합니다.

 

entrySet() 메서드로 모든 Map.Entry를 Set 컬렉션으로 얻은 다음 반복자로 Map.Entry를 하나씩 얻고 getkey()와 getValue() 메서드를 이용해 키와 값을 얻으면 됩니다.

Set<Map.Entry<K, V>> entrySet = map.entrySet();
Iterator<Map.Entry<K, V>> entryIterator = entrySet.iterator();
while(entryIterator.hashNext()) {
    Map.Entry<K, V> entry = entryIterator.next();
    K key = entry.getKey();
    V value = entry.getValue();
}

 

HashMap

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. HashMap의 키로 사용할 객체는 hashCode()와 equals() 메서드를 재정의해서 동등 객체가 될 조건을 정해야 합니다.

 

HashTable

HashMap과 동일한 내부 구조를 갖고 있습니다. Hashtable도 키로 사용할 객체는 hashCode()와 equals() 메서드를 재정의해서 동등 객체가 될 조건을 정해야 합니다. HashMap과 차이점은 Hashtable은 동기화된 메서드로 구성되어 있어 멀티 스레드가 동시에 이 메소드를 실행할 수 없습니다. 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있습니다. 멀티 스레드 환경에서 스레드 안전하게 객체를 추가, 삭제할 수 있습니다. 

 

Properties

Hashtable의 하위 클래스로 Hashtable의 모든 특징을 그대로 갖고 있습니다. 차이점은 Hashtable은 키와 값을 다양한 타입으로 지정 가능한데 Properties는 키와 값을 String 타입으로 제한된 컬렉션입니다. 주로 애플리케이션 옵션 정보, DB 연결정보 등의 파일을 읽을 때 사용됩니다. 프로퍼티의 키와 값은 = 기호로 연결합니다.

관련글 더보기

댓글 영역