3. Map<K, V>
키(key)와 값(value)의 쌍으로 데이터를 저장하는 인터페이스입니다. 키는 중복될 수 없고, 값은 중복이 가능합니다. List의 index처럼 Map의 key를 가지고 데이터에 접근하기 때문에 중복이 될 수 없습니다. 대표적인 클래스로는 HashMap, TreeMap, LinkedHashMap, HashTable 등이 있습니다.
Collection과는 별개의 interface입니다 ( List, Set과 기본 메서드가 다릅니다.) Key-Value 한 쌍을 Entry라고 부릅니다. 실제로 엔트리를 저장하는 type도 Entry로 저장되어 있는데, Map의 이너로 저장되어 있어 Map.Entry로 한 쌍의 데이터를 저장할 수 있습니다.

- Map<K, V> 컬렉션의 특징
- 키-값 쌍 저장: Map은 키와 값의 쌍을 저장합니다. 각 키는 유일해야 하며, 중복된 키의 저장을 허용하지 않습니다. 따라서 키를 기반으로 값을 검색하거나 업데이트할 수 있습니다.
- 순서 보장 여부: 일반적으로 Map은 저장 순서를 보장하지 않습니다. 데이터를 저장한 순서대로 순회할 수 없으며, 순서에 의존하는 작업을 수행할 때는 LinkedHashMap을 사용하는 것이 좋습니다. 그러나 자바 8부터는 LinkedHashMap의 일부 메소드에 순서를 보장하는 기능을 추가하여 순서를 보장할 수도 있습니다.
- 허용하는 키와 값의 종류: Map은 null 값을 키와 값으로 사용할 수 있습니다. 또한, 일부 구현체에서는 키와 값의 타입에 제한을 두지 않고 모든 종류의 객체를 사용할 수 있습니다.
- 효율적인 검색과 업데이트: Map은 키를 기반으로 값을 검색하는데 매우 효율적입니다. 내부적으로 해시 맵(HashMap)이 가장 일반적으로 사용되며, 해시 함수를 이용하여 키의 해시코드를 생성하고 배열에 저장함으로써 빠른 검색과 업데이트를 제공합니다.
- 다양한 구현체: 자바에서는 Map 인터페이스를 구현한 여러 가지 구현체를 제공합니다. HashMap, LinkedHashMap, TreeMap 등이 있으며, 각각의 구현체는 특정한 용도에 맞게 최적화되어 있습니다. 사용하는 상황과 요구사항에 따라 적절한 구현체를 선택할 수 있습니다.
- 키-값 쌍 저장: Map은 키와 값의 쌍을 저장합니다. 각 키는 유일해야 하며, 중복된 키의 저장을 허용하지 않습니다. 따라서 키를 기반으로 값을 검색하거나 업데이트할 수 있습니다.
✅ 대표적인 Map<K, V> 컬렉션의 클래스
- HashMap <K, V> : 해시 함수를 사용하여 키를 해시코드로 변환하고, 이를 기반으로 내부 배열에 키-값 쌍을 저장합니다.
해시 함수는 키의 해시코드를 생성하는 역할을 수행하며, 해시코드는 내부 배열의 인덱스로 사용됩니다. 저장공간을 동적으로 관리하며 디폴트값은 16이며, 원소가 16을 넘는 경우 자동으로 저장공간을 확대합니다. 이를 통해 매우 빠른 검색과 삽입 속도를 제공합니다.
- 중복된 키를 허용하지 않음 : HashMap은 각 키는 유일해야 하며, 중복된 키의 저장을 허용하지 않습니다. 중복된 키를 사용할 경우, 기존 값은 새 값으로 대체됩니다.
- 순서를 보장하지 않음 : HashMap은 내부 배열에 키-값 쌍을 저장하는 방식으로 동작하며, 저장 순서를 보장하지 않습니다. 입력의 순서와 출력의 순서는 동일하지 않을 수 있습니다. (key 값이 Set으로 관리) 따라서 저장된 순서에 의존하는 작업에는 LinkedHashMap을 사용하는 것이 좋습니다.
- 중복된 키를 허용하지 않음 : HashMap은 각 키는 유일해야 하며, 중복된 키의 저장을 허용하지 않습니다. 중복된 키를 사용할 경우, 기존 값은 새 값으로 대체됩니다.
- HashTable<K, V> : 효율적인 데이터 구조 중 하나로, 키-값 쌍의 저장과 검색에 사용되는 자료구조입니다. 각각의 키(key)는 해시 함수를 통해 고유한 정수 값으로 매핑되고, 이 정수 값을 인덱스로 사용하여 값을 저장하거나 검색할 수 있습니다.
4. Stack<E>
Stack<E> 컬렉션은 Vecter<E> 클래스의 자식 클래스이며, 유일하게 클래스입니다. List<E>의 자식이기 때문에 List라고도 할 수 있기 때문에 List<E>의 기본 메서드의 사용이 가능합니다. Stack<E> 컬렉션은 제네릭(Generic) 타입으로 정의되어 있으며, E는 스택에 저장되는 요소의 타입을 의미합니다. 예를 들어, Stack<Integer>는 정수형 요소를 저장하는 스택을 나타냅니다.
Stack<E> 컬렉션은 후입선출(LIFO, Last-In-First-Out) 원칙을 따르는 데이터 구조입니다. 나중에 들어간 데이터가 가장 먼저나오는 구조입니다. 스택은 요소의 삽입과 삭제가 한쪽 끝에서만 이루어지는 선형 자료구조로, 가장 최근에 추가된 요소가 가장 먼저 제거되는 동작 방식을 가지고 있습니다. Stack<E> = Vector<E>의 기본기능 + LIFO 기능 추가 (5개 메서드) push() , peek(), pop(), serach(), empty() 추가된 5개의 메서드를 사용하기 위해서는 꼭 Stack<E> 타입으로 선언해야 합니다.
Stack<E> 컬렉션은 다음과 같은 주요한 메서드를 제공합니다:
- push(E item): 스택의 맨 위에 요소를 추가합니다.
- pop(): 스택의 맨 위에 있는 요소를 제거하고 반환합니다.
- peek(): 스택의 맨 위에 있는 요소를 반환합니다. 실제로 데이터를 꺼내는 것은 아니기때문에 데이터의 변화는 없습니다.
- empty(): 스택이 비어 있는지 여부를 확인합니다.
- search(Object o): 지정된 요소를 스택에서 검색하고 상대적 위치(1부터 시작)를 반환합니다. 없는 요소를 출력하면 -1 을 리턴합니다.
'[ BACKEND] > JAVA_컬렉션 프레임워크' 카테고리의 다른 글
[JAVA] 람다식 (0) | 2023.07.12 |
---|---|
[JAVA] 컬렉션 프레임워크 Set<E> (0) | 2023.07.09 |
[JAVA] 컬렉션 프레임워크 List<E> (1) | 2023.07.05 |
[JAVA] 제네릭 클래스 vs 제네릭 메서드의 차이 (0) | 2023.07.04 |
[JAVA] GENERIC (제네릭) 이란 ? (1) | 2023.07.03 |