GiantStepDEV

Map ์ธํ„ฐํŽ˜์ด์Šค

๐Ÿ’กMap ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ์Œ(pair)๋กœ ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Map์€ ํ‚คkey์™€ ๊ฐ’value๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‚คkey๋Š” ์ค‘๋ณต ํ—ˆ์šฉ์ด ์•ˆ๋˜๊ณ , ๊ฐ’value๋Š” ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Hash?

๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰๊ณผ ์ €์žฅ์—์„œ ์•„์ฃผ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋ฉฐ, ์“ฐ์ž„์ƒˆ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Hash๋กœ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋ฉด ๊ณ ์œ  ์ฃผ์†Œ ๊ฐ’์ด ์ƒ๊ธฐ๋Š”๋ฐ ์ด๊ฒƒ์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์„ hashCode๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ž๋ฐ”์—์„œ ํ•ด์‹œ์ฝ”๋“œ๋Š” Heap ์˜์—ญ์— ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ฐ’์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Hash ํ•จ์ˆ˜๋ž€?
๋ฐ์ดํ„ฐ์˜ ํšจ์œจ์ ์ธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
์•”ํ˜ธํ™”๊ธฐ๋ฒ•์ด๋ผ๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Hash Collision?

๊ฐ€์žฅ ์ด์ƒ์ ์ธ Hashtable์€ ํ•œ ๋ฒ„์ผ“์— ๋”ฑ ํ•œ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค.

์ด ๋•Œ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ํ•  ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋งŒ ๊ณ„์‚ฐํ•˜๋ฉด ๋ฐ”๋กœ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— O(1)์˜ ์‹œ์ž‘๋ณต์žก๋„๋ฅผ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ•œ ๋ฒ„์ผ“์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ถฉ๋Œ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Map ์ปฌ๋ ‰์…˜

Map์€ ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•ด๋‹น ์š”์†Œ ๊ฐ’์„ ๊ตฌํ•˜์ง€ ์•Š๊ณ  key๋ฅผ ํ†ตํ•ด value๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

  • ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ ๋˜์ง€ ์•Š์Œ
  • key์™€ value๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ key๋Š” ์ค‘๋ณต ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  value๋Š” ์ค‘๋ณต ๊ฐ€๋Šฅ
  • key์˜ ๋™์ผ ์กฐ๊ฑด์€ hashCode()์˜ ๋ฆฌํ„ด ๊ฐ’์ด ๊ฐ™๊ณ , equals() ๋ฉ”์†Œ๋“œ ๊ฒฐ๊ณผ๊ฐ€ true

HashMap

  • ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ hashCode() ๋ฆฌํ„ด๊ฐ’๊ณผ equals() ๋ฆฌํ„ด ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ ๋™์ผ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ, hashCode()์™€ equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์„œ ์‚ฌ์šฉํ•  ๋–„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HashMap์€ ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•˜๊ณ , ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.(๋™๊ธฐํ™” ๊ธฐ๋Šฅ X)

๊ธฐ๋ณธ ์˜ˆ์ œ

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        // ๊ฐ์ฒด ์ถ”๊ฐ€ : put(K,V)
        map.put("์•„๋ฉ”๋ฆฌ์นด๋…ธ", 3000);
        map.put("๋ผ๋–ผ", 3500);
        // ๊ฐ์ฒด ์ฐพ๊ธฐ : get(K) - return V
        System.out.println("๊ฐ’ ์ฝ๊ธฐ : " + map.get("์•„๋ฉ”๋ฆฌ์นด๋…ธ"));
        // ๊ฐ์ฒด ์‚ญ์ œ : remove(K) - return ์‚ญ์ œํ•œ K์˜ V
        System.out.println("๊ฐ’ ์ œ๊ฑฐ : " + map.remove("๋ผ๋–ผ"));
        // ์—†๋Š” ๊ฐ’์„ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๋ฉด null ๊ฐ’ ๋ฐ˜ํ™˜
        System.out.println("๊ฐ’ ์ฝ๊ธฐ : " + map.get("๋Œ์ฒด๋ผ๋–ผ"));
        System.out.println("๊ฐ’ ์ œ๊ฑฐ : " + map.remove("๋Œ์ฒด๋ผ๋–ผ"));
    }
}

