이 영역을 누르면 첫 페이지로 이동
codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

페이지 맨 위로 올라가기

codesche's blog

[자료구조]Map 인터페이스

  • 2023.01.11 01:20
  • 알고리즘 지식/자료구조

보통 객체들을 저장하는데 key를 붙여서 저장하는 방식을 Map 인터페이스라고 합니다. Map 객체는 (key, value)의 쌍으로 저장합니다. 이러한 (key, value) 쌍인 객체는 Map.Entry 타입의 객체이며 key와 value는 모두 객체로 이루어져 있습니다. key는 중복이 불가능 하지만 value는 중복저장이 가능합니다. 이렇게 Map은 데이터를 찾아갈 수 있는 key와 실제 데이터인 value를 저장한다고 해서 Dictionary라고도 부릅니다. Map 인터페이스를 구현한 구현 클래스는 HashMap, Hashtable, TreeMap, LinkedHashMap 등이 있습니다.

 

HashMap은 key의 순서를 알 수 없고, TreeMap은 key의 순서가 크기 순이며 LinkedHashMap은 key의 순서가 저장된 순서입니다.

 

저장하고 싶은 데이터, 값이 value가 되고 이 값을 다시 가져오는 경우 필요한 것이 key입니다. 예를 들어 각 방에 값을 담아두고 열쇠로 잠궜을 때 다시 값을 가져오려면 열쇠가 필요합니다. 이 열쇠는 당연히 다른 방 열쇠와 겹치면 안 되며 유일한 키여야 합니다. 동일한 key에 데이터를 2번 이상 저장하면 두번째 부터는 데이터가 업데이트 됩니다.

 

○ Map 인터페이스의 주요 메서드

V put(K key, V value) - 키와 값으로 추가, 추가된 값으로 리턴

boolean containsKey(Object key) - 키가 존재하는지 여부

boolean containsValue(Object value) - 값이 존재하는지 여부

Set entrySet() - 키와 값의 모든 요소를 set으로 리턴

V get(Object key) - 키로 값을 가져옴

boolean isEmpty() - 비었는지 여부 확인

Set keySet() - 모든 키를 set객체로 리턴

int size() - 키의 수

Collection values() - 모든 값을 Collection으로 리턴

void clear() - 모든 키와 값 삭제

V remove(Object key) - 해당 키의 키와 값 삭제, 삭제된 값 리턴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.HashMap;
import java.util.Map;
 
public class Main {
 
    public static void main(String[] args) {
        // Map 객체 생성 - 제네릭을 해주면 훨씬 명확하다
        Map<String, Integer> map = new HashMap();
 
        // 이름이 담긴 문자열 배열 생성
        String[] names = {"홍길동", "김유신", "을지문덕", "강감찬", "김유신"};
 
        // 숫자가 담긴 정수 배열 생성
        int[] nums = {1234, 4567, 2350, 9870, 2345};
 
        // Map 객체에 두 배열의 값들을 키와 밸류 쌍으로 저장
        for (int i = 0; i < names.length; i++) {
            map.put(names[i], nums[i]);
        }
 
        // 출력
        System.out.println(map);
        System.out.println("홍길동 번호 : " + map.get("홍길동"));
        System.out.println("을지문덕 번호 : " + map.get("을지문덕"));
        System.out.println("김유신 번호 : " + map.get("김유신"));
    }
 
}
 
Colored by Color Scripter
cs

[실행 결과]

{홍길동=1234, 김유신=2345, 을지문덕=2350, 강감찬=9870}
홍길동 번호 : 1234
을지문덕 번호 : 2350
김유신 번호 : 2345

 

key값으로 저장된 객체를 검색하기 위해서 사용하는 메서드가 map.get("홍길동")이며 "홍길동"을 key로 하는 value를 리턴해줍니다. 또한 key에 "김유신"이 중복 입력 되므로 김유신은 한 개만 저장됩니다. 두번째 "김유신"은 새로운 값으로 대체되기에 value는 기존 내용이 수정되어 2345로 출력된 것입니다. 다음 예제는 키값들만 조회하는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package Example;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
public class HashMapEx2 {
 
    public static void main(String[] args) {
        // Map 객체 생성
        Map<String, Integer> map = new HashMap();
 
        // 이름이 담긴 문자열 배열 생성
        String[] names = {"홍길동", "김유신", "이순신", "강감찬", "김유신"};
 
        // 숫자가 담긴 정수 배열 생성
        int[] nums = {1234, 4567, 2350, 9870, 2345};
 
        // Map 객체에 두 배열의 값들을 key와 value 쌍으로 저장
        for (int i = 0; i < names.length; i++) {
            map.put(names[i], nums[i]);
        }
 
        // Map 객체에서 key 들만 조회하기
        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println(key + "=" + map.get(key));
        }
 
        System.out.println("Iterator로 출력");
        Iterator it = keys.iterator();
        while (it.hasNext()) {
            String a = (String)it.next();
            System.out.println(a + "=" + map.get(a));
        }
    }
 
}
 
Colored by Color Scripter
cs

[실행 결과]

