☕ Main.java

				Map<Integer, String> numNameHMap = new HashMap<>();
				//  💡 put 메소드를 사용하여 키와 값 삽입
        numNameHMap.put(1, "홍길동");
        numNameHMap.put(2, "전우치");
        numNameHMap.put(3, "임꺽정");

        Map<String, Double> nameHeightHMap = new HashMap<>();
        nameHeightHMap.put("김철수", 176.8);
        nameHeightHMap.put("이장신", 187.4);
        nameHeightHMap.put("박숏달", 152.3);
        nameHeightHMap.put("정기준", 171.2);

        Map<Side, ArrayList<Unit>> sideUnitsHMap = new HashMap<>();
        sideUnitsHMap.put(
                Side.BLUE,
                new ArrayList<>(
                        Arrays.asList(
																new Swordman(Side.BLUE),
                                new Knight(Side.BLUE),
                                new MagicKnight(Side.BLUE))
                )
        );
        sideUnitsHMap.put(
                Side.RED,
                new ArrayList<>(
                        Arrays.asList(
																new Knight(Side.RED),
                                new Knight(Side.RED),
                                new Knight(Side.RED))
                )
        );
				//  💡 putAll : 대상 맵으로부터 전부 가져옴
        Map<Integer, String> numNameHMapClone = new HashMap<>();
        numNameHMapClone.putAll(numNameHMap);
				//  💡 get 메소드에 키를 넣어 값 접근
        String no2 = numNameHMap.get(2);
        Double leeHeight = nameHeightHMap.get("이장신");
        //  ⚠️ 잘못된 키 입력시 null 반환
        String wrong1 = numNameHMap.get(0);
        Double wrong2 = nameHeightHMap.get(3);
				//  💡 keySet 메소드 - 키들의 Set(인터페이스) 반환
        Set<Integer> numSet = numNameHMap.keySet();
        Set<Integer> numHSet = new HashSet<>();
        numHSet.addAll(numSet);

        //  keySet을 활용한 for-each
        for (Integer n : numNameHMap.keySet()) {
            System.out.println(numNameHMap.get(n));
        }
        for (Side side : sideUnitsHMap.keySet()) {
            for (Unit unit : sideUnitsHMap.get(side)) {
                System.out.println(unit);
            }
        }
				// 💡 containsKey / containsValue : 키 / 값 포함되는 쌍 있는지 확인
        boolean contains1 = nameHeightHMap.containsKey("박숏달");
        boolean contains2 = nameHeightHMap.containsKey("장롱달");
        boolean contains3 = nameHeightHMap.containsValue(171.2);
				System.out.printf("\\n- - - - -\\n");

				Map<Attacker, Horse> atkrHrsHMap = new HashMap<>();

        Swordman kenshin = new Swordman(Side.RED);
        Knight lancelot = new Knight(Side.BLUE);

        atkrHrsHMap.put(kenshin, new Horse(40));
        atkrHrsHMap.put(lancelot, new Horse(50));
        atkrHrsHMap.put(new MagicKnight(Side.BLUE), new Horse(60));

        //  ⭐️ 키의 값이 참조형일 경우 변수 등에 저장되어 있어야 함
        Horse kenshinHorse = atkrHrsHMap.get(kenshin);
        Horse lancelotHorse = atkrHrsHMap.get(lancelot);
				//  ⚠️ 일반적인 방법으로는 꺼낼 수 없음
        Horse wrongHorse = atkrHrsHMap.get(new MagicKnight(Side.BLUE));

				//  이런 식으로밖에 꺼낼 수 없음
        for (Attacker u : atkrHrsHMap.keySet()) {
            System.out.println(u + " : " + atkrHrsHMap.get(u));
        }
				//  💡 getOrDefault : 키에 해당하는 쌍이 없을 시 지정한 디폴트 값 반환
        String defName = numNameHMap.getOrDefault(10, "김대타");
        Horse defHorse = atkrHrsHMap.getOrDefault(new MagicKnight(Side.BLUE), new Horse(40));
				//  💡 Entry 인터페이스 : 맵의 각 요소, 키와 값을 가짐
        //  - 클래스 살펴볼 것
        Set<Map.Entry<Integer, String>> numNameES = numNameHMap.entrySet();
        for (Map.Entry<Integer, String> entry : numNameES) {
            int key = entry.getKey();
            String value = entry.getValue();
            System.out.printf("k: %d, v: %s%n", key, value);
            System.out.println(entry);
        }
				//  remove, clear, isEmpty 메소드들

        numNameHMap.remove(1); // 주어진 키가 있다면 삭제
        numNameHMap.remove(2, "황대장"); // 주어진 키와 값의 쌍이 있다면 삭제

        boolean isEmpty1 = nameHeightHMap.isEmpty();
        nameHeightHMap.clear();
        boolean isEmpty2 = nameHeightHMap.isEmpty();

해시맵과 트리맵