Link
09-25 11:23
«   2020/09   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
Archives
Today
677
Total
1,023,423
관리 메뉴

꿈 많은 사람의 이야기

자바 컬렉션 프레임워크(Collection Framework)Map 컬렉션(HashMap, Hashtable) 본문

java

자바 컬렉션 프레임워크(Collection Framework)Map 컬렉션(HashMap, Hashtable)

이수진의 블로그 이수진의 블로그 2017. 8. 21. 08:43

Map 컬렉션은 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다.
만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

 

Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다.

밑은 Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스의 메소드들이다.


기능
메소드
설명
객체 추가
V put(K key, V value)
주어진 키와 값을 추가, 저장되면 값을 리턴
객체 검색

boolean containsKey(Object key)
주어진 키가 있는지 여부
booleancontainsValue(Obect value)
주어진 값이 있는지 여부
Set<Map.Entry<K,V>> entrySet( )
키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
V get(Object key)
주어진 키가 있는 값을 리턴
boolean isEmpty( )
컬렉션이 비어 있는지 여부
Set<K> keySet( )
모든 키를 Set 객체에 담아서 리턴
int size( )
저장된 키의 총 수를 리턴
Collection<V> values( )
저장된 모든 값을 Collection에 담아서 리턴
객체삭제
void clear( )
모든 Map.Entry(키와 값)를 삭제
V remove(Object key)
주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

표에서 K와 V라는 타입 파라미터가 있는데 이것은 Map 인터페이스가 제네릭 타입이기 때문이다. 객체 추가는 put() 메소드를 사용하고, 키로 객체를 찾아올 때에는 get() 메소드를 사용한다. 그리고 객체 삭제는 remove() 메소드를 이용한다.

Map에서 중요한 것은 키를 이용해 값을 찾는 다는 것이다. get() 메소드는 키 값을 넣어 해당 키에 맞는 값을 가지고 온다. 제거도 마찬가지.

1
2
3
4
Map<String, Integer> map = ;
map.put("홍길동"30);     //객체 추가
int score = map.get("홍길동");   //객체 찾기 (키 값을 이용)
map.remove("홍길동");     //객체 제거 ( 키 값을 이용 )

위 와 같이 키 값 홍길동과 값 30을 넣는다. 그리고 get()을 이용해 키를 넣어 값을 찾는데 값이 Integer 타입이니 int 값으로 받는다.
또한 remove도 키를 넣어 엔트리를 찾고 삭제 한다.

키를 알고 있다면 get() 메소드로 객체를 찾아오면 되지만 저장된 전체 객체를 대상을 검색해야 한다면 반복자를 통해 돌면서 찾으면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Map<String, Integer> map = ;
Set<K> keySet = map.keySet();
Iterator<K> itr = keySet.iterator();
while(itr.hasNext())
{
    K key = itr.next();
    V value = map.get(key);
}
 
 
//////////////또는 아래와 같은 방법도 가능////////////
Map<String, Integer> map = ;
Iterator<K> itr = map.keySet().iterator();
while(itr.hasNext())
{
    K key = itr.next();
    V value = map.get(key);
}
 
//으로 하면 바로 사용 가능하다

위 소스가 반복자로 돌면서 값을 찾는 방법이다. 둘다 동일한 방법이다.
 keyset을 기준으로 반복을 돌면서 키를 갖고오며 그 키로 값을 갖고 온다.

HashMap
HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬레션이다. HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다. 동등 객체, 즉 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야 한다.

 


주로 키 타입은 String을 많이 사용하는데, String은 문자열이 같을 경우 동등 객체가 될 수 있도록 hashCode()와 equals() 메소드가 재정의 되어 있다. HashMap을 생성하기 위해서는 키 타입과 값 타입을 파라미터로 주고 기본 생성자를 호출하면 된다.

 

키와 값의 타입은 기본 타입(byte, short, int, float, double, boolean, char)을 사용할 수 없고 클래스 및 인터페이스 타입만 가능하다.

예로 String 키와 Int 값을 사용하고 싶으면 다음과 같이 해야한다.

Map<String, Integer> map = new HashMap<String, Integer>();

와 같이 해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
 
import java.util.*;
 
public class HashMapEx {
 
    public static void main(String[] args) {
        //map 컬렉션 생성
        Map<String, Integer> map = new HashMap<String, Integer>();
        
        //객체 저장
        map.put("홍길동"30);
        map.put("이길동"40);
        map.put("김길동"60);
        System.out.println("총 개수 : "+map.size());
        
        //객체 찾기
        System.out.println("홍길동 : "+map.get("홍길동"));
        System.out.println();
        
        //객체를 하나씩 처리
        /*
         Set<String> keySet = map.keySet();
         Iterator<String> keyIter = keySet.iterator();
         이렇게 해도 된다.
         */
        Iterator<String> itr = map.keySet().iterator();
        while(itr.hasNext())
        {
            String key = itr.next();
            int value = map.get(key);
            System.out.println("\t"+key+" : "+value);
        }
        System.out.println();
        
        map.remove("홍길동");
        System.out.println("총 개수 : "+map.size());
        itr = map.keySet().iterator();  //반복자 초기화
        while(itr.hasNext())
        {
            String key = itr.next();
            int value = map.get(key);
            System.out.println("\t"+key+" : "+value);
        }
        
 
    }
 
}
 
Colored by Color Scripter

HashMap에 대한 소스이다. 키, 값으로 저장을 하고 키 값을 통해 접근하여 값을 가지고 온다.

 

그리고 사용자 정의 객체인 Student를 키로 하고 점수를 저장하는 HashMap을 사용해보자.
키 값은 학번과 이름이 동일한 값으로 해야 하기 때문에 Student 클래스에는 hahsCode()와 equals() 메소드가 재정의 되어 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package study_myself_9_from_728;
 
import java.util.*;
 
class Student{
    public int sno;
    public String name;
    
    public Student(int sno, String name)
    {
        this.sno = sno;
        this.name = name;
    }
    
    public boolean equals(Object obj)
    {
        if(obj instanceof Student)
        {
            Student s = (Student) obj;
            return (sno==s.sno) && (name.equals(s.name));
            //학번과 이름이 동일할 경우 true
        }
        else
            return false;
    }
    
    public int hashCode()
    {
        return sno + name.hashCode();
    }
}
 
public class HashMapEx2 {
 
    public static void main(String[] args) {
        Map<Student, Integer> map = new HashMap<Student, Integer>();
        map.put(new Student(1"홍길동"), 50);
        map.put(new Student(1"홍길동"), 90);
        System.out.println("총 개수 : "+map.size());
        
        map.put(new Student(2"김길동"), 70);
        System.out.println("총 개수 : "+map.size());
        
        
        int a = map.get(new Student(2"김길동"));
        System.out.println("값 : "+a);
        
        Student s2 = new Student(1"홍길동");
        a = map.get(s2);
        System.out.println("값2 : "+a);
        
 
    }
 
}
 
 
Colored by Color Scripter

 


와 같이 사용할 수 있다.

Hashtable

Hashtable은 HashMap과 동일한 내부 구조를 가지고 있다. Hashtable도 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다. 
HashMap과의 차이점은 Hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 실행할 수 없다. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다.

 

와 같은 모양을 가지고 있다.

아래 에제는 아이디와 비밀번호를 입력 받아서 Hashtable에 저장되어 있는 키(아이디)와 값(비밀번호)으로 비교한 후 로그인 여부를 출력하는 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
 
import java.util.*;
 
public class HashtableEx {
 
    public static void main(String[] args) {
        Map<StringString> map = new Hashtable<StringString>();
        
        map.put("spring""12");
        map.put("java""132");
        map.put("mysql""123");
        map.put("jdbc""124");
        
        Scanner in = new Scanner(System.in);
        while(true)
        {
            System.out.println("아이디와 비밀번호를 입력해주세요");
            System.out.println("아이디 : ");
            String id = in.nextLine();
            
            System.out.println("비밀번호");
            String pwd = in.nextLine();
            System.out.println();
            
            if(map.containsKey(id))
            {
                if(map.get(id).equals(pwd))
                {
                    System.out.println("로그인 되었습니다.");
                    break;
                }
                else
                {
                    System.out.println("비밀번호가 일치하지 않습니다.");
                }
            }
            else
            {
                System.out.println("입력하신 아이디가 존재하지 않습니다.");
            }
        }
 
    }
 
}
 
Colored by Color Scripter

 

와 같이 사용할 수 있다.


0 Comments
댓글쓰기 폼