JAVA/about java

[Collection] Map

dev_rosieposie 2023. 5. 1. 14:46

24  자바랭 다음으로 많이 쓰는 애들은 컬랙션 - Part3(Map)

  1. Map 형태의 자료 구조는 무엇과 무엇으로 구성되어 있는가?
    • key, value
  2. Map 에서 데이터를 저장하는 메소드는?
    • put()
  3. Map 에서 특정 키에 할당된 값을 가져오는 메소드는?
    • get()
  4. Map 에서 특정 키와 관련된 키와 데이터를 지우는 메소드는?
    • remove()
  5. Map 에서 키의 목록을 가져오는 메소드는?
    • keySet()
  6. Map 에 저장되어 잇는 데이터의 크기를 가져오는 메소드는?
    • size()
  7. HashMap과 HashTable 중에서 키나 값에 null을 저장할 수 있는 것은?
    • HashMap
  8. HashMap과 HashTable 중에서 여러 쓰레드에서 동시에 접근해도 문제가 없는 것은?
    • HashTable
  9. HashMap에서 특정 키가 존재하는지 확인하는 메소드는?
    • containsKey()
  10. 이 장에서 살펴본 클래스 중, 키가 저장되면서 정렬되는 Map은?
    • TreeMap
  11. Properties 클래스는 어떤 클래스를 확장했는지?
    •  HashTable
  12. Properties 클래스의 객체에 있는 데이터를 파일로 저장할 때에는 어떤 메소드를 사용하는지?
    • storeToXML()

Map이란

  • Key-Value 쌍으로 데이터를 저장
  • 각각의 Key는 고유한 값 - 중복 허용 x
  • Value는 Key에 해당하는 데이터를 저장

Map을 구현한 주요 클래스

  • HashMap
  • TreeMap
  • LinkedHashMap
  • Hahtable

Map vs Hashtable

Map Hashtable
컬렉션 뷰 사용하여 데이터 처리 Enumeration 객체 사용하여 데이터 처리
키-값, 키-값 쌍으로 데이터를 순환하여 처리 키-값 쌍으로 데이터를 순환하여 처리 불가
이더레이션 처리 중에 데이터를 삭제하는 안전한 방법을 제공 이더레이션 처리 중에 데이터를 삭제하는 안전한 방법 제공하지 않음

HashMap vs Hashtable

기능 HashMap Hashtable
키나 값에 null 저장 가능 여부  가능 불가능
여러 스레드 안전 여부 불가능 가능

Hashtable을 제외한 Map으로 끝나는 클래스들은 여러 스레드에서 동시에 접근하여 처리할 필요가 있는 경우, 다음과 같이 한다

Map m = Collections.synchronizedMap(new HashMap(...));

jdk 1.0부터 제공되는 Hashtable, Vector 클래스가 스레드에 안전하게 개발되어 있고, jdk 1.2부터 제공되는 대부분의 collection 관련 클래스들은 이와 같은 처리를 해야하거나 이름에 Concurrentrk 포함되어야만 스레드에 안전하게 사용 가능.

 

HashMap

java.lang.Object

  -java.util.AbstractMap<K,V>

    -java.util.HashMap<K,V>

  • Serializable, Clonable, Map<E> 인터페이스를 구현
  • 대부분 객체 생성시 매개변수가 없는 생성자를 사용하나, 담을 데이터의 개수가 많은 경우 초기 크기를 지정 권장
  • HashMap의 키는 기본자료형과 참조자료형 모두 가능하나, 어떤 클래스를 직접 만들어 그것을 키로 사용할 때는 Object 클래스의 hashCode()와 equals()구현을 해야한다
    • 서로 다른 키가 저장되는데, hashCode() 메소드의 결과가 동일한 경우, 이 버켓에 여러 개의 값이 들어갈 수 있다. 따라서 get() 호출시,  hashCode() 결과를 확인하고 버킷에 들어간 목록에 데이터가 여러개인 경우 equals()를 호출하여 동일한 값을 찾게 되기 때문이다.

