컬렉션 프레임워크 - Map<K,V>

이용만·2023년 3월 6일
0

🔎Map : 키(key)와 값(value)으로 구성된 객체를 저장하는 구조

이 객체를 Entry 객체라고 하며 Entry 객체는 키와 값을 각각 key 객체와 value 객체로 저장한다.

Map은 키는 중복 저장될 수 없지만, 값은 중복 저장이 가능하다.
만약 기존에 저장된 키와 동일한 키로 값을 저장하면, 기존의 값이 새로운 값으로 대치된다.

-Map의 메서드-


✏️ HashMap

HashMap은 아래 그림과 같이 키와 값으로 구성된 객체를 저장하는데 이 객체를 Entry 객체라 한다.

HashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치 또한 관계가 없다.
HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에
많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

?Hasing?

해싱이 무엇이냐면?
간호사가 환자정보가 많이 쌓였는데 이 차트를 어떻게 관리할까 하다가
출생년도로 분류해서 캐비넷에 저장하자 라고 아이디어가 떠올랐다.
어떤 키값을 넣으면 배열의 인덱스를 알려준다. (즉 저장위치를 알려준다)
이것을 해시코드라고 한다.
[출처][자바의 정석] ch11-46,47 HashMap(1) 해싱의 뜻,hash 클래스|작성자 옵셔널

HashMap<String, Integer> hashmap = new HashMap<>();
public class HashMapExample {
    public static void main(String[] args) {

	    // HashMap 생성
        HashMap<String, Integer> map = new HashMap<>();

        // Entry 객체 저장
        map.put("피카츄", 85);
        map.put("꼬부기", 95);
        map.put("야도란", 75);
        map.put("파이리", 65);
        map.put("피존투", 15);

        // 저장된 총 Entry 수 얻기
        System.out.println("총 entry 수: " + map.size());

        // 객체 찾기
        System.out.println("파이리 : " + map.get("파이리"));
				
        // key를 요소로 가지는 Set을 생성 -> 아래에서 순회하기 위해 필요합니다. 
        Set<String> keySet = map.keySet();

        // keySet을 순회하면서 value를 읽어옵니다. 
        Iterator<String> keyIterator = keySet.iterator();
        while(keyIterator.hasNext()) {
            String key = keyIterator.next();
            Integer value = map.get(key);
            System.out.println(key + " : " + value);
        }

        // 객체 삭제
        map.remove("피존투");

        System.out.println("총 entry 수: " + map.size());

        // Entry 객체를 요소로 가지는 Set을 생성 -> 아래에서 순회하기 위해 필요합니다. 
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();

        // entrySet을 순회하면서 value를 읽어옵니다. 
        Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
        while(entryIterator.hasNext()) {
            Map.Entry<String, Integer> entry = entryIterator.next();
            String key = entry.getKey(); // Map.Entry 인터페이스의 메서드
            Integer value = entry.getValue(); // Map.Entry 인터페이스의 메서드
            System.out.println(key + " : " + value);
        }

        // 객체 전체 삭제
        map.clear();
    }
}

Map은 키와 값을 쌍으로 저장하기에 iterator()를 직접 호출할 수 없다.
그 대신 keySet()이나 entrySet() 메서드를 이용해서 Set 형태로 반한된 컬렉션에
iterator()를 호출하여 반복자를 만든 후, 반복자를 통해 순회할 수 있다.

Iterator 인터페이스를 사용할 수 없는 컬렉션인 Map에서 Iterator 인터페이스를 사용하기 위해서는 Map에 entrySet(), keySet() 메소드를 사용하여 Set 객체를 반환받은 후 Iterator 인터페이스를 사용하시면 됩니다.

Map<String, String> map = new HashMap<>();
map.put("key01", "value01");
map.put("key02", "value02");
map.put("key03", "value03");
map.put("key04", "value04");
map.put("key05", "value05");
    
// 방법 03 : entrySet().iterator()
Iterator<Map.Entry<String, String>> iteratorE = map.entrySet().iterator();
while (iteratorE.hasNext()) {
	Map.Entry<String, String> entry = (Map.Entry<String, String>) iteratorE.next();
   	String key = entry.getKey();
   	String value = entry.getValue();
   	System.out.println("[key]:" + key + ", [value]:" + value);
}

✏️ HashTable

HashTable은 HashMap과 내부 구조가 동일하고 사용 방법 또한 유사하다.
차이점은 추후 학습할 스레드와 관련ㅇ 있으며 여기에선 간단하게
*HashMap이 Hashtable의 새로운 버전이라고 생각하자.

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

        Hashtable<String, String> map = new Hashtable<String, String>();

        map.put("Spring", "345");
        map.put("Summer", "678");
        map.put("Fall", "91011");
        map.put("Winter", "1212");

        System.out.println(map);

        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("아이디와 비밀번호를 입력해 주세요");
            System.out.println("아이디");
            String id = scanner.nextLine();

            System.out.println("비밀번호");
            String password = scanner.nextLine();

            if (map.containsKey(id)) {
                if (map.get(id).equals(password)) {
                    System.out.println("로그인 되었습니다.");
                    break;
                } 
                else System.out.println("비밀번호가 일치하지 않습니다. ");
            } 
            else System.out.println("입력하신 아이디가 존재하지 않습니다.");
        }
    }
}

profile
성장하는 개발자가 되고자 합니다.

0개의 댓글