개발/Java

[Java] Collection - Map

suniverse 2023. 3. 7. 23:27

🔍 Map 계열 

- 데이터 키(Key)와 값(Value) 한쌍의 형태로 관리하는 자료구조 (해쉬테이블 구조) 

- 키는 중복이 불가능하며, 값은 중복이 가능하다 

=> 키 관리 객체 : Set (중복 제거에 효과적) 

- 구현체 클래스 : HashMap, Properties등 

 

✍ Map 객체에 값을 저장하고 출력하기 

public static void main(String[] args) {
    Map map = new HashMap();

    map.put(1, "Java");
    map.put(2, "JSP");
    map.put(3, "SQL");

    System.out.println("map 객체의 모든 키와 값 출력 : " + map);
}

=> 구현체 클래스 HashMap을 사용하였다. map계열에 데이터를 추가하는 방법은 map.put()을 사용한다. 

왼쪽에는 키 값, 오른쪽에는 저장할 값을 기술하면 된다. 

map객체를 출력하면 

💻

=> 키와 값이 모두 출력된다. 

 

✍ 중복되는 키를 사용하여 다른 값을 저장하는 경우 

지금 3번 키에 SQL이 저장되어 있다. 이 값을 다른 값으로 바꿔서 넣어보자 

public static void main(String[] args) {
    Map map = new HashMap();

    map.put(1, "Java");
    map.put(2, "JSP");
    map.put(3, "SQL");

    System.out.println("3번 키에 Oracle 문자열 저장: " + map.put(3, "Oracle"));
    System.out.println("map 객체의 모든 키와 값 출력 : " + map);
}

이 코드를 실행하면 어떻게 될 까? 

💻

=> 원래 3번 키에 저장되어 있던 SQL 대신 Oracle 문자열이 저장되었다. 이때, 원래 저장되어 있던 SQL 문자열은

Object 타입으로 리턴된다. 

 

✍ 새로운 키에 중복된 값을 저장하는 경우 

map.put(4, "Java");
System.out.println("map 객체의 모든 키와 값 출력 : " + map);

💻

=> 중복된 값 저장이 가능하다 

 

✍ keySet() : Map 객체 내의 모든 키 리턴 

Set keySet = map.keySet();
System.out.println("map 객체 내의 모든 키 : " + keySet);

=> Set 객체의 ketSet() 메서드를 통해 map 객체 내의 모든 키를 리턴 받을 수 있다. 

위와 같이 Set 타입 변수에 저장하거나 Set 타입 객체 형태로 직접 사용도 가능하다. 

 

💻

 

✍ Collection values() : Map 객체 내의 모든 값 리턴 

System.out.println("map 객체 내의 모든 값 : " + map.values());

values() 메서드를 통해 모든 값을 리턴받을 수 있다. 

단, 주의 !!!!!!!!!!!!!!!! Set 타입 또는 List 타입 등의 변수에 할당이 불가능하다. 다운캐스팅도 불가능하다 ! 

 

✍ Set 또는 List 계열 객체 생성 시 파라미터로 전달하여 객체 변환이 가능하다. 

단! 중복된 값이 존재할 경우 Set 타입으로 관리하면 중복이 제거되므로 주의해야한다. 

List values = new ArrayList(map.values());
System.out.println("map 객체 내의 모든 값 : " + map.values());

=> List 계열로 객체를 변경해주었다. (중복 값이 있기 때문에 Set이 아니라 List로 변경하였다) 

모든 값을 출력하면 

💻

=> 정상적으로 출력된다. 

 

✍ 값 제거하기 

System.out.println("4번 키에 해당하는 요소 삭제하기 : " + map.remove(4));
System.out.println("삭제 후 map에 저장된 키와 값 : " + map);

=> remove() 메서드를 통해 값을 삭제 할 수 있다. 삭제하고 싶은 값의 키를 입력해주면 된다. 

위 코드에서는 4번 키에 저장된 값을 삭제하고자 한다. 

 

💻

=> remove메서드를 사용하면 원래 저장되어 있던 값이 리턴된다. 

요소 삭제후 map을 출력하면 정상적으로 값이 삭제된 걸 확인할 수 있다. 

 


🔍 Map 객체 반복하는 방법 

1. Iterator 사용 시 

- Map 객체의 keySet() 메서드를 호출하여 모든 키를 꺼낸 다음 해당 key가 저장된 Set 객체의 

iterator() 메서드를 호출하여 Iterator 객체를 리턴받아 사용한다. 

 

public static void main(String[] args) {
    Map map = new HashMap();
    map.put("010-1111-1111", "홍길동");
    map.put("010-2222-2222", "이순신");
    map.put("010-3333-3333", "강감찬");

    Set keySet = map.keySet(); // map 객체의 keySet() 메서드를 호출 => 모든 키 꺼내기 
    Iterator iterator = keySet.iterator(); // 해당 key가 저장된 Set 객체의 iterator() 메서드 호출

    while(iterator.hasNext()) {
        String phone = iterator.next().toString();
        String name = map.get(phone).toString();
        System.out.println("이름 : " + name + ", 전화번호 : " + phone);
    }
}

=> 반복문을 통해 모든 요소를 출력한다. 

 

키와 값을 꺼내는 방법이 다르다!

 

1) 키를 꺼내기 위해서는 next() 메서드로 반복자의 키에 하나씩 접근한다. 

=> 단! 이때 next() 메서드 리턴타입이 Object이므로 상황에 따라 형변환이 필요하다. 

=> iterator.next().toString(); 

 

2) 값 꺼내기 위해서는 키를 사용하여 get() 메서드를 통해 값에 접근한다. 

=> 단! 이때 get() 메서드 리턴타입이 Object이므로 상황에 따라 형변환이 필요하다 

=> map.get(phone).toString(); 

 

💻


✍ key를 사용하여 반복하지 않고, Map.Entry 객체를 통한 반복 

Set entrySet = map.entrySet();
Iterator entryIterator = entrySet.iterator(); 

while(entryIterator.hasNext()) {
    Map.Entry entry = (Entry) entryIterator.next();
    String phone = entry.getKey().toString();
    String name = entry.getValue().toString();
    System.out.println("이름 : " + name + ", 전화번호 : " + phone);
}

1) Set 타입에 map객체의 entrySet()메서드를 호출한다. 

2) Iterator 타입에 entrySet 객체의 iterator() 메서드를 호출한다. 

3) Map.Entry 타입에 entryIterator의 next() 메서드를 호출한다. 

4) 각 변수에 저장 

5) 출력