๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ชฉ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค.

[JAVA] ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค (Map)

๐Ÿ—ฃ Language/JAVA
    ๋ฐ˜์‘ํ˜•

    ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค HashMap


    HashMap๊ณผ Hashtable์˜ ๊ด€๊ณ„๋Š” ArrayList์™€ Vector์˜ ๊ด€๊ณ„์™€ ๊ฐ™์•„์„œ Hashtable๋ณด๋‹ค๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์ธ HashMap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ๋‘˜๋‹ค Map์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํฐ ํŠน์ง•์œผ๋กœ๋Š” ํ‚ค(Key)๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ๊ตฌ๋ถ„์ž๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•˜๋Š”๋ฐ ์ด๋Š” ๋ฆฌ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ณด๋‹ค ํƒ์ƒ‰์— ์žˆ์–ด์„œ ๋” ๋†’์€ ํšจ์œจ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.


    ์ฑ…์—๋Š” HashMap์— ๋Œ€ํ•ด์„œ๋งŒ ์„ค๋ช…์ด ๋˜์–ด ์žˆ๋Š”๋ฐ ๋‘˜์˜ ์ฐจ์ด์ ์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ณ  ๋„˜์–ด๊ฐ€์ž,



    HashMap๊ณผ Hashtable์˜ ์ฐจ์ด

    ๋‘˜์˜ ์ฐจ์ด์ ์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค. HashMap์˜ ๊ฒฝ์šฐ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐ˜๋ฉด ๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ Hashtable์€ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ฑ…์—๋Š” ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ƒˆ๋กœ์šด ๋ฒ„์ „์ธ HashMap์„ ํ™œ์šฉํ•˜๊ณ  ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์—๋Š” Java 5๋ถ€ํ„ฐ ์ œ๊ณตํ•˜๋Š” ConcurrentHashMap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ ํ‘œํ˜„ํ•œ๋‹ค. ConcurrentHashMap์€ HashMap๊ณผ ๋‹ค๋ฅด๊ฒŒ Key, Value์— null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ถ”๊ฐ€๋กœ ์†๋„์ ์ธ ์ธก๋ฉด์—์„œ๋„ ๊ตฌํ˜•์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋Š” Hashtable์€ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๋ผ๋Š” ์ถ”๊ฐ€์  ๋น„์šฉ ๋•Œ๋ฌธ์— HashMap์— ๋น„ํ•ด ๋” ๋Š๋ฆฌ๋‹ค๊ณ  ํ•œ๋‹ค.


    โ€ป Hashtable์˜ ๋ชจ๋“  Data ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ๋Š” synchronized๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์Œ.



    HashMap ๊ธฐ๋ณธ๊ฐœ๋…


    ๋‹ค์‹œ ๋Œ์•„์™€์„œ HashMap์€ Map์„ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Map์˜ ํŠน์ง•์ธ ํ‚ค(key)์™€ ๊ฐ’(value)์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ(entry)๋กœ ์ €์žฅํ•œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด์‹ฑ(hashing)์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.


    HashMap์ด ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ์†Œ์Šค์˜ ์ผ๋ถ€๋ฅผ ์‚ดํŽด๋ณด์ž.


    public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
    {
        transient Entry[] table;
     
        ...
     
        static class Entry implements Map.Entry {
            final Object Key;
            Object value;
            ...
        }
    }


    HashMap์€ Entry๋ผ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ๋‹ค์‹œ Entryํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ์žˆ๋‹ค. ํ‚ค์™€ ๊ฐ’์€ ๋ณ„๊ฐœ์˜ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์„œ๋กœ ๊ด€๋ จ๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์„œ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์— ๋” ๋ฐ”๋žŒ์งํ•˜๋‹ค.


    // ๋น„๊ฐ์ฒด์ง€ํ–ฅ์  ์ฝ”๋“œ
    Object[] key;
    Object[] value;
     
     
    // ๊ฐ์ฒด์ง€ํ–ฅ์  ์ฝ”๋“œ
    Entry[] table;
    class Entry {
        Object key;
        Object value;
    }


    ํ•œ๋งˆ๋””๋กœ ์œ„์™€๊ฐ™์€ ์ฝ”๋“œ์˜ ์ฐจ์ด.


    โ€ป Map.Entry๋Š” Map์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ 'static inner interface'์ด๋‹ค.


    HashMap์€ ํ‚ค์™€ ๊ฐ’์„ ๊ฐ๊ฐ Objectํƒ€์ž…์œผ๋กœ ์ €์žฅํ•œ๋‹ค. ์ฆ‰, ์–ด๋–ค ๊ฐ์ฒด๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ‚ค๋Š” ๋ณดํ†ต String์„ ๋Œ€๋ฌธ์ž ๋˜๋Š” ์†Œ๋ฌธ์ž๋กœ ํ†ต์ผํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.


    ํ‚ค(key)        ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ํ‚ค(key) ์ค‘์—์„œ ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค.

    ๊ฐ’(value)      ํ‚ค(key)์™€ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค.


    ํ‚ค๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ์ฐพ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์ปฌ๋ ‰์…˜ ๋‚ด์—์„œ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜์—ฌ์•ผ ํ•œ๋‹ค.




    HashMap ์˜ˆ์ œ 1


    import java.util.*;
     
    class HashMapEx1 {
        public static void main(String[] args) {
            HashMap map = new HashMap();
            map.put("myId", "1234");
            map.put("asdf", "1111");
            map.put("asdf", "1234");
     
            Scanner s = new Scanner(System.in);    // ํ™”๋ฉด์œผ๋กœ๋ถ€ํ„ฐ ๋ผ์ธ๋‹จ์œ„๋กœ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
     
            while(true) {
                System.out.println("id์™€ password๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
                System.out.print("id :");
                String id = s.nextLine().trim();
     
                System.out.print("password :");
                String password = s.nextLine().trim();
                System.out.println();
     
                if(!map.containsKey(id)) {
                    System.out.println("์ž…๋ ฅํ•˜์‹  id๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
                    continue;
                } else {
                    if(!(map.get(id)).equals(password)) {
                        System.out.println("๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
                    } else {
                        System.out.println("id์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.");                        
                        break;
                    }
                }
            } // while
        } // main์˜ ๋
    }


    [์‹คํ–‰๊ฒฐ๊ณผ]


    id์™€ password๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.

    id :asdf

    password :1111


    ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.

    id์™€ password๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.

    id :asdf

    password :1234


    id์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


    ์ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚˜๋ฉด HashMap์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.


    ํ‚ค(key) 

    ๊ฐ’(value) 

    myId 

    1234 

    asdf 

    1234


    ์ด ์™ธ์—๋„ HashMap์•ˆ์— HashMap์„ ๋„ฃ์–ด์„œ ํ•˜๋‚˜์˜ ํ‚ค์— ๋ณต์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. (์ด์ฐจ์› ๋ฐฐ์—ด์ฒ˜๋Ÿผ)


    HashMap ์˜ˆ์ œ 2


    import java.util.*;
     
    class HashMapEx2 {
        public static void main(String[] args) {
            String[] data = { "A","K","A","K","D","K","A","K","K","K","Z","D" };
     
            HashMap map = new HashMap();
     
            for(int i=0; i < data.length; i++) {
                if(map.containsKey(data[i])) {
                    Integer value = (Integer)map.get(data[i]);
                    map.put(data[i], new Integer(value.intValue() + 1));
                } else {
                    map.put(data[i], new Integer(1));            
                }
            }
     
            Iterator it = map.entrySet().iterator();
     
            while(it.hasNext()) {
                Map.Entry entry = (Map.Entry)it.next();
                int value = ((Integer)entry.getValue()).intValue();
                System.out.println(entry.getKey() + " : " + printBar('#', value) + " " + value );
            }
        } // main
     
        public static String printBar(char ch, int value) { 
            char[] bar = new char[value]; 
     
            for(int i=0; i < bar.length; i++) { 
                bar[i] = ch; 
            } 
     
            return new String(bar);     // String(char[] chArr)
        }
    }


    [์‹คํ–‰๊ฒฐ๊ณผ]


    A : ### 3

    D : ## 2

    Z : # 1

    K : ###### 6


    ๋ฌธ์ž์—ด ๋ฐฐ์—ด์— ๋‹ด๊ธด ๋ฌธ์ž์—ด๋“ค์˜ ๋นˆ๋„์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.


    ๋ฌธ์ž์—ด ๋ฐฐ์—ด์— ๋‹ด๊ธด ๋ฌธ์ž์—ด์„ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ HashMap์— ํ‚ค๋กœ ์ €์žฅํ•˜๊ณ  ๊ฐ’์œผ๋กœ 1์„ ์ €์žฅํ•œ๋‹ค. HashMap์— ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ํ‚ค๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ containsKey()๋ฉ”์„œ๋“œ๋กœ ํ™•์ธํ•˜์—ฌ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฌธ์ž์—ด์ด๋ฉด ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

     

    ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ printBar()๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค.  ํ•œ์ •๋œ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ์ˆœ์ฐจ์ ์ธ ๊ฐ’๋“ค์˜ ๋นˆ๋„์ˆ˜๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์ง€๋งŒ, ์ด์ฒ˜๋Ÿผ ํ•œ์ •๋˜์ง€ ์•Š์€ ๋ฒ”์œ„์˜ ๋น„์ˆœ์ฐจ์ ์ธ ๊ฐ’๋“ค์˜ ๋นˆ๋„์ˆ˜๋Š” HashMap์„ ์ด์šฉํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.


    โ€ป ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด HashMap๊ณผ ๊ฐ™์ด ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค์€ ์ €์žฅ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธํ•˜์ž.



    ํ•ด์‹ฑ๊ณผ ํ•ด์‹œํ•จ์ˆ˜


    ํ•ด์‹ฑ์ด๋ž€ ํ•ด์‹œํ•จ์ˆ˜(hash function)๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œํ…Œ์ด๋ธ”(hash table)์— ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค. ํ•ด์‹œํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ณณ์„ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ๋„ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. 


    ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋กœ๋Š” HashSet, HashMap, Hashtable ๋“ฑ์ด ์žˆ๋‹ค. ํ•ด์‹ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์กฐํ•ฉ์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค.


    ๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์กฐํ•ฉ๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์กฐํ•ฉ


    ์‚ฌ์ง„ ์ถœ์ฒ˜ : http://codedragon.tistory.com/6334


    ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์˜ ํ‚ค๋ฅผ ํ•ด์‹œํ•จ์ˆ˜์— ๋„ฃ์œผ๋ฉด ๋ฐฐ์—ด์˜ ํ•œ ์š”์†Œ๋ฅผ ์–ป๊ฒŒ ๋˜๊ณ , ๋‹ค์‹œ ๊ทธ ๊ณณ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.


    ์ฑ…์— ์˜ˆ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด๋ฉด ํ•œ ๊ฐ„ํ˜ธ์‚ฌ๊ฐ€ ๋งŽ์€ ๋ณ‘์›์˜ ํ™˜์ž ๋ฐ์ดํ„ฐ ์ค‘์—์„œ, ์›ํ•˜๋Š” ํ™˜์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ๋ฅผ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ์˜ ๋งจ ์•ž์ž๋ฆฌ์ธ ์ƒ๋…„์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•ด์„œ 10๊ฐœ์˜ ์„œ๋ž(๋ฐฐ์—ด)์— ๋‚˜๋ˆ  ๋‹ด๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ƒˆ๋‹ค๊ณ  ํ•˜์ž.


    ์˜ˆ๋ฅผ ๋“ค๋ฉด, 71๋…„์ƒ, 72๋…„์ƒ๊ณผ ๊ฐ™์€ 70๋…„๋Œ€์ƒ ํ™˜์ž๋“ค์˜ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ™์€ ์„œ๋ž์— ์ €์žฅ๋œ๋‹ค.


    ์ด๋ ‡๊ฒŒ ๋ถ„๋ฅ˜ํ•ด์„œ ์ €์žฅํ•ด๋‘๋ฉด ํ™˜์ž์˜ ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋กœ ํƒœ์–ด๋‚œ ๋…„๋Œ€๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์–ด๋Š ์„œ๋ž์—์„œ ์ฐพ์•„์•ผ ํ• ์ง€๋ฅผ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.



    ํ•ด์‹ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„œ๋ž์— ๋น„์œ ํ•œ ๊ทธ๋ฆผํ•ด์‹ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„œ๋ž์— ๋น„์œ ํ•œ ๊ทธ๋ฆผ


    ์—ฌ๊ธฐ์„œ์˜ ์„œ๋ž์€ ํ•ด์‹ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์—๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์–ด์„œ ์‹ค์ œ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ฒจ์ง€๊ฒŒ ๋œ๋‹ค.


    ์•„๋ž˜ ๊ทธ๋ฆผ์€ 79๋…„์ƒ ํ™˜์ž์˜ ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋ฅผ ํ‚ค๋กœ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 7์ด๋ผ๋Š” ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์–ป์€ ๋‹ค์Œ, ๋ฐฐ์—ด์˜ 7๋ฒˆ์งธ ์š”์†Œ์— ์ €์žฅ๋œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •์„ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

    HashMap์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •HashMap์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •


    1. ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์˜ ํ‚ค๋กœ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

    2. ํ•ด์‹œํ•จ์ˆ˜์˜ ๊ณ„์‚ฐ๊ฒฐ๊ณผ์ธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๋‹น ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค.

    3. ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰ํ•œ ํ‚ค์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.


    ์ด๋ฏธ ๋ฐฐ์šด ๋ฐ”์™€ ๊ฐ™์ด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋Š” ๊ฒ€์ƒ‰์— ๋ถˆ๋ฆฌํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ฒ€์ƒ‰์†๋„๊ฐ€ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ์„œ๋ž์— ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๊ฒ€์ƒ‰์— ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

    ๋ฐ˜๋ฉด์— ๋ฐฐ์—ด์€ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„, ์›ํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ช‡ ๋ฒˆ์งธ์— ์žˆ๋Š” ์ง€๋งŒ ์•Œ๋ฉด ์•„๋ž˜์˜ ๊ณต์‹์— ์˜ํ•ด์„œ ๋น ๋ฅด๊ฒŒ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.


    ๋ฐฐ์—ด์˜ n๋ฒˆ์งธ ์š”์†Œ์˜ ์ฃผ์†Œ = ๋ฐฐ์—ด์˜ ์‹œ์ž‘์ฃผ์†Œ + type์˜ size * n


    ๊ทธ๋ž˜์„œ ์‹ค์ƒํ™œ๊ณผ๋Š” ๋งž์ง€ ์•Š๋Š” ์–˜๊ธฐ์ง€๋งŒ, ํ•˜๋‚˜์˜ ์„œ๋ž์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ๋ณด๋‹ค๋Š” ๋งŽ์€ ์„œ๋ž์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ๊ฐ€ ๋” ๋น ๋ฅธ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.


    ํ•˜๋‚˜์˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(์„œ๋ž)์— ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ๋˜๋ ค๋ฉด, ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•ด์„œ HashMap์˜ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ณ , ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค(์œ„์˜ ๊ฒฝ์šฐ์—” ์ฃผ๋ฏผ๋ฒˆํ˜ธ)์— ๋Œ€ํ•ด์„œ ์ค‘๋ณต๋œ ํ•ด์‹œ์ฝ”๋“œ(์„œ๋ž์œ„์น˜)์˜ ๋ฐ˜ํ™˜์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ HashMap์—์„œ ๋น ๋ฅธ ๊ฒ€์ƒ‰์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.


    ๊ทธ๋ž˜์„œ ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ œ์ผ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•ด์‹œํ•จ์ˆ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฉฐ, ์ด ์˜ˆ์—์„œ ์‚ฌ์šฉ๋œ ํ•ด์‹œํ•จ์ˆ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ์–ด์ง„ ํ‚ค(์ฃผ๋ฏผ๋ฒˆํ˜ธ)์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๋ฝ‘์•„์„œ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.


    ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ„๋‹จํ•œ ๋งŒํผ ์„ฑ๋Šฅ์€ ์ข‹์ง€ ์•Š์•„์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค์— ๋Œ€ํ•ด์„œ ์ค‘๋ณต๋œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์‹ค์ œ๋กœ๋Š” HashMap๊ณผ ๊ฐ™์ด ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์—์„œ๋Š” Objectํด๋ž˜์Šค์— ์ •์˜๋œ hashCode()๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค. Objectํด๋ž˜์Šค์— ์ •์˜๋œ hashCode()๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•ด hashCode()๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์„œ๋กœ ์œ ์ผํ•˜๋‹ค.


    โ€ป ์ฐธ๊ณ ๋กœ Stringํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ Object๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ hashCode()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์œผ๋กœ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋กœ ๋‹ค๋ฅธ String์ธ์Šคํ„ด์Šค์ผ์ง€๋ผ๋„ ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด hashCode()์˜ ๊ฒฐ๊ณผ ๋˜ํ•œ ๊ฐ™๋‹ค.



    TreeMap


    TreeMap์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ํ‚ค์™€ ๊ฐ’์ด ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒ€์ƒ‰๊ณผ ์ •๋ ฌ์— ์ ํ•ฉํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์ด๋‹ค.


    HashMap๊ณผ TreeMap์€ ๊ฒ€์ƒ‰์— ๊ด€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—์„œ HashMap์ด TreeMap๋ณด๋‹ค ๋” ๋›ฐ์–ด๋‚˜๋ฏ€๋กœ HashMap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋‹ค๋งŒ ๋ฒ”์œ„๊ฒ€์ƒ‰์ด๋‚˜ ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” TreeMap์„ ์‚ฌ์šฉํ•˜์ž.


    Properties


    Properties๋Š” HashMap์˜ ๊ตฌ๋ฒ„์ „์ธ Hashtable์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ, Hashtable์€ ํ‚ค์™€ ๊ฐ’์„ (Object, Object)๋กœ ์ €์žฅํ•˜๋Š”๋ฐ ๋น„ํ•ด Properties๋Š” (String, String)์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ณด๋‹ค ๋‹จ์ˆœํ™”๋œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์ด๋‹ค.


    ์ฃผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™˜๊ฒฝ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ์†์„ฑ(property)์„ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ฝ๊ณ  ์“ฐ๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ„๋‹จํ•œ ์ž…์ถœ๋ ฅ์€ Properties๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.


    Collections


    Arrays๊ฐ€ ๋ฐฐ์—ด๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Collections๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. fill(), copy(), binarySearch() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋Š” ๋‘ ํด๋ž˜์Šค์— ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. 


    โ€ป ์ฃผ์˜ - java.util.Collection์€ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ  , java.util.Collections๋Š” ํด๋ž˜์Šค์ด๋‹ค.



    ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๊ฐ„ ์ •๋ฆฌ ๋ฐ ์š”์•ฝ



    ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๊ฐ„์˜ ๊ด€๊ณ„์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๊ฐ„์˜ ๊ด€๊ณ„



     ์ปฌ๋ ‰์…˜

    ํŠน์ง• 

    ArrayList 

    ๋ฐฐ์—ด ๊ธฐ๋ฐ˜, ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ์— ๋ถˆ๋ฆฌ, ์ˆœ์ฐจ์ ์ธ ์ถ”๊ฐ€์‚ญ์ œ๋Š” ์ œ์ผ ๋น ๋ฆ„. 

    ์ž„์˜์˜ ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์ด ๋›ฐ์–ด๋‚จ. 

    LinkedList 

    ์—ฐ๊ฒฐ๊ธฐ๋ฐ˜, ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ์— ์œ ๋ฆฌ, ์ž„์˜์ด ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค.

    HashMap 

    ๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ์ด ๊ฒฐํ•ฉ๋œ ํ˜•ํƒœ, ์ถ”๊ฐ€, ์‚ญ์ œ, ๊ฒ€์ƒ‰, ์ ‘๊ทผ์„ฑ์ด ๋ชจ๋‘ ๋›ฐ์–ด๋‚จ. ๊ฒ€์ƒ‰์—๋Š” ์ตœ๊ณ .

    TreeMap

     ์—ฐ๊ฒฐ๊ธฐ๋ฐ˜, ์ •๋ ฌ๊ณผ ๊ฒ€์ƒ‰(ํŠนํžˆ ๋ฒ”์œ„๊ฒ€์ƒ‰)์— ์ ํ•ฉ. ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์€ HashMap๋ณด๋‹ค ๋–จ์–ด์ง

    Stack 

    Vector๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ 

    Queue 

    LinkedList๊ฐ€ Queue์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„

    Properties 

    Hashtable์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ 

    HashSet 

    HashMap์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ 

    TreeSet 

    TreeMap์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ 

    LinkedHashMap
    LinkedHashSet 

    HashMap๊ณผ HashSet์— ์ €์žฅ์ˆœ์„œ์œ ์ง€๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€์Œ. 



    ์ฐธ๊ณ  : ์ž๋ฐ”์˜ ์ •์„ 3rd

    ๋ฐ˜์‘ํ˜•