어디 갔다가 어제 집에 돌아와서 며칠간 학습을 못했다 오늘 화이팅해야한다 ^o^
Map컬렉션 (HashMap, HashTable, LinkedHashMap, Properties, TreeMap ...)
구조: 키와 값으로 구성된 Map.Entry 객체를 저장하는 구조
Entry: Map인터페이스 내부에 선언된 중첩인터페이스. 여기서 키, 값은 객체다.
<<Map컬렉션의 구조>>
Entry객체는 키,값 쌍으로 구성된다.
<<Map컬렉션에서 공통적으로 사용 가능한 Map인터페이스의 메소드>>
기능 | 메소드 | 설명 |
객체 추가 | V put(K key, V value) | 주어진 키로 값을 저장 ㅇ새로운 키일 경우 : null 리턴 ㅇ동일키가 있을 경우 : 값 대체하고 '이전 값'을 리턴 |
객체 검색 | boolean containsKey(Object key) | 키 존재여부 확인 |
boolean containsValue(Object value) | 값 존재여부 확인 | |
Set<Map.Entry<K,V>> entrySet() | 모든 Map.Entry객체를 Set에 담아 리턴 | |
V get(Object key) | 그 키의 값을 리턴 | |
boolean isEmpty() | 컬렉션이 비어있는지 여부 확인 | |
Set<K> keySet() | 모든키를 Set객체에 담아서 리턴 | |
int size() | 저장된 키의 총 수 리턴 | |
Collection<V> values() | 모든 값을 Collection에 담아 리턴 | |
객체 삭제 | void clear() | 모든 Map.Entry삭제 (키와 값) |
V remove(Object key) | 이 키와 일치하는 Map.Entry삭제하고 값을 리턴 |
타입 파라미터 K, V => 키, 값으로 저장되는 객체 타입을 Map컬렉션 생성시 결정하게 된다.
예)
두번째 매개값은 30이 포장된Integer객체가 된다. (자동 박싱)
저장된 전체 객체 정보를 하나씩 얻는 방법 ㅡ 두 가지 방법
1.keySet() 메소드로 모든 키를 Set컬렉션으로 얻기 -> 반복자로 하나씩 얻는 키를 통해 값 얻기
2.entrySet() 메소드로 모든 Map.Entry(키와 값)을 Set컬렉션으로 얻기 -> 반복자로 Map.Entry를 하나씩 얻고 getKey()와 getValue() 메소드를 이용해 키, 값 얻기
이제는 Map 컬렉션의
HashMap, Hashtable을 공부해보자
HashMap
●HashMap 생성하기
Map<K, V> map = new HashMap<K, V>();
Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer>map = new HashMap<>();
키, 값 타입은 기본타입 사용 못한다 -> 클래스, 인터페이스 타입만 사용 가능.
●HashMap - 동등객체 판단 관련
ㅇHashMap의 키로 사용할 객체 -> hashCode()와 equals() 메소드를 재정의해서 '동등객체가 될 조건'을 필요에 맞게 정해야 한다.
(이전에 학습한 내용 기억하기! 필드값이 같으면 동등객체라고 판단하게 하기 위해서 equals를 재정의했었고, 객체의 해시코드가 아닌 해당 필드의 해시코드를 리턴하게 재정의 했었다.)
HashMap의 키 : 여기서 키로 사용할 객체로서 '동등객체'라면 -> 서로 다른 객체더라도 같은 해시코드를 리턴해야 한다.
즉, 동등객체의 조건에 따라 hashCode() 리턴값이 같게, equals()가 true를 리턴하도록 하여 '동등객체'라고 재정의해야 한다.
=>키 타입으로 String을 많이 사용한다 : Stirng은 이미 문자열이 같을 경우 동등객체가 되도록 hashCode()와 equals() 메소드가 재정의되어있다.
●예제 : 이름을 키로, 점수를 값으로 저장 ㅡ HashMap 사용
참고)
Map.Entry인터페이스는 static이다.
●예제2 : 사용자정의 Student객체를 키로, 점수를 값으로 저장하는 HashMap 사용 방법
ㄴStudent를 정의할 때, 동등객체를 처리하기 위해 equals()와 HashMap() 메소드를 재정의해야 한다.
ㄴ꼭@@ 키로 사용할 객체 내용을 직접 작성해야 할 때, 키의 동등객체 처리를 잊지 말자!!
사용자정의 객체를 Map컬렉션의 키로 사용할 때
동등객체 인식 처리를 위해 두 메소드를 재정의하는 것 기억하기!
Hashtable
ㄴHashMap과 동일한 내부구조 (마찬가지로 equals와 hashCode()의 재정의를 통해 동등객체 조건을 정해야 함)
HashMap과의 차이점: "동기화된 메소드로 구성되어 있다"
->저번에 List컬렉션에서 공부했던 내용과 비슷한 맥락이다.
ArrayList와 동일한 내부구조인 Vector클래스에서 둘의 차이점은 동기화메소드로 구성되어있는지 여부의 차이이다.
cf)멀티스레드
Hashtable
ㄴsynchronized메소드로 구성되어 있어서 멀티스레드가 동시에 해당 메소드 이용을 못 한다.
하나의 스레드가 실행을 완료해야 한다.
=>멀티스레드 환경에서 안전하게 객체를 다룰 수 있음 => Hashtable은 스레드에 안전함 (thread safe)
생성 방법은 HashMap생성법과 다르지 않다.
Map<K, V> map = new Hashtable<K, V>();
●예제 :
키보드로 아이디, 비밀번호 입력받아서 Hashtable의 키,값과 비교한 후 로그인 여부 출력하기
확인문제 09
몇일 뒤에 이 확인문제를 혼자 풀어보면서 복습이 많이 되었다
entrySet 개념이 희미해질 뻔 했는데 다행히 다시 잡았다. 메모해둬야겠다
아무튼 나는 먼저 이렇게 작성을 했다.
답지를 확인해보자. 답지는 Iterator를 안 쓰나..!!
어떻게 안 쓸 수 있을까??
>>향상된 for문을 사용해서 entrySet을 변수에 담아 하나씩 비교!!
아 ㅠㅠ 객체를 하나씩 처리하는 방법으로 두 가지를 배웠었지
1. Iterator
2. 향상된 for문
힌트를 얻었으니까 향상된 for문으로 다시 작성을 해보자
저 노란 부분을 향상된 for문으로!
이 부분만 Iterator사용하는 것 대신 향상된 for문을 사용해봤다!! 이렇게 바꿔 작성해줄 수도 있다.
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 8/13 13-2 [컬렉션프레임워크] [LIFO(후입선출)/Stack클래스] [FIFO(선입선출)/Queue인터페이스] (0) | 2020.08.13 |
---|---|
[5주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.08.09 |
[4주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.08.02 |
[혼자 공부하는 자바] 8/1 13-1 [Set 컬렉션] [Set 인터페이스] [HashSet] (0) | 2020.08.02 |
[혼자 공부하는 자바] 7/31 13-1 [List 컬렉션] [ArrayList] [Vector] [LinkedList] (0) | 2020.07.31 |