Map이란 ?
Map은 해시 테이블(hash table)로 구현됩니다.
해시 테이블은 키(key)를 해시 함수(hash function)를 사용하여 배열의 인덱스로 변환하고, 해당 인덱스에 값을 저장합니다. 이렇게 함으로써, 매우 빠른 검색과 삽입 연산이 가능해집니다.
해시 함수를 통해 계산된 인덱스를 기반으로 값을 배열에 저장하기 때문에, 일반적으로 맵의 검색(Search) 및 삽입(Insertion) 연산의 시간 복잡도는 O(1)에 가깝습니다. 또한 동일한 key 에 다른 데이터 value가 저장되어 있을 경우 기존에 저장된 데이터는 덮어씌워져 사라진다. 따라서, 중복된 key는 존재할 수 없다.
JAVA에서의 Map 구현
Java에서 Map은 다양한 내부 구현체를 가질 수 있습니다. 대표적으로 HashMap, TreeMap, LinkedHashMap 등이 있습니다. 각각의 내부 구현은 다르지만 보통 해시 테이블(Hash Table) 또는 트리(Tree) 구조를 기반으로 합니다.
HashMap
HashMap은 해시 테이블을 기반으로 합니다. 키-값 쌍은 해시 함수를 사용하여 해시 코드로 매핑되며, 이 해시 코드를 기반으로 배열의 인덱스를 계산하여 값을 저장하고 검색합니다. 충돌이 발생할 경우, 체이닝(Chaining) 또는 개방주소방식(Open Addressing) 등의 방법을 사용하여 해결할 수 있습니다.
HashMap 사용 예제
import java.util.HashMap;
class HashMapExample {
@DisplayName("HashMap Example")
@Test
public void hashMapEx() throws Exception {
//given
// HashMap 생성: 이름(String)을 키로, 나이(Integer)를 값으로 갖습니다.
HashMap<String, Integer> people = new HashMap<>();
// 데이터 추가
people.put("Alice", 30);
people.put("Bob", 25);
people.put("Charlie", 35);
//when, then
String nameToFind = "Bob";
if (people.containsKey(nameToFind)) {
int age = people.get(nameToFind);
System.out.println(nameToFind + "의 나이는 " + age + "세 입니다.");
} else {
System.out.println(nameToFind + "에 대한 정보를 찾을 수 없습니다.");
}
System.out.println("\n사람들의 정보:");
for (String name : people.keySet()) {
int age = people.get(name);
System.out.println(name + ": " + age + "세");
}
}
}
TreeMap
TreeMap은 레드-블랙 트리(Red-Black Tree)를 사용하여 내부적으로 데이터를 저장합니다. 이진 트리의 형태를 띄며, 키를 기준으로 정렬된 상태를 유지합니다. 이로 인해 검색, 삽입, 삭제 연산이 일정한 시간 복잡도 내에서 수행됩니다.
TreeMap 사용 예제
import java.util.TreeMap;
class MapExample {
@DisplayName("TreeMap Example")
@Test
public void treeMapEx() throws Exception {
//given
TreeMap<String, Integer> people = new TreeMap<>();
// 데이터 추가
people.put("Alice", 30);
people.put("Bob", 25);
people.put("Charlie", 35);
//when,then
// 이름을 사용하여 해당하는 나이 검색
String nameToFind = "Bob";
if (people.containsKey(nameToFind)) {
int age = people.get(nameToFind);
System.out.println(nameToFind + "의 나이는 " + age + "세 입니다.");
} else {
System.out.println(nameToFind + "에 대한 정보를 찾을 수 없습니다.");
}
// 모든 사람의 이름과 나이 출력 (정렬된 순서로 출력됨)
System.out.println("\n사람들의 정보:");
for (String name : people.keySet()) {
int age = people.get(name);
System.out.println(name + ": " + age + "세");
}
}
}
테스트 출력문을 보면 Key(이름)가 정렬 되어 출력되는 것을 볼 수 있다.
LinkedHashMap
LinkedHashMap은 해시 테이블과 연결 리스트의 조합으로 이루어져 있습니다. 해시 테이블을 사용하여 빠른 검색을 지원하면서, 연결 리스트를 사용하여 순서를 유지합니다.
LinkedHashMap 사용 예제
import java.util.LinkedHashMap;
class MapExample {
@DisplayName("LinkedHashMap Example")
@Test
public void linkedHashMapEx() throws Exception {
//given
LinkedHashMap<String, Integer> people = new LinkedHashMap<>();
// 데이터 추가
people.put("Alice", 30);
people.put("Bob", 25);
people.put("Charlie", 35);
//when,then
// 이름을 사용하여 해당하는 나이 검색
String nameToFind = "Bob";
if (people.containsKey(nameToFind)) {
int age = people.get(nameToFind);
System.out.println(nameToFind + "의 나이는 " + age + "세 입니다.");
} else {
System.out.println(nameToFind + "에 대한 정보를 찾을 수 없습니다.");
}
// 모든 사람의 이름과 나이 출력 (정렬된 순서로 출력됨)
System.out.println("\n사람들의 정보:");
for (String name : people.keySet()) {
int age = people.get(name);
System.out.println(name + ": " + age + "세");
}
}
}
입력 순서대로 출력되는 것을 확인할 수 있다.
'JAVA' 카테고리의 다른 글
@Annotation 이란 무엇인가? (0) | 2024.03.09 |
---|---|
JVM 이란 무엇인가 ? (0) | 2024.03.06 |