[Java] 자바 101 강의 #13 ( Map형 )
- Lecture/Java 강의
- 2022. 5. 1.
자바의 Map형은 파이썬(Python)의 딕셔너리(Dictionary) 구조와 유사한 구조입니다. 복잡한 데이터를 저장하는 역할도 하지만, Key값과 Value형태로 이루어져서 데이터를 쉽게 찾아주는 역할도 수행합니다.
수많은 Map 형태의 구조중에 가장 많이 활용하는 것은 HashMap과 LinkedHashMap 정도가 될 수 있습니다. 물론 개발 업종에 따라 TreeMap이나 HashTable이 사용되기도 하지만, 일반적으로는 2가지가 가장 많이 활용이 됩니다.
Map의 사용방법
map.put(키, 값); // 키와 값 저장
map.get(키); // 키를 기준으로 값을 가져온다
map.remove(키); // 키 값을 기준으로 값을 삭제한다
물론 위의 사용법보다 훨씬 많은 기능들이 있지만, 대표적으로 3가지를 많이 활용합니다.
Map의 예시
public static void main(String[] args) {
Map<String, Integer> indexMap = new HashMap<> ();
for(int i = 2; i <= 9; i++) {
for(int j = 1; j <= 9; j++) {
// 구구단 저장
indexMap.put(i + "_" + j, (i*j));
}
}
System.out.println("3 곱하기 4는 ? " + indexMap.get("3_4"));
indexMap.remove("3_4");
System.out.println("3 곱하기 4는 ? " + indexMap.get("3_4"));
}
실행 결과
위의 실행 결과는 Map의 가장 기본적인 추가, 가져오기, 삭제에 대해서 이해를 돕기 위한 예시 결과이며, 이제 Map의 존재 이유인 역할에 대해서 알아보겠습니다.
Map의 역할
Map은 Key와 Value로 구성이 되어 있습니다. 그러다보니 특정 키 값을 기준으로 특정 Value를 찾는 Index의 역할을 수행할 수도 있고, 순수하게 데이터를 저장하기 위한 역할이 있을 수 있습니다.
색인 역할
위의 예시에서 구구단을 뽑기 위해서 값을 미리 저장한 모습을 볼 수 있는데 여기서 Map의 역할을 내가 원하는 키에 대한 Value를 확인하기 위함입니다. 즉 데이터의 저장의 역할보다 Index로 인한 값을 찾는 역할이 큰 것이죠.
저장 역할
Map은 Key와 Value 형태로 되어 있기 때문에 데이터를 구조에 맞게 저장하기 상당히 유용합니다. 예를 들어, 우리가 회원가입을 할 때 아이디, 패스워드, 이름, 이메일 등등을 Map에 저장을 하고 이것을 DB에 저장을 할수 있습니다. 혹은 게시판의 내용들을 Map에 담고 또 이것을 List에 담아서 최종적으로 게시판 리스트 형태로 뿌릴 수 있습니다.
회원에 대한 정보를 Map으로 입력 받았을 때 가정
public static void main(String[] args) {
Map<String, Object> memberMap = new HashMap<>();
memberMap.put("name", "홍길동");
memberMap.put("email", "gildonghong.korea.net");
memberMap.put("phone", "010-1111-2222");
memberMap.put("age", 28);
System.out.println(memberMap);
}
{phone=010-1111-2222, name=홍길동, email=gildonghong.korea.net, age=28}
Map은 이렇듯 거의 대부분의 데이터 구조에 사용하게 되며, Set은 물론이고 List보다도 많이 사용될 수 있는 구조입니다.
Map 종류별 사용 이유
종류 | 사용 이유 |
HashMap | 요소의 순서를 유지할 필요가 없고 단일 스레드 환경에서 작업할 때 사용 |
LinkedHashMap | 요소의 삽입 순서를 유지해야 하고, 단일 스레드 환경에서 작업할 때 사용 |
TreeMap | 요소의 오름차순을 유지해야 하고 단일 스레드 환경에서 작업할 때 사용 |
HashTable | 요소의 순서를 유지할 필요가 없고 다중 스레드 환경에서 작업할 때 사용 |
일반적으로는 HashMap을 가장 많이 사용하며, 데이터를 순서대로 저장을 해야 하거나 하고 싶을 경우 LinkedHashMap을 사용합니다. TreeMap의 경우 키값에 대한 오름차순을 유지해야 할 때에 사용하는데 이런 케이스가 흔하지 않기 때문에 잘 사용하지 않습니다.
HashTable의 경우 Map에서 가장 먼저 구현되었으며, HashTable 이후 HashMap이 구현되었습니다. 즉 HashMap이 HashTable 이후에 나온 상위 버전 개념이며, 많은 부분에서 HashMap이 장점이 많습니다.
아래는 HashMap과 HashTable의 차이점 입니다.
- Hashtable은 동기화 되지만 HashMap은 동기화되지 않기에 HashMap의 경우 스레드가 아닌 응용 프로그램에 더 성능이 좋습니다.
- Hashtable은 null 키 또는 값을 허용하지 않지만, HashMap은 하나의 null의 키와 임의의 수의 null 값을 허용합니다.
- HashMap의 하위 클래스 중 LinkedHashMap이므로 예측 가능한 반복 순서를 원할 경우 HashMap을 LinkedHashMap으로 쉽게 바꿀 수 있습니다.
그리고 HashMap의 thread-safe를 하고 싶을 경우, Collections.synchronizedMap()으 사용하면 됩니다.
References
[1] https://www.w3schools.blog/hashmap-linkedhashmap-treemap-hashtable-java
'Lecture > Java 강의' 카테고리의 다른 글
[Java] 자바 101 강의 #14 ( 반복문 for형 ) (0) | 2022.05.02 |
---|---|
[Java] 자바 101 기초 강의 #12 ( Set형 ) (0) | 2022.04.27 |
[Java] 자바 101 기초 강의 #11 ( List형 ) (0) | 2022.04.26 |
[Java] 자바 101 강의 #10 ( Switch문 사용하기 ) (0) | 2022.04.25 |
[Java] 자바 101 강의 #9 ( IF 조건문, 성적 등급 프로그램 ) (0) | 2022.04.22 |