'컬렉션'에 해당되는 글 11건

  1. 2007.12.06 자바공부-11.Map 인터페이스 1


 컬렉션 프레임워크의 맵(Map) 역시 컬렉션처럼 계층적 구조를 가지고 있습니다.

맵에 참여하는 모든 객체는 Map 입니다.SortedMap은 특별한 Map이라고 할 수 있습니다
, 컬렉션 프레임워크의 맵은 Map을 정점으로 해서, Map을 상속한 SortedMap 있습니다.

 

 Map은 키(key)와 값(value)을 일대일로 보관하고 있는 객체입니다.

아주 쉽게 생각하면 Key를 보관하는 쪽은 Set, 값을 보관하는쪽은 Collection이라고

생각하면 됩니다. 만약 여러분이 Hashtable을 사용한 적이 있다면 Map을 사용하신

것입니다. 왜냐하면 Hashtable, HashMap은 가장 대표적인 Map이기 때문입니다.

 

Map

void clear()

Map key객체-value객체 대응관계를 제거합니다.

boolean containsKey(Object key)

Map이 객체 key를 갖고 있는지 확인합니다.

Map이 객체 key를 갖고 있으면 true

그외 false

boolean containsValue(Object v)

Map이 객체 v에 대응되는 key를 하나이상 포함하고

있는지 확인합니다.

Map이 객체 v에 대응되는 key를 포함하면 true

그외 false

Set entrySet()

Map에 포함된 key,value객체의 대응 구합니다.

Map에 포함된 key,value Set

boolean equals(Object o)

Map o가 같은지 비교합니다.

Object get(Object key)

Map의 객체 key  대응되는 객체 v를 구합니다.

Map에 객체 key에 대응하는 객체 v가 있으면 객체 v

그외 null

int hashCode()

Map객체의 해쉬값을 돌려줍니다.

boolean isEmpty()

Map key-value 쌍의 존재를 알아봅니다.

Map key-value 쌍이 존재하지 않으면 true

그외 true

Set  keySet()

Map key 객체들을 구합니다.

Map key 객체의 Set

void put(Object key,Object value)

Map Key,value 쌍을 추가합니다.

void putAll(Map t)

Map  Map t key-value쌍을 모두 복사합니다.

void remove(Object key)

Map에서 key-value 쌍을 제가합니다.

int size()

Map에서 key-value 쌍의 개수를 구합니다.

Collection values()

Map에서 value 객체들을 구합니다.

Map value객체의 Collection

 

Map Set Collection이 함께 있는 것으로 이해하면 조금 쉽겠습니다.

키부분은 중복될 수 없으므로 Set이 될테고,값부분은 중복될 수 있으므로 Collection

될 것입니다. Map에서는 키만 제거되고 값만 남아 있는다든지, 키만 있고 값은 없다든지

하는 것은 있을 수 없습니다. Map자체가 키와 값의 쌍을 한꺼번에 저장하도록 고안된

것이기 때문입니다. 대표적인 Map HashMap, Hashtable등이 있습니다.

 

 

SortedMap 인터페이스

 

 Map SortedMap과의 관계는 Set SortedSet과의 관계와 유사합니다.

, Map의 키부분을 Iteration했을때 키 순서대로 정렬되는 것입니다.

대표적인 SortedMap TreeMap이 있습니다.

 아마 여러분이 Map을 사용해야 한다면 대부분  HashMap 또는 Hashtable을 사용하실 것

입니다. HashMap Hashtable의 관계는 ArrayList Vector의 관계처럼 Hashtable

경우 메소드에 synchronized키워드가 붙어 있습니다.

필자의 경우 Map을 사용한다면 거의 HashMap을 사용하고 있습니다.

 

 

 

(Map)과 예제

 

전화번호와 지역

 

전화를 할 때 사용되는 지역번호와 해당 지역의 이름은 서로 대응되는 관계에 있어서

이것을 쌍으로 적절하게 관리하고자 한다면 Map이 적당할 것입니다.

 

 

import java.util.*;

/**

* 지역번호과 지역이름을 관리하는 프로그램

*/

public class RegionNumber {

 

 

    private Map rn ;

 

