본문 바로가기
프로그래밍/Java

[JAVA 이론] Map Collection

by purplebulb 2018. 11. 18.
반응형


1. 특징


① Entry구조: 키(key, 객체)와 값(value, 객체)를 저장

 

② 키는 중복 저장 불가, 값은 중복 저장 가능

- 기존에 저장되어 있는 키와 같은 키로 저장 시, 기존 값은 새로운 값으로 업데이트 됨

 



2. Map인터페이스 메소드


- 특징 : 키로 객체들을 관리, 키를 매개값으로 갖는 메소드 다수


 기능

메소드

설명 

객체 추가

 put(Key,Value)

 - 키와 값 추가

 - 저장 시 값 반환

 객체 검색

 containsKey(Key)

 - 키 저장 여부 조사

 - 논리 값 반환

 containsValue(Value) 

 - 값 저장 여부 조사

 - 논리 값 반환

 Set<Map.Entry<Key,Value>>entrySet( )

 - Set에 Map.Entity 객체(키, 값 쌍)를 저장하여 반환

 get(Key)

 - 키가 있는 값 반환

 isEmpty( ) 

 - 컬렉션 비어 있는지 여부 조사

 - 논리 값 반환

 Set<Key> keyset( ) 

 - Set에 모든 키를 담아 반환

 int size( )

 - 저장된 키의 총 수 반환

 Collection<Value> values( )

 - 저장된 모든 값을 컬렉션에 저장하여 반환 

 객체 삭제

 clear( )

 - 모든 Map.Entity 객체(키, 값 쌍) 삭제

 - 반환 값 없음

 remove(Key)

 - 주어진 키와 일치하는 Map.Entity 객체(키, 값 쌍) 삭제

 - 값을 반환





3. Map인터페이스의 구현 클래스



(1) HashMap


1) 특징


① Key값 중복 확인 방법

- hashcode( ) 메소드 호출 : 저장할 객체의 해시코드를 얻음, 저장할 객체의 해시코드와 저장된 객체의 해시코드 비교

  해시코드가 같을 경우 equals( ) 메소드 호출, 해시코드가 다른 경우 다른 key로 인식


- equals( ) 메소드 호출 : 동일한 해시코드가 있을 경우 저장할 key값과 저장된 key값을 추가 비교

      true값 반환 시, 동일 key로 판단, false 반환시 다른 key로 판단



② 키와 값 타입 제약

- 가능한 타입 : 클래스 타입, 인터페이스 타입

- 불가능한 타입 : 기본 타입 (byte, short, int, float, double, boolean, char)



2) 예시


① 예시1


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
package collectiontest;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
public class Example {
    
    public static void main(String[] args) {
        
        //1.객체 생성
        Map<String, Integer> map = new HashMap<String,Integer>();
        
        //2.객체 저장
        map.put("김밥",3000);
        map.put("라면",2000);    
        map.put("튀김",5000);    
        
        //3-0.객체 검색
        map.get("김밥");
 
        //3-1.저장된 전체 객체를 대상으로 하나씩 객체 얻는 방법(반복해서 key를 얻음, Map에서 값 찾음)
        Set<String> KeySet = map.keySet();
        Iterator<String> KeyIterator = KeySet.iterator();
        
        while (KeyIterator.hasNext()) {
            String key = KeyIterator.next();
            Integer value = map.get(key);        
            System.out.println(value);
        }
        
        //3-2.저장된 전체 객체를 대상으로 하나씩 객체 얻는 방법(반복해서 Map.Entity를 얻음, Map.Entity에서 키와 값 찾음)
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String,Integer>> entryIterator = entrySet.iterator();
        
        while (entryIterator.hasNext()) {
            Map.Entry<String,Integer> entry = entryIterator.next();
            System.out.println(entry);            
        }
        
        
        //4-0.객체 삭제(키로 Map.Entity 제거)
        map.remove("김밥");
 
        //4-0.객체 삭제(모든 Map.Entity 제거)
        map.clear();
        
    }
}
 





② 예시2


- [Product]


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
package collectiontest;
 
public class Product {
 
    public int productCode;
    public String name;
 
    public Product(int productCode, String name) {
        this.productCode = productCode;
        this.name = name;
    }
    
    // 제품코드와 제품명이 동일할 경우 true값 반환
    public boolean equals(Object obj) {
        if (obj instanceof Product) {
            Product product = (Product) obj;
            return (productCode==product.productCode) && (name.equals(product.name));
        }else {
            return false;
        }
    }
    