๊ธฐ๋ณธ ์˜ˆ์ œ

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("์–‘์ฝฉ๋ฏธ", 99);
        map.put("ํ™๊ธธ๋™", 55);
        map.put("ํ•œ์„๋ด‰", 80);
        map.put("์ด์ˆœ์‹ ", 96);
        map.put("ํ™๊ธธ๋™", 88);
        System.out.println("์ด Entry ์ˆ˜ : " + map.size()); // 4
        // ๊ฐ์ฒด ์ฐพ๊ธฐ (List๋Š” ์ธ๋ฑ์Šค๋กœ ์ฐพ์ง€๋งŒ Map์€ ํ‚ค ๊ฐ’์œผ๋กœ ์ฐพ๋Š”๋‹ค.)
        System.out.println(map.get("ํ™๊ธธ๋™")); // ํ‚ค๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋‚˜์ค‘์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋จ
        // Map์„ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ• : ํ–ฅ์ƒ๋œ for๋ฌธ ์‚ฌ์šฉ
        for(String key : map.keySet()) { // ๋ชจ๋“  ํ‚ค๋ฅผ Set ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ฆฌํ„ด
            System.out.println(key + " : " + map.get(key));
        }
        // Map์„ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ• 2 : ๋ฐ˜๋ณต์ž๋กœ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•(iterator)
        Set<String> keySet = map.keySet();
        Iterator<String> iterator = keySet.iterator();
        while(iterator.hasNext()) { // ํ‚ค๊ฐ€ ๋‹ค์Œ์— ์žˆ๋Š”์ง€ ํ™•์ธ  ( ๋‹ค์Œ์— ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ )
            String key = iterator.next(); // ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ด
            System.out.println(key + " : " + map.get(key));
        }
        // ๊ฐ์ฒด ์‚ญ์ œ
        map.remove("ํ™๊ธธ๋™"); // ํ‚ค๋กœ Map.Entry๋ฅผ ์ œ๊ฑฐ
        System.out.println("์ด Entry ์ˆ˜ : " + map.size());
        // ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        map.replace("์ด์ˆœ์‹ ", 91);
        // Map.Entry ์ „์ฒด ์‚ญ์ œ
        map.clear();
        System.out.println("์ด Entry ์ˆ˜ : " + map.size());
    }
}

์‘์šฉ ์˜ˆ์ œ(์นดํŽ˜ ๋ฉ”๋‰ด ๋งŒ๋“ค๊ธฐ)

public class MenuInfo{
    String name;    // ๋ฉ”๋‰ด๋ช…
    int price;     // ๊ฐ€๊ฒฉ
    String group; // ๋ถ„๋ฅ˜
    String desc; // ์„ค๋ช…

    public MenuInfo(String name, int price, String group, String desc) {
        this.name = name;
        this.price = price;
        this.group = group;
        this.desc = desc;
    }
}
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

// [1] ๋ฉ”๋‰ด๋ณด๊ธฐ [2] ๋ฉ”๋‰ด์กฐํšŒ [3] ๋ฉ”๋‰ด์ถ”๊ฐ€ [4]๋ฉ”๋‰ด์‚ญ์ œ [5]๋ฉ”๋‰ด์ˆ˜์ • [6]์ข…๋ฃŒ
public class Main {
    Map<String, MenuInfo> map = new TreeMap<>();
    public static void main(String[] args) {
        Main coffee = new Main();
        coffee.makeMenu();
        coffee.selectMenu();
    }

    void makeMenu() {
        map.put("์•„๋ฉ”๋ฆฌ์นด๋…ธ", new MenuInfo("์•„๋ฉ”๋ฆฌ์นด๋…ธ", 3500, "์ปคํ”ผ", "์”์“ธํ•œ ๋ง›"));
        map.put("๋ผ๋–ผ", new MenuInfo("๋ผ๋–ผ", 4000, "์ปคํ”ผ", "๊ณ ์†Œํ•œ ๋ง›"));
        map.put("์นด๋ผ๋ฉœ๋งˆ๋ผ์•„๋˜", new MenuInfo("์นด๋ผ๋ฉœ๋งˆ๋ผ์•„๋˜", 4300, "์ปคํ”ผ", "๋‹ฌ๋‹ฌํ•œ ๋ง›"));
    }