주요 메소드

  • put() : 데이터를 추가하거나 수정
  • get() : 값을 꺼낼 때 사용
    • Map에서는 인덱스로 값을 찾기 않기 때문에, ArrayIndexOutOfBoundException 예외가 발생하지 않고, null을 리턴한다.
  • keySet() : 어떤 키가 있는지를 확인
  • values() : HashMap에 담겨 있는 값의 목록을 Collection 타입의 목록으로 리턴
  • entrySet() : Map에 선언된 Entry 타입의 객체를 리턴하며, Entry에는 단 하나의 키와 값만 저장
  • containsKey() : 매개 변수로 넘긴 키가 존재하는지 확인하고 boolean으로 리턴
  • containsValue() : 메개 변수로 넘긴 값이 존재하는지 확인하고 boolean으로 리턴

* 자바의 자료 구조 중에서 저장 순서가 중요한 것은 List와 Queue 뿐이다. Set은 데이터가 중복되지 않는 것이 중요하고, Map은 키가 중복되지 않는 것이 중요하다.

 

TreeMap

  • 정렬된 키의 목록 ( 숫자 > 알파벳 대문자 > 알파벳 소문자> 한글 순)
  • 키를 정렬하는 것은 SortedMap이라는 인터페이스를 구현했기 때문이고, SortedMap을 구현한 클래스들은 모두 키가 정렬되어 있어야만 한다

Properties 클래스

  • Hashtable을 확장
  • System 클래스에 static으로 선언되어있는 getProperties() 메소드를 호출하면 Properties 타입의 객체를 리턴한다
public void checkProperties(){
    Properties prop = System.getProperties();
    Set<Object> keySet = prop.keySet();
    for(Object tempObject : keySet){
        System.out.println(tempObject+"="+prop.get(tempObject));
    }
}

Properties 클래스에서 제공하는 메소드

리턴 타입 메소드 이름 및 매개 변수 설명
void load(InputStream inStream) 파일에서 속성을 읽는다
void load(Reader reader)
void loadFromXML(InputStream in) XML로 되어 있는 속성을 읽는다
void store(OutputStream out, String comments) 파일에 속성을 저장한다
void store(Writer writer, String comments)
void storeToXML(OutputStream out, String comment) XML로 구성되는 속성 파일을 생성한다
void storeToXML(OutputStream out, String comment, String encoding)
public void saveAndLoadProperties(){
    try{
        String filename = "test.properties";
        File propertiesFile = new File(filename);
        FileOutputStream fos = new FileOutputStream(propertiesFile);
        Properties prop = new Properties();
        prop.setProperty("Writer", "daseul, kim");
        prop.setProperty("WriterHome", "http://www.GodOfJava.com");
        prop.store(fos, "Basic Properties file");
        fos.close();

        FileInputStream fis = new FileInputStream(propertiesFile);
        Properties propLoaded = new Properties();
        propLoaded.load(fis);
        fis.close();
        System.out.println(propLoaded);
    }catch (Exception e) {
       e.printStackTrace();
    }
}

public void saveAndLoadPropertiesXML(){
    try{
        String filename = "test.xml";
        File propertiesFile = new File(filename);
        FileOutputStream fos = new FileOutputStream(propertiesFile);
        Properties prop = new Properties();
        prop.setProperty("Writer", "daseul, kim");
        prop.setProperty("WriterHome", "http://www.GodOfJava.com");
        prop.storeToXML(fos, "Basic XML Properties file");
        fos.close();

        FileInputStream fis = new FileInputStream(propertiesFile);
        Properties propLoaded = new Properties();
        propLoaded.loadFromXML(fis);
        System.out.println(propLoaded);
        fis.close();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

해당 메소드 실행시, test.properties, test.xml파일이 생성됨