    public RegionNumber() {

                           rn = new HashMap();

                           rn.put("02","서울");

                           rn.put("032","인천");

                           rn.put("041","충남");

                           rn.put("043","충북");

                           rn.put("052","울산");

                           rn.put("054","경북");

                           rn.put("061","전남");

                           rn.put("063","전북");

                           rn.put("031","경기");

                           rn.put("033","강원");

                           rn.put("064","제주");

    }

 

             /**

             * 정보를 모두 지워버립니다.

             */

    public void initialize() {

                           rn.clear();

    }

   

             /**

             * 지역번호화 지역이름을 추가합니다.

             */

    public void addRegionNumber(String number,String area) {

                           rn.put(number,area);

    }

   

             /**

             * 지역번호와 지역이름의 정보를 제거합니다.

             */

    public void removeRegionNumber(String number) {

                           rn.remove(number);

    }

 

             /**

             * 지역번호로 지역의 이름을 찾습니다.

             */

    public String getRegionByNumber(String key) {  

                           if (rn.containsKey(key))

                                        return (String)rn.get(key);

                           else

                                        return key + "번호에 대한 지역이름은 없습니다.";

    }

   

             /**

             * 지역이름으로 지역번호를 찾습니다.

             */

    public String getNumberByRegion(String value) {

        if (rn.containsValue(value)) {

            String number = "";

            for(Iterator it = rn.keySet().iterator(); it.hasNext(); ) {

                String key =  (String)it.next();

                if (value.equals(rn.get(key))) {

                    number = key;

                    break;

                }

            }

            return number;

        }

        else

            return value + "지역에 대한 지역번호는 없습니다.";

    }

   

             /**

             * 갖고 있는 모든 지역이름

             */

    public Collection getRegions() {

        return rn.values();

    }

   

             /**

             * 갖고 있는 모든 지역번호

             */

    public Set getNumbers() {

        return rn.keySet();

    }

   

             /**

             *  지역번호,지역이름의 정보의 갯수

             */

    public int getRegionNumberSize() {

        return rn.size();

    }

 

    public static void main(String[] args ) {

        RegionNumber rn = new RegionNumber();

        String number = rn.getNumberByRegion("서울");

        System.out.println("서울 " + number);

        String region = rn.getRegionByNumber("031");

        System.out.println("031 " + region);

       

        rn.addRegionNumber("042","대전");

        rn.addRegionNumber("051","부산");

        rn.addRegionNumber("053","대구");

        rn.addRegionNumber("055","경남");

        rn.addRegionNumber("062","광주");

        Collection numbers = rn.getNumbers();

        Collection regions = rn.getRegions();

        System.out.println(numbers);

        System.out.println(regions);

    }

}

예제 5 - 14 RegionNumber.java

 

RegionNumber는 지역번호를 키로하고 지역이름알아내거나 , 지역이름을 알 때 지역번호를

알아내는 유용한 메소드 2개를 정의했는데

public String getRegionByNumber(String key)

             public String getNumberByRegion(String value)

두가지 입니다.

Map을 사용할 때는 항상 선택을 해야합니다.

무슨 말인가하면 Map의 구조상 키값을 알고 있을 때 대응되는 값을 구하기는 참

쉽습니다. 하지만 그 반대의 경우 값을 알고 있을 때 해당되는 키가 어떤 것인지를 쉽게 알

수 있는 메소드는 없습니다.

꼭 알아야 한다면 키를 Set으로 구한 다음 Iterator를 통해서 일일히 값을 검사해서

알아내는 수 밖에 없습니다.

예제 5 - 14는 키를 지역번호로 했기 때문에 지역번호를 알면 지역이름을 아는 것이 아주

쉬워지며, 그 반대인 지역이름을 알 때 지역번호를 구하는 것은 Map에서 키의 Set

구한후 Iterator를 거쳐서 키 값을 구합니다. 그리고 구한 키 값에 대한 값 즉, 지역번호에

대한 지역이름이 메소드의 인자로 들어온 지역이름과 같을 경우, 그 때의 키값이 바로 지역

번호입니다.

 이런 경우 , 지역번호를 알고 지역이름을 찾는 경우의 수가 지역 이름을 알고 지역번호를

구하는 경우보다 훨씬 많을 때에 적합하겠지요. 물론 그 반대의 경우는 키를 반대로

사용해야 하겠습니다.

 

사용자 삽입 이미지

그림 5 - 10 [run RegionNumber ]

Posted by
,