본문으로 바로가기
반응형

Java의 Collection Framework는 다양한 자료구조를 제공하며, 이 중 Set과 Map 인터페이스가 포함됩니다. 이러한 인터페이스는 다양한 구현을 가지고 있어, 여러 요구 사항에 따라 선택하여 사용할 수 있습니다. 이 포스트에서는 Set<String>과 Map<String, ?>의 주요 구현에 대해 다루며, 각각의 특징을 예를 통해 설명합니다.

1. Set<String> 자료구조
1.1 HashSet<String>
특징: 가장 일반적으로 사용되는 Set 구현체. 내부적으로 HashMap을 사용하여 데이터를 저장합니다. 중복 없이 데이터를 저장하며, 순서를 보장하지 않습니다.

예제:

Set<String> hashSet = new HashSet<>();
hashSet.add("A");
hashSet.add("B");
hashSet.add("A");  // 중복이므로 추가되지 않음
System.out.println(hashSet);  // [A, B]

1.2 LinkedHashSet<String>
특징: HashSet의 확장 버전. 추가 순서대로 데이터를 저장합니다.
예제:

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("A");
linkedHashSet.add("B");
linkedHashSet.add("C");
System.out.println(linkedHashSet);  // [A, B, C]

1.3 TreeSet<String>
특징: 자연 순서 또는 지정된 comparator에 따라 데이터를 정렬하여 저장합니다.
예제:

Set<String> treeSet = new TreeSet<>();
treeSet.add("C");
treeSet.add("A");
treeSet.add("B");
System.out.println(treeSet);  // [A, B, C]

2. Map<String, ?> 자료구조
2.1 HashMap<String, String>
특징: 가장 일반적으로 사용되는 Map 구현체. 키-값 쌍을 저장하며, 순서를 보장하지 않습니다.
예제:

Map<String, String> hashMap = new HashMap<>();
hashMap.put("A", "Apple");
hashMap.put("B", "Banana");
System.out.println(hashMap);  // {A=Apple, B=Banana}

2.2 LinkedHashMap<String, String>
특징: HashMap의 확장 버전. 추가 순서대로 키-값 쌍을 저장합니다.
예제:

Map<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("A", "Apple");
linkedHashMap.put("B", "Banana");
linkedHashMap.put("C", "Cherry");
System.out.println(linkedHashMap);  // {A=Apple, B=Banana, C=Cherry}

2.3 TreeMap<String, String>
특징: 자연 순서 또는 지정된 comparator에 따라 키를 정렬하여 키-값 쌍을 저장합니다.
예제:

Map<String, String> treeMap = new TreeMap<>();
treeMap.put("C", "Cherry");
treeMap.put("A", "Apple");
treeMap.put("B", "Banana");
System.out.println(treeMap);  // {A=Apple, B=Banana, C=Cherry}

이러한 자료구조들은 Java에서 데이터를 조직화하고 관리하기 위한 핵심 도구입니다. 구현체 선택 시 특정한 요구 사항, 예를 들어 순서 보장, 정렬 필요성 등을 고려하여 적합한 자료구조를 선택하는 것이 중요합니다.

Set 및 Map을 활용한 주요 사용 사례 및 동작 방식

Java의 Set 및 Map 구현체들은 여러 가지 사용 사례에서 유용하게 활용됩니다. 아래에는 몇 가지 주요 사용 사례를 기반으로 각 구현체를 어떻게 활용할 수 있는지 설명합니다.

1. 중복 제거
Set은 고유한 요소만을 저장하는 특징을 가지므로, 주어진 컬렉션의 중복 요소를 제거하는데 사용될 수 있습니다.

예제:

List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry", "Apple", "Banana");
Set<String> uniqueFruits = new HashSet<>(fruits);
System.out.println(uniqueFruits);  // [Apple, Banana, Cherry]

2. FIFO (First-In-First-Out)
FIFO는 가장 먼저 들어온 데이터가 가장 먼저 나가는 순서를 의미합니다. LinkedHashMap은 데이터를 입력한 순서대로 저장하므로, FIFO를 구현하는데 사용될 수 있습니다.

예제:

Map<String, String> fifoMap = new LinkedHashMap<>();
fifoMap.put("first", "1st");
fifoMap.put("second", "2nd");
fifoMap.put("third", "3rd");
System.out.println(fifoMap.keySet().iterator().next());  // "first"

3. FILO (First-In-Last-Out) or LIFO (Last-In-First-Out)
FILO 또는 LIFO는 가장 먼저 들어온 데이터가 가장 나중에 나가는 순서를 의미합니다. 이를 구현하기 위해 ArrayDeque (더블 엔드 큐)와 같은 자료구조를 사용할 수 있습니다. 그러나 LinkedHashMap의 특정 조작을 통해 비슷한 행동을 수행할 수도 있습니다.

예제:

Map<String, String> filoMap = new LinkedHashMap<>();
filoMap.put("first", "1st");
filoMap.put("second", "2nd");
filoMap.put("third", "3rd");

List<String> keys = new ArrayList<>(filoMap.keySet());
System.out.println(keys.get(keys.size() - 1));  // "third"

4. 정렬된 순서
TreeSet 및 TreeMap은 자연 순서로 요소 및 키를 정렬합니다. 사용자 정의 정렬이 필요한 경우, Comparator를 제공하여 원하는 정렬을 구현할 수 있습니다.

예제:

Set<String> sortedFruits = new TreeSet<>(Comparator.reverseOrder());
sortedFruits.add("Apple");
sortedFruits.add("Banana");
sortedFruits.add("Cherry");
System.out.println(sortedFruits);  // [Cherry, Banana, Apple]

이처럼 Java의 Set 및 Map 구현체들은 다양한 데이터 관리 및 조작 작업을 수행하는 데 사용될 수 있습니다. 원하는 작업에 적합한 구현체를 선택하는 것이 중요합니다.

 

반응형