    void selectMenu() {
        Scanner sc = new Scanner(System.in);
        while(true) {
            System.out.println("๋ฉ”๋‰ด๋ฅผ ์„ ํƒ ํ•˜์„ธ์š”.");
            System.out.print("[1] ๋ฉ”๋‰ด๋ณด๊ธฐ [2] ๋ฉ”๋‰ด์กฐํšŒ [3] ๋ฉ”๋‰ด์ถ”๊ฐ€ [4]๋ฉ”๋‰ด์‚ญ์ œ [5]๋ฉ”๋‰ด์ˆ˜์ • [6]์ข…๋ฃŒ : ");
            int selMenu = sc.nextInt();
            String menu = "";
            switch(selMenu) {
                case 1 :
                    System.out.println("======== ๋ฉ”๋‰ด ๋ณด๊ธฐ ========");
                    for(String key : map.keySet()) {
                        System.out.println("๋ฉ”๋‰ด : " + map.get(key).name);
                        System.out.println("๊ฐ€๊ฒฉ : " + map.get(key).price);
                        System.out.println("๋ถ„๋ฅ˜ : " + map.get(key).group);
                        System.out.println("์„ค๋ช… : " + map.get(key).desc);
                        System.out.println("--------------------------");
                    }
                    break;
                case 2 :
                    System.out.print("์กฐํšŒํ•  ๋ฉ”๋‰ด ์„ ํƒ : ");
                    menu = sc.next();
                    if(map.containsKey(menu)) { // map์— ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ (boolean)
                        System.out.println("๋ฉ”๋‰ด : " + map.get(menu).name);
                        System.out.println("๊ฐ€๊ฒฉ : " + map.get(menu).price);
                        System.out.println("๋ถ„๋ฅ˜ : " + map.get(menu).group);
                        System.out.println("์„ค๋ช… : " + map.get(menu).desc);
                        System.out.println("--------------------------");
                    } else System.out.println("์„ ํƒํ•˜์‹  ๋ฉ”๋‰ด๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
                    break;
                case 3 :
                    System.out.print("์ถ”๊ฐ€ํ•  ๋ฉ”๋‰ด๋ฅผ ์ž…๋ ฅ ํ•˜์„ธ์š” : ");
                    menu = sc.next();
                    if(map.containsKey(menu)) {
                        System.out.println("ํ•ด๋‹น ๋ฉ”๋‰ด๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.");
                    }else {
                        System.out.print("๊ฐ€๊ฒฉ : ");
                        int price = sc.nextInt();
                        System.out.print("๋ถ„๋ฅ˜ : ");
                        String group = sc.next();
                        sc.nextLine(); // ๋ฒ„ํผ ๋น„์šฐ๊ธฐ
                        System.out.print("์„ค๋ช… : ");
                        String desc = sc.nextLine();
                        map.put(menu,new MenuInfo(menu, price, group, desc));
                    }
                    break;
                case 4 :
                    System.out.print("์‚ญ์ œํ•  ๋ฉ”๋‰ด๋ฅผ ์ž…๋ ฅ ํ•˜์„ธ์š” : ");
                    menu = sc.next();
                    if(map.containsKey(menu)) {
                        map.remove(menu);
                        System.out.println(menu + "์„(๋ฅผ) ์‚ญ์ œํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
                    }else System.out.println("์‚ญ์ œ ํ•  ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
                    break;
                case 5 :
                    System.out.print("์ˆ˜์ •ํ•  ๋ฉ”๋‰ด๋ฅผ ์ž…๋ ฅ ํ•˜์„ธ์š” ; ");
                    menu = sc.next();
                    if(map.containsKey(menu)) {
                        System.out.print("๋ฉ”๋‰ด : ");
                        String name = sc.next();
                        System.out.print("๊ฐ€๊ฒฉ : ");
                        int price = sc.nextInt();
                        System.out.print("๋ถ„๋ฅ˜ : ");
                        String group = sc.next();
                        sc.nextLine(); // ๋ฒ„ํผ ๋น„์šฐ๊ธฐ
                        System.out.print("์„ค๋ช… : ");
                        String desc = sc.nextLine();
                        map.replace(menu,new MenuInfo(name, price, group, desc));
                    } else System.out.println("์ˆ˜์ •ํ•  ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
                    break;
                case 6 :
                    System.out.println("๋ฉ”๋‰ด๋ฅผ ์ข…๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค.");
                    return;
            }
        }
    }
}

HashTable

  • HashMap ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ๋™์ผํ•˜๋ฉฐ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Properties

  • ์ •๋ณด๋ฅผ "ํŒŒ์ผ"์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ฝ๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด key์™€ value ๋ชจ๋‘ ๋ฌธ์ž์—ด๋กœ๋งŒ ๊ตฌ์„ฑ ํ•ฉ๋‹ˆ๋‹ค.
  • Properties๋Š” HashTable์„ ์ƒ์† ๋ฐ›์•„ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค.
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.Properties;

public class Main {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties(); // HashTable ์—์„œ ์ƒ์† ๋ฐ›์Œ (K,V ๋ชจ๋‘ ๋ฌธ์ž์—ด)
        String path = Main.class.getResource("../ํšŒ์›์ •๋ณด์˜ˆ์ œ0105/database.properties").getPath(); // ์ƒ๋Œ€๊ฒฝ๋กœ(๋‚ด ์œ„์น˜๋ฅผ ๊ธฐ์ค€)
        path = URLDecoder.decode(path, "utf-8"); // == ํ•œ๊ธ€์ด ํฌํ•จ ๋  ๊ฒฝ์šฐ ์ธ์‹์„ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— utf-8๋กœ ๋””์ฝ”๋”ฉํ•˜๊ฒ ๋‹ค.
        properties.load(new FileReader(path));
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        System.out.println("driver : " + driver);
        System.out.println("url : " + url);
        System.out.println("username : " + username);
        System.out.println("password : " + password);
    }
}
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@local:1521:xe
username=scott
password=tiger
profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!