컬렉션 프레임워크의 핵심: Set과 Map 인터페이스 이해
1. Set
인터페이스란?
Set
인터페이스는 Collection
인터페이스를 확장한 것으로, 다음의 주요 특징을 가지고 있습니다.
-
중복 불허 (No Duplicates): 동일한 요소를 여러 번 저장할 수 없습니다. 즉,
Set
에 추가되는 각 요소는 유일해야 합니다. -
순서 미보장 (Unordered Collection): 저장 순서를 보장하지 않습니다. 요소의 해시 코드에 따라 저장 위치가 결정되므로, 저장 순서와 실제 요소의 순서가 다를 수 있습니다.
-
null
값 허용:null
값을 하나만 저장할 수 있습니다.
Set
인터페이스는 중복된 데이터를 관리하지 않고 고유한 데이터 집합을 다뤄야 할 때 유용하게 사용됩니다.
예를 들어, 사용자 ID 목록, 이메일 주소 목록, 방문한 웹페이지 URL 목록 등을 Set
으로 관리할 수 있습니다.
1.1. Set
인터페이스의 주요 메서드
Set
인터페이스는 Collection
인터페이스에서 상속받은 메서드를 포함하여 다음과 같은 주요 메서드를 제공합니다.
- 요소 추가
add(E e)
: 지정된 요소를Set
에 추가합니다. 추가에 성공하면true
를 반환하고, 실패하면false
를 반환합니다. (요소가 이미 존재하는 경우)addAll(Collection<? extends E> c)
: 지정된 컬렉션의 모든 요소를Set
에 추가합니다.
- 요소 제거
remove(Object o)
: 지정된 요소를Set
에서 제거합니다.
- 요소 확인
contains(Object o)
: 지정된 요소가Set
에 포함되어있는지 확인합니다.
- 전체 삭제
clear()
:Set
의 모든 요소를 삭제합니다.
- 기타:
size()
:Set
에 저장된 요소의 개수를 반환합니다.isEmpty()
:Set
이 비어 있는지 확인합니다.iterator()
:Set
의 요소들을 순회할 수 있는Iterator
객체를 반환합니다.
1.2. HashSet
과 TreeSet
Set
인터페이스를 구현하는 주요 클래스로는 HashSet
과 TreeSet
이 있습니다.
HashSet
: 해시 테이블을 기반으로 구현되어 있어, 빠른 검색 속도를 제공하지만 저장 순서를 보장하지 않습니다.TreeSet
: 이진 검색 트리(특히, 레드-블랙 트리)를 기반으로 구현되어 있으며, 요소를 정렬된 상태로 유지하며, 범위 검색에 효율적입니다.
2. Map
인터페이스란 무엇일까요?
Map
인터페이스는 키(key)와 값(value)의 쌍으로 이루어진 데이터를 저장하고 관리하는 데 사용됩니다. Map
의 주요 특징은 다음과 같습니다.
- 키-값 쌍 (Key-Value Pair): 각 요소는 키와 값으로 이루어져 있으며, 키는 해당 값을 검색하기 위한 식별자 역할을 합니다.
- 고유한 키 (Unique Keys): 키는 중복될 수 없습니다. 즉, 하나의 키는 하나의 값에만 매핑될 수 있습니다. 같은 키로 새로운 값을 추가하면 이전 값은 덮어쓰여집니다.
- 값 중복 허용: 값은 중복될 수 있습니다. 여러 키가 같은 값에 매핑될 수 있습니다.
- 순서 미보장 (Unordered Collection): 기본적으로 저장 순서를 보장하지 않습니다. (일부 구현체에서는 순서를 보장하기도 합니다.)
Null
허용 : 키와 값 모두 null 값 허용 하지만, 키는 null 한개만 허용합니다.
Map
인터페이스는 키를 사용하여 데이터를 효율적으로 검색하고 관리해야 할 때 유용하게 사용됩니다. 예를 들어, 사용자 ID와 사용자 정보, 상품 이름과 상품 가격, 단어와 빈도수 등을 Map
으로 관리할 수 있습니다.
2.1. Map
인터페이스의 주요 메서드
Map
인터페이스는 다음과 같은 주요 메서드를 제공합니다.
- 요소 추가 및 변경
put(K key, V value)
: 지정된 키에 값을 매핑합니다. 키가 이미 존재하면 기존 값을 새로운 값으로 덮어씁니다.putAll(Map<? extends K, ? extends V> m)
: 주어진 Map의 모든 키-값 쌍을 Map에 추가합니다.
- 요소 접근
get(Object key)
: 주어진 키에 해당하는 값을 반환합니다. 키가 존재하지 않으면null
을 반환합니다.
- 요소 제거
remove(Object key)
: 지정된 키에 해당하는 키-값 쌍을Map
에서 제거합니다.
- 키 확인
*
containsKey(Object key)
: 지정된 키가Map
에 존재하는지 확인합니다. - 값 확인
*
containsValue(Object value)
: 지정된 값이Map
에 존재하는지 확인합니다. - 전체 데이터 접근
keySet()
:Map
에 저장된 모든 키를Set
형태로 반환합니다.values()
:Map
에 저장된 모든 값을Collection
형태로 반환합니다.entrySet()
:Map
에 저장된 모든 키-값 쌍을Set<Map.Entry<K, V>>
형태로 반환합니다.
- 전체 삭제
*
clear()
: Map의 모든 키-값 쌍을 삭제합니다. - 기타
size()
:Map
에 저장된 키-값 쌍의 개수를 반환합니다.isEmpty()
:Map
이 비어있는지 확인합니다.
2.2. Map.Entry
인터페이스
Map.Entry
인터페이스는 Map
인터페이스 내부에 정의된 중첩 인터페이스로, Map
에 저장된 키-값 쌍을 나타냅니다. entrySet()
메서드를 통해 Map
의 모든 키-값 쌍을 Set<Map.Entry<K,V>>
형태로 얻을 수 있습니다.
getKey()
:Map.Entry
의 키를 반환합니다.getValue()
:Map.Entry
의 값을 반환합니다.setValue(V value)
:Map.Entry
의 값을 주어진 값으로 설정하고 이전 값을 반환합니다.
2.3. HashMap
과 TreeMap
Map
인터페이스의 대표적인 구현 클래스는 HashMap
과 TreeMap
입니다.
HashMap
: 해시 테이블을 기반으로 구현되어 있어, 키를 사용한 검색 속도가 빠르지만, 키의 저장 순서를 보장하지 않습니다.TreeMap
: 이진 검색 트리를 기반으로 구현되어 있어 키를 정렬된 상태로 유지하며, 범위 검색에 효율적입니다.
3. Set
과 Map
사용 예시
다음은 Set
과 Map
인터페이스를 사용하여 중복을 제거하고, 사용자 정보를 관리하는 간단한 예시입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Set을 사용하여 중복된 사용자 ID 제거
Set<String> userIds = new HashSet<>();
userIds.add("user1");
userIds.add("user2");
userIds.add("user1");
System.out.println(userIds); // 출력: [user2, user1] (순서 보장 X)
// Map을 사용하여 사용자 정보 관리
Map<String, String> userInfo = new HashMap<>();
userInfo.put("user1", "Alice");
userInfo.put("user2", "Bob");
userInfo.put("user3", "Charlie");
System.out.println(userInfo); // 출력: {user3=Charlie, user2=Bob, user1=Alice} (순서 보장 X)
System.out.println(userInfo.get("user2")); // 출력: Bob
Leave a comment