홍길동=1234
김유신=2345
강감찬=9870
이순신=2350
Iterator로 출력
홍길동=1234
김유신=2345
강감찬=9870
이순신=2350

 

Map 객체의 key 들만 조회하는 메서드는 keySet()입니다. Map 객체에서 key값은 중복될 수 없기에 Set 객체로 리턴해줍니다. 만약에 value 값들만 조회해주고 싶다면 values()라는 메서드를 호출해주면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package Example;
 
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
 
public class HashMap3 {
 
    public static void main(String[] args) {
        // Map 객체 생성
        Map<String, Integer> map = new HashMap();
 
        // 이름이 담긴 문자열 배열 생성
        String[] names = {"홍길동", "김유신", "이순신", "강감찬", "김유신"};
 
        // 숫자가 담긴 정수 배열 생성
        int[] nums = {1234, 4567, 2350, 9870, 2345};
 
        // Map 객체에 두 배열의 값들을 key와 value 쌍으로 저장
        for (int i = 0; i < names.length; i++) {
            map.put(names[i], nums[i]);
        }
 
        // Map 객체에서 value 들만 조회
        Collection values = map.values();
 
        for (Object i : values) {
            System.out.println(i);
        }
 
        System.out.println("Iterator로 출력");
        Iterator it = values.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
 
}
 
Colored by Color Scripter
cs

[실행결과]

1234
2345
9870
2350
Iterator로 출력
1234
2345
9870
2350

 

Map 인터페이스의 values() 메서드의 리턴 타입은 Set도 List도 아닌 Collection 타입으로 리턴합니다.
(value값들이 중복이 안된다는 보장도 없고, 저장된 순서를 유지하기도 어렵기 때문)

 

다음 예제는 (key, value) 쌍으로 이루어진 객체를 가져오는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package Example;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
public class HashMapEx4 {
 
    public static void main(String[] args) {
        // Map 객체 생성
        Map<String, Integer> map = new HashMap<>();
 
        // 이름이 담긴 문자열 배열 생성
        String[] names = {"홍길동", "김유신", "이순신", "강감찬", "김유신"};
 
        // 숫자가 담긴 정수 배열 생성
        int[] nums = {1234, 4567, 2350, 9870, 2345};
 
        // Map 객체에 두 배열의 값들을 key와 value 쌍으로 저장
        for (int i = 0; i < names.length; i++) {
            map.put(names[i], nums[i]);
        }
 
        // Map 객체는 (key, value) 쌍으로 이루어진 객체들의 모임
        // (key, value) 쌍으로 조회
        Set entry = map.entrySet();
        for (Object o : entry) {
            Map.Entry m = (Map.Entry)o;
            System.out.println("key: " + m.getKey() + ", value: " + m.getValue());
        }
 
    }
}
 
 
 
Colored by Color Scripter
cs

[실행결과]

key: 홍길동, value: 1234
key: 김유신, value: 2345
key: 강감찬, value: 9870
key: 이순신, value: 2350

 

entrySet() 메서드는 키가 중복이 안 되므로 중복이 허용되지 않습니다. 그러므로 Set 객체로 리턴해줍니다.

key, value의 쌍인 객체의 자료형은 Map.Entry 형입니다.

'알고리즘 지식 > 자료구조' 카테고리의 다른 글

배열(Array)  (1) 2024.06.17
[자료구조]문자열  (0) 2023.01.02
[자료구조]버블 정렬  (0) 2022.12.30
[자료구조]원형 큐  (0) 2022.12.27
[자료구조]슬라이딩 윈도우 With 투 포인터  (0) 2022.12.26

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 배열(Array)

    배열(Array)

    2024.06.17
  • [자료구조]문자열

    [자료구조]문자열

    2023.01.02
  • [자료구조]버블 정렬

    [자료구조]버블 정렬

    2022.12.30
  • [자료구조]원형 큐

    [자료구조]원형 큐

    2022.12.27
다른 글 더 둘러보기

정보

codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

  • codesche's blog의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (76)
    • Algorithm (15)
      • 백준 (3)
      • 프로그래머스 (10)
      • inflearn 알고리즘(Java) (2)
    • 블로그소개 (1)
    • Back-End (11)
      • Java (10)
      • SpringBoot (1)
    • Database (2)
      • MySQL (0)
      • MariaDB (1)
      • Redis (0)
      • 개념, 이론 (1)
    • Front-End (0)
      • html, css, javascript (0)
    • Git (2)
    • 알고리즘 지식 (11)
      • 자료구조 (11)
    • Study Cafe (21)
      • 기술면접 (6)
      • Clean Code 스터디 (14)
      • CS 스터디 (0)
      • 개발용어 (1)
    • 주간 에세이 (10)
    • DevOps (3)
      • 배포, Front&Back 연동 (1)
      • AWS (0)
      • Docker (1)
      • 이론 (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 자바 기초
  • 자료구조
  • java
  • 개발자 현실
  • 자바 변수
  • 클린코드
  • 주간에세이
  • git commit

나의 외부 링크

정보

The Code의 codesche's blog

codesche's blog

The Code

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © The Code. Designed by Fraccino.

티스토리툴바