ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Collection - Map
    Java 2020. 1. 9. 20:54
    반응형

    Map In Java

    • 모든 Element는 Key와 Value로 이뤄져있음

    • Key와 Value는 모두 필수값(하나라도 없으면 안됨)

    • Key는 Map에서 고유해야 함

    • Value는 중복되어도 상관 없음

    java.util.Map Interface의 주요 메서드

    // 첫 번째 매개 변수인 Key를 갖고 두 번째 매개 변수인 Value를 가진 Element를 저장
    V put(K key, V value)
    
    // 매개 변수로 넘어온 Map의 모든 Elements를 저장
    void putAll(Map<? extends K, ? extends V> m)
    
    // 매개 변수로 넘어온 Key에 해당되는 값을 넘겨줌
    V get(Object key)
    
    // 매개 변수로 넘어온 Key에 해당하는 Value를 넘겨주며, 해당 Key Value는 Map에서 제거
    V remove(Object key)
    
    // Key의 목록을 Set 타입으로 리턴
    Set<K> keySet()
    
    // Value의 목록을 Collection 타입으로 리턴
    Collection<V> values()
    
    // Map 안에 Entry 타입의 Set을 리턴
    Set<Map.Entry<K,V>> entrySet()
    
    // Map의 크기를 리턴
    int size()
    
    // Map의 내용을 지움
    void clear()

    Map을 구현한 주요 클래스

    Map 인터페이스를 구현한 클래스들은 매우 다양하고 많음

    HashMap(JDK 1.2 ~), TreeMap(JDK 1.2 ~), LinkedHashMap(JDK 1.4 ~)이 가장 유명하고 많이 쓰임

    Hashtable(JDK 1.0 ~)라는 클래스도 있음 

    Hashtable Class

    Collection 인터페이스(JDK 1.2 ~)의 Map 인터페이스를 구현한 것은 JDK 1.2부터이며, 만들어진 Map에 맞추어 보안됨

    Map 인터페이스를 구현하기는 했지만 일반적인 Map 인터페이스를 구현한 클래스들과는 다름

    • Map은 Collection view를 사용하지만, Hashtable은 Enumeration Object를 통해 Elements를 처리

    • Map은 key, value, key-value로 Elements를 순환하여 처리할 수 있지만, Hashtable은 key, value만 가능하고 key-value로는 불가

    • Map은 Iteration을 처리하는 도중 Elements를 제거하는 안전한 방법을 제공, Hashtable은 그렇지 않음

    HashMap 클래스와 Hashtable 클래스의 차이

    • Key OR Value에 null 저장 가능 여부 - HashMap 가능, Hashtable 불가

    • 여러 쓰레드에서 동시 가능 접속 여부 - HashMap 불가, Hashtable 가능

    // Hashtable을 제외한 Map으로 끝나는 클래스를 여러 쓰레드에서 동시에 접근해서 처리하려면?
    Map m = Collection.synchronizedMap(new HashMap(...));
    
    /* JDK 1.0부터 제공되는 Hashtable, Vector는 Class가 Thread Safe함,
     * 나머지는 위와 같이 처리를 해야만 Thread Safe하게 사용 가능
     */

    HashMap Class

    상속 관계

    java.lang.Object
        java.util.AbstractMap<K,V> // 대부분의 주요 메서드 구현
            java.util.HashMap<K,V>

    구현한 주요 메서드

    // 원격으로 Object를 전송하거나, 파일에 저장할 수 있음을 지정
    Serialization
    
    // Object Class의 clone() 메서드 수행 가능 (복제 가능)
    Cloneable
    
    // Map Elements를 처리하는 것과 관련된 메서드 지정
    Map<E>

    생성자

    // 16개의 저장 공간을 갖는 HashMap Object 생성
    HashMap()
    
    // 매개 변수만큼의 저장 공간을 갖는 HashMap Object 생성
    HashMap(int initialCapacity)
    
    // 첫 매개 변수만큼의 저장 공간을 갖고, 두 번째 매개 변수의 로드 팩터를 갖는 HashMap Object 생성
    HashMap(int initialCapacity, float loadFactor)
    
    // 매개 변수로 넘어온 Map을 구현한 Object에 있는 Elements를 갖는 HashMap 객체 생성
    HashMap(Map<? extends K, ? extends V> m)

    HashMap의 Key

    기본 자료형과 참조 자료형 모두 가능

    직접 만든 클래스를 Key로 사용할 경우, Object Class의 hashCode() 메서드와 equals() 메서드를 잘 구현해야 함

    Java Map Buckets
    - HashMap에 Object를 넣으면 hashCode() 결과에 따른 bucket이라는 List 형태의 저장공간이 만들어짐
    - 만약 서로 다른 키인데, hashCode() 메서드 return 결과가 동일하다면, 해당 bucket에 여러 값이 들어올 수 있음
    - get()이 호출되면 hashCode()의 결과를 확인 후, bucket에 들어간 목록에 값이 여러개일 경우 equals()를 호출하여 동일 값을 찾게 됨
    - 즉, key가 되는 객체 생성시 equals()와 hashCode()를 잘 구현해주어야 문제가 없음

    HashMap에 값 넣기

    Collection은 add() - 추가한다고 표현

    Map은 put() - 넣는다고 표현

    HashMap에 값 대치하기

    Collection은 수정시 set()

    Map은 값 넣는 것과 동일하게 put() - 없으면 추가, 있으면 대치

    HashMap에서 값 추출하기

    Collection은 없는 index로 get() 사용시 ArrayIndexOutOfBoundsException

    Map은 없는 key로 get()을 할 경우 null

    HashMap에서 값을 확인하기

    // HashMap에 어떤 Keys가 있는지 확인
    Set<K의 Generic Type> keySet()
    
    // Key에 해당되는 Value 출력
    get(K);
    
    // HashMap에 어떤 Values가 있는지 확인 - Collection Interface import 필요
    Collection values()
    
    /* Map에 선언된 Entry라는 타입의 Object가 Elements로 들어있는 Set 리턴
     * Entry에는 단 하나의 Key와 Value만이 저장됨
     * - getKey()와 getValue()로 키와 값을 가져옴
     * java.util.Map.Entry, java.util.Set import 필요
     */
    Set<Entry<K Type, V Type> entrySet()
    
    // 매개 변수로 넘긴 Key가 존재하는지 확인, 있으면 true
    boolean containsKey(K)
    
    // 매개 변수로 넘긴 Value가 존재하는지 확인, 있으면 true
    boolean containsValue(V)

    HashMap에서 Elements를 제거하기

    // Key 기준으로 삭제
    remove(K);

    HashMap Elements 개수 확인

    size()

    TreeMap Class - 정렬된 Map

    HashMap 객체의 Key를 정렬하는 방법

    • Arrays라는 클래스를 사용 - 단점) 불필요한 객체가 생김

    • TreeMap 클래스 - 저장하면서 키를 정렬 (위의 단점 보강)

    TreeMap

    Key를 정렬하여 저장하고, Key의 목록을 가져와 출력해보면 정렬된 순서대로 제공

    • 매우 많은 데이터를 TreeMap을 이용하여 보관시 HashMap보다는 느림(정렬)

    Key를 정렬하는 이유

    • SortedMap 인터페이스를 구현

    • SortedMap 구현시 모두 Key가 정렬되어 있어야만 함

    Key 정렬시 장점 - 아래 메서드를 제공하여 키를 검색하는 프로그램 작성 시 도움

    • firstKey() : 가장 앞에 있는 키

    • lastKey() : 가장 뒤에 있는 키

    • higherKey() : 특정 키 뒤에 있는 키

    • lowerKey() : 특정 키 앞에 있는 키

    TreeMap의 정렬 순서

    문자열 기준 : 숫자 - 알파벳 대문자 - 알파벳 소문자 - 한글

    (다른 Object나 숫자형일 경우 순서가 달라짐)

    Properties Class

    자바에서는 시스템의 속성을 해당 클래스를 사용하여 확인 가능

    Hashtable Class를 extends하여, Map 인터페이스에서 제공하는 모든 메서드 사용 가능

    Key와 Value 형태로 데이터가 저장

    자주 사용하는 속성

    // 사용자의 사용 언어
    user.language
    
    // 사용중인 기본 디렉터리
    user.dir
    
    // 사용자 계정의 홈 디렉터리
    user.home
    
    // 자바에서 사용하는 임시 디렉터리
    java.io.tmpdir
    
    // 파일 기본 인코딩
    file.encoding
    
    // 유니코드 인코딩
    sun.io.unicode.encoding
    
    // 경로 구분자
    path.separator
    
    // 파일 구분자
    file.separator
    
    // 줄(line) 구분자
    line.separator

    Properties 클래스의 주요 메서드

    // 파일에서 속성 읽기
    void load(InputStream inStream)
    void load(Reader reader)
    
    // XML 속성 읽기
    void loadFromXML(InputStream in)
    
    // 파일에 속성 저장 - comments : 주석으로 저장
    void store(OutputStream out, String comments)
    void store(Writer writer, String comments)
    
    // XML로 구성되는 속성 파일 생성 - comments : 주석으로 저장
    void storeToXML(OutputStream os, String comment)
    void storeToXML(OutputStream os, String comment, String encoding)

    시스템 속성만 저장할 수 있는 것이 아니고, 원하는 여러 속성 값을 Properties 객체로 만들어 사용 가능

    반응형

    'Java' 카테고리의 다른 글

    java.math.BigDecimal  (0) 2020.01.13
    java.util Package  (0) 2020.01.13
    Collection - Queue  (0) 2020.01.08
    Collection - Set  (0) 2020.01.08
    Collection - List  (0) 2020.01.08

    댓글

Designed by Tistory.