컬렉션 프레임워크의 핵심: 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. HashSetTreeSet Set 인터페이스를 구현하는 주요 클래스로는 HashSetTreeSet이 있습니다.

  • 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. HashMapTreeMap Map 인터페이스의 대표적인 구현 클래스는 HashMapTreeMap입니다.

  • HashMap: 해시 테이블을 기반으로 구현되어 있어, 키를 사용한 검색 속도가 빠르지만, 키의 저장 순서를 보장하지 않습니다.
  • TreeMap: 이진 검색 트리를 기반으로 구현되어 있어 키를 정렬된 상태로 유지하며, 범위 검색에 효율적입니다.

3. SetMap 사용 예시

다음은 SetMap 인터페이스를 사용하여 중복을 제거하고, 사용자 정보를 관리하는 간단한 예시입니다.

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

Categories:

Updated:

Leave a comment