Map 인터페이스

  • map 인터페이스는 키(key)와 값(value)의 값을 하나의 쌍으로 묶어서 저장한다.
  • 키는 중복될 수 없지만 값은 중복을 허용한다.
    • 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 사라지고 마지막에 저장된 값이 남는다.
  • key는 값을 대표하는 값이다.
    • key의 타입은 보통 String, Intger, Long 타입이 주로 사용된다.
  • value는 실제로 Map에 저장할 정보를 가지고 있는 객체다.
    • 보통 Object가 value의 타입으로 주로 사용된다.

map의 주요 메소드

  • V put (k key, V vlaue)
    • Map 객체에 key, value 쌍을 저장한다.
  • V get(Object key)
    • key에 해당하는 Value를 조회한다.
  • V remove(Object key)
    • key에 해당하는 value를 삭제한다.
  • void clear()
    • Map 객체에 저장된 모든 key, value의 쌍을 삭제한다.
  • int size()
    • key, value 쌍의 개수를 반환한다.
  • boolean isEmpty()
    • map 객체가 비어있으면 true를 반환한다.
  • boolean containsKey(Object key)
    • 지정된 key가 포함되어 있는지의 여부를 반환한다.
  • boolean containsValue(Object value)
    • 지정된 value가 포함되어 있는지의 여부를 반환한다.
  • Set<Key> keySet()
    • Map 객체의 모든 key를 Set 객체에 담아서 반환한다.
  • Collection <V> values()
    • Map 객체의 모든 value를 Collection 객체에 담아서 반환한다.
  • Set<Map.Emtry<K, V» entrySet()
    • Map에 저장된 모든 Entry<K, V>를 Set에 담아서 반환한다.

아래와 같은 모양에 익숙해져야 한다.

    Map<String, User>           // String을 key로, User 객체를 value로 갖고 있는 Map
    Map<String, List<Book>>     // String을 key로, Book객체의 list(배열)을 갖고 있는 Map

Map 예제 1

public class HashMapSample {
    public static void main(String[] args) {

        // 아래와 같은 더미데이터로 bookList를 만들었다
        List<Book> bookList = new ArrayList<>();
		books.add(new Book("소설", "남한산성"));
		books.add(new Book("소설", "칼의 노래"));
		books.add(new Book("컴퓨터", "이것이 자바다"));
		books.add(new Book("외국어", "토익보카"));
		books.add(new Book("소설", "레터의 연가"));
		books.add(new Book("컴퓨터", "자바의 정석"));
		books.add(new Book("외국어", "토익 기출문제"));
		books.add(new Book("컴퓨터", "빅데이터 실무"));
		books.add(new Book("기술", "머신러닝 가이드"));
		books.add(new Book("수험서", "머신러닝 가이드"));
		books.add(new Book("대학교재", "머신러닝 가이드"));
		books.add(new Book("인문", "머신러닝 가이드"));

        // key는 장르명, value는 도서의 개수인 Map 객체를 생성한다
        Map<String, Integer> genreCount = new HashMap<>();

        for (Book book : bookList) {
            // 이 값을 key 값으로 쓸 것이다
            String genre = book.getGenre();
            
            // 조회된 장르명이 key에 포함되어 있는지 체크한다
            if (genreCount.containsKey(genre)) {
                // map 객체에 해당 장르명이 존재하는 경우
                int count = book.get(genre);
                genreCount.put(genre, count+1);
            } else {
                genreCount.put(genre, 1);
            }
        }

        // 출력결과: {소설=3, 대학교재=1, 외국어=2, 기술=1, 인문=1, 컴퓨터=3, 수험서=1}
        System.out.println(genreCount);
    }

    // 내부 클래스 Book 객체
    static class Book {
		private String genre;
		private String title;
		
		public Book (String genre, String title) {
			this.genre = genre;
			this.title = title;
		}

		public String getGenre() {
			return genre;
		}

		public void setGenre(String genre) {
			this.genre = genre;
		}

		public String getTitle() {
			return title;
		}

		public void setTitle(String title) {
			this.title = title;
		}
	}
}

Map 예제 2

public class HashMapSample {
    public static void main(String[] args) {

        List<Book> bookList = new ArrayList<>();
		books.add(new Book("소설", "남한산성"));
		books.add(new Book("소설", "칼의 노래"));
		books.add(new Book("컴퓨터", "이것이 자바다"));
		books.add(new Book("외국어", "토익보카"));
		books.add(new Book("소설", "레터의 연가"));
		books.add(new Book("컴퓨터", "자바의 정석"));
		books.add(new Book("외국어", "토익 기출문제"));
		books.add(new Book("컴퓨터", "빅데이터 실무"));
		books.add(new Book("기술", "머신러닝 가이드"));
		books.add(new Book("수험서", "머신러닝 가이드"));
		books.add(new Book("대학교재", "머신러닝 가이드"));
		books.add(new Book("인문", "머신러닝 가이드"));

        Map<String, List<Book>> bookMap = new HashMao<>();

        for (Book book : bookList) {
            String genre = book.getGenre();
            if (bookMap.containsKey(genre)) {
                List<Book> list = bookMap.get(genre);
                list.add(book);
            } else {
                List<Book> list = new ArrayList<>();
                list.add(book);
            }
        }

        // 출력결과: {소설=[[소설: 남한산성], [소설: 칼의 노래], [소설: 레터의 연가]], 
        // 대학교재=[[대학교재: 머신러닝 가이드]], 
        // 외국어=[[외국어: 토익보카], [외국어: 토익 기출문제]], 
        // 기술=[[기술: 머신러닝 가이드]], 
        // 인문=[[인문: 머신러닝 가이드]], 
        // 컴퓨터=[[컴퓨터: 이것이 자바다], [컴퓨터: 자바의 정석], [컴퓨터: 빅데이터 실무]], 
        // 수험서=[[수험서: 머신러닝 가이드]]}
        System.out.println(bookMap);
    }

    static class Book {
		private String genre;
		private String title;
		
		public Book (String genre, String title) {
			this.genre = genre;
			this.title = title;
		}

		public String getGenre() {
			return genre;
		}

		public void setGenre(String genre) {
			this.genre = genre;
		}

		public String getTitle() {
			return title;
		}

		public void setTitle(String title) {
			this.title = title;
		}
		
		public String toString() {
			return "[" + genre + ": " + title + "]";
		}
	}
}