    // 제품코드와 제품명이 동일할 경우 동일한 해시코드 반환    
    public int hashCode() {
        return productCode + name.hashCode();
    }
}
 
                                                                            




- [Example]_Product의 키와 값이 동일할 경우 같은 키


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package collectiontest;
 
import java.util.HashMap;
import java.util.Map;
 
public class Example2 {
 
    public static void main(String[] args) {
        
        //1.Map 컬렉션 생성
        Map<Product, Integer> map = new HashMap<Product,Integer>();
        
        //2.객체 저장 (제품 코드와 제품명이 동일한 Product객체를 키로 저장)
        map.put(new Product(1000"볼펜"), 800);
        map.put(new Product(1000"볼펜"), 800);
    }
}
 





(2) Hashtable


①  HashMap과의 공통점 

- Key값 중복 확인 : hashcode( ) 메소드,  equals( ) 메소드 호출


② HashMap과의 차이점
- 동기화된 메소드로 구성
- 멀티스레드가 동시에 메소드를 실행할 수 없어 멀티 스레드 환경에서 안전하게 객체 추가, 삭제 가능



(3) Properties


① Hashtable의 하위 클래스

② 키, 값 제약 : String 타입만 가능


③ 사용법

- 애플리케이션 옵션 정보 얻기

- 데이터베이스 연결 정보 얻기

- 다국어 정보 저장 프로퍼티 파일 읽기




(4) TreeMap


1) 특징


① 이진 트리 기반 

- 첫 번째로 저장된 루트 노드부터 시작,  값의 크기를 비교하면서 작은 값은 왼쪽, 큰 값은 오른쪽에 저장

    ( 왼쪽 노드부터 오른쪽 노드까지 오름차순, 오른쪽 노드부터 왼쪽 노드까지 내림차순 )

- 문자 저장 시, 문자의 유니코드 값을 비교


② 노드 구성 

- Map.Entry (키, 값)

- 변수 : 왼쪽 노드와 오른쪽 노드 (자식 노드)를 참조하기 위한 변수 2개


③ 객체 저장 방식 

- 자동 정렬

- 부모 키값과 비교 후 낮은 것은 왼쪽 자식 노드에 저장, 높은 것은 오른쪽 자식 노드에 저장




2) 메소드


① 검색 메소드


 메소드

설명 

 firstEntry( )

 제일 아래 Map.Entry 반환 

 lastEntry( )

 제일 위 Map.Entry 반환 

 lowerEntry(key) 

 주어진 객체 바로 아래 Map.Entry 반환 

 higherEntry(key) 

 주어진 객체 바로 위 Map.Entry 반환 

 floorEntry(key) 

 주어진 키와 동등한 키가 있을 경우 Map.Entry 반환, 없으면 주어진 키 바로 아래 Map.Entry 반환 

 ceilingEntry(key)

 주어진 키와 동등한 키가 있을 경우 Map.Entry 반환, 없으면 주어진 키 바로 위 Map.Entry 반환 

 pollFirstEntry( )

 제일 아래 Map.Entry 추출 후 제거

 pollLastEntry( )

 제일 위 Map.Entry 추출 후 제거




② 정렬 메소드


 메소드

설명 

descendingKeySet( ) 

 - 내림차순 정렬

 - 반환 타입 : NavigableSet<Key>

descendingMap( )

 - 내림차순 정렬 : 한 번 사용

 - 오름차순 정렬 : 두 번 사용 

 - 반환 타입 : NavigableMap<Key,Value>




③ 범위 검색 메소드 


 메소드

설명 

 headMap (K toKey, boolean inclusive) 

  - 주어진 키보다 아래 Map.Entry 반환

  - 주어진 키의 Map.Entity 포함 여부는 두 번째 매개값에 따름

  - 반환 타입 : NavigableMap<Key,Value>

 tailMap (K fromKey, boolean inclusive)

  - 주어진 객체 보다 위 Map.Entry 반환

  - 주어진 객체 포함 여부는 두 번째 매개값에 따름

  - 반환 타입 : NavigableMap<Key,Value>

subMap(K fromKey, boolean fromInclusive, 

       K toKey, boolean toInclusive ) 

  - 주어진 키 사이의 Map.Entry들을 반환

  - 매개값 설명 : 시작 키, 시작  Map.Entry포함 여부, 끝 키, 끝 Map.Entry 포함 여부

  - 시작과 끝 키의 Map.Entry 포함 여부는 두 번째, 네 번째 매개값에 따름

  - 반환 타입 : NavigableMap<Key,Value>


댓글