[Java] Collection - Map
🔍 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) 출력