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 구현체들은 다양한 데이터 관리 및 조작 작업을 수행하는 데 사용될 수 있습니다. 원하는 작업에 적합한 구현체를 선택하는 것이 중요합니다.
'Programing > JAVA' 카테고리의 다른 글
추상클래스를 구현하면 @Override를 안붙혀도 되나? (0) | 2023.09.21 |
---|---|
제네릭, 그 시작은 (0) | 2023.09.20 |
ByteBuffer를 활용하여 Protocol Data 파싱하기 (0) | 2023.08.24 |
리팩토링...java... (0) | 2023.08.06 |
테스트 주도 개발(TDD)_예제를 통한 설명 (0) | 2023.07.28 |