Hashmap 을 응용하는 문제가 나왔다.
개념적인 이해만 하고 있던 녀석이라 직접 보니 막막,, 결국 Arraylist로 풀어 버리고 말아서
오늘 검색을 해보았다.
구글에서 검색하니 상위에 위치한 이 블로그의 글로 배워보고자 한다.]
자바/Java 자바 HashMap 이란?
자바를 사용하면서 HashMap이란 용어를 한번쯤을 들어 보셨을 텐데요. 그 HashMap에 대해서 알아보는 시간을 가져 보겠습니다. HashMap이란 Map인터페이스의 한종류로써 Key와 Value 값으로 데이터를 저장하는 형태를 가지고 있습니다.
그러면 가만, Map이란 녀석을 무엇일까요? Map이란 놈은 키(Key) , 값(Value) 을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현하는 데 사용 되는 녀석 입니다. 쉽게 말해 key, value 값으로 저장하는 List 형태의 조상이라고 생각 하시면 됩니다.
Map에 종류에는 Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있습니다. 역시 이들 객체들 또한 key, value로 데이터를 저장하게 됩니다. 그 중에서 오늘은 HashMap에 대해서 다뤄 볼껀데요. HashMap또한 Map인터페이스를 구현한 녀석이기 때문에 Map의 속성을 모두 가지고 있고, 저장 방식 또한 동일 합니다. 그리고 해싱(hashing)이란 검색 방법을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보여줍니다.
HashMap에서 한가지 주의 하실 점이 map에 데이터를 등록할 때 , key값은 중복이 되지 않고 , value값은 중복이 허용된다는 점입니다. 예를들어,
map.put("호랑이" , "힘90")
map.put("여우" , "힘90")
map.put("호랑이" , "힘80")
(최종 호랑이 key에 저장된 value는 "힘80"으로 나중에 입력된 key의 value로 덮어 씌어 집니다.)
이런형태로 key 값이 중복 되어선 안된다는 점입니다. 하지만 value값 ("힘90")은 중복을 허용 합니다. 다시말해 key값을 컬렉션 내의 유일한 key여야 하고, value값은 같은 값이 여러개가 있어도 상관없다는 말입니다.
그러면 HashMap의 기본적인 사용방법을 알아보겠습니다.
TestHashMap .java 파일
// 결과 출력
결과 화면
기본적으로 사용 방법 이러한 방식 입니다. 원하는 Set을 가져온후 iterator를 사용해서 List를 출력하는 방식 입니다. iterator는 Collection에 포함된 객체들에 접근할 수 있는 인터페이스라고 생각 하시면 됩니다. 보통 map에서 사용하는 entrySet() 이나 keySet() 메서드는 반환타입이 Set인 데이터들을 반환해 주는데요.
Set이라는 인터페이스는 Collection인터페이스를 구현한 클래스이기 때문에, iterator를 사용해서 접근 할수 있는 것 입니다. 아래는 HashMap 의 생성자와 메서드 정리 표 입니다.
자바를 사용하면서 HashMap이란 용어를 한번쯤을 들어 보셨을 텐데요. 그 HashMap에 대해서 알아보는 시간을 가져 보겠습니다. HashMap이란 Map인터페이스의 한종류로써 Key와 Value 값으로 데이터를 저장하는 형태를 가지고 있습니다.
그러면 가만, Map이란 녀석을 무엇일까요? Map이란 놈은 키(Key) , 값(Value) 을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현하는 데 사용 되는 녀석 입니다. 쉽게 말해 key, value 값으로 저장하는 List 형태의 조상이라고 생각 하시면 됩니다.
Map에 종류에는 Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있습니다. 역시 이들 객체들 또한 key, value로 데이터를 저장하게 됩니다. 그 중에서 오늘은 HashMap에 대해서 다뤄 볼껀데요. HashMap또한 Map인터페이스를 구현한 녀석이기 때문에 Map의 속성을 모두 가지고 있고, 저장 방식 또한 동일 합니다. 그리고 해싱(hashing)이란 검색 방법을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보여줍니다.
HashMap에서 한가지 주의 하실 점이 map에 데이터를 등록할 때 , key값은 중복이 되지 않고 , value값은 중복이 허용된다는 점입니다. 예를들어,
map.put("호랑이" , "힘90")
map.put("여우" , "힘90")
map.put("호랑이" , "힘80")
(최종 호랑이 key에 저장된 value는 "힘80"으로 나중에 입력된 key의 value로 덮어 씌어 집니다.)
이런형태로 key 값이 중복 되어선 안된다는 점입니다. 하지만 value값 ("힘90")은 중복을 허용 합니다. 다시말해 key값을 컬렉션 내의 유일한 key여야 하고, value값은 같은 값이 여러개가 있어도 상관없다는 말입니다.
그러면 HashMap의 기본적인 사용방법을 알아보겠습니다.
TestHashMap .java 파일
public class TestHashMap {
public static void main(String[] args) {
// HashMap에 Data 넣기 (Key , Value) 형태
HashMap<String , Integer> map = new HashMap<String , Integer>();
map.put("김태희", new Integer(90));
map.put("전혜빈", new Integer(80));
map.put("유인나", new Integer(100));
map.put("아이유", new Integer(90));
// HashMap에 포함된 Key 중에 "유인나"라는 키를 가질 경우 true 리턴 (없을 경우 false)
if(map.containsKey("유인나")){
System.out.println("유인나 최고");
}
// HashMap에 포함된 Key , Value를 Set에 담고 iterator에 값을 Set 정보를 담아 준다.
Set<Entry<String, Integer>> set = map.entrySet();
Iterator<Entry<String, Integer>> it = set.iterator();
// HashMap에 포함된 key, value 값을 호출 한다.
while (it.hasNext()) {
Map.Entry<String, Integer> e = (Map.Entry<String, Integer>)it.next();
System.out.println("이름 : " + e.getKey() + ", 점수 : " + e.getValue());
}
// Map에서 저장된 Key들을 가져올 Set을 만든다.
Set<String> set2 = map.keySet();
System.out.println("참가자 명단 : " + set2);
// Map에 저장된 value값들 Collection<Interger> 형태로 얻어 오고 iterator에 담는다. Iterator<Integer> it2;
Collection<Integer> values = map.values();
it2 = values.iterator();
int total = 0;
while (it2.hasNext()) {
Integer i = (Integer)it2.next();
total += i.intValue();
}
// 결과 출력
System.out.println("총점 : " + total);
System.out.println("평균 : " + (float)total/set.size());
System.out.println("최고점수 : " + Collections.max(values));
System.out.println("최저점수 : " + Collections.min(values));
}
}
결과 화면
유인나 최고
이름 : 김태희, 점수 : 90
이름 : 유인나, 점수 : 100
이름 : 아이유, 점수 : 90
이름 : 전혜빈, 점수 : 80
참가자 명단 : [김태희, 유인나, 아이유, 전혜빈]
총점 : 360
평균 : 90.0
최고점수 : 100
최저점수 : 80
기본적으로 사용 방법 이러한 방식 입니다. 원하는 Set을 가져온후 iterator를 사용해서 List를 출력하는 방식 입니다. iterator는 Collection에 포함된 객체들에 접근할 수 있는 인터페이스라고 생각 하시면 됩니다. 보통 map에서 사용하는 entrySet() 이나 keySet() 메서드는 반환타입이 Set인 데이터들을 반환해 주는데요.
Set이라는 인터페이스는 Collection인터페이스를 구현한 클래스이기 때문에, iterator를 사용해서 접근 할수 있는 것 입니다. 아래는 HashMap 의 생성자와 메서드 정리 표 입니다.
생성자/메서드 | 설명 |
HashMap() | HashMap 객체를 생성한다. |
HashMap(int initialCapacity) | 지정된 값을 초기용량으로 하는 HashMap 객체 생성한다. |
HashMap(int initialCapacity , float loadFactor) | 지정된 값을 초기용량과 load factor의 HashMap 객체 생성한다. |
HashMap(Map m) | 주어진 Map에 저장된 모든 요소를 포함하는 MashMap 을 생성한다. |
void clear() | HashMap에 저장된 모든 객체를 제거한다. |
Object clone() | 현재 HashMap을 복제하여 반환한다. |
boolean containsKey(Object key) | HashMap에 지정된 키(key)가 포함되어 있는지 알려준다. (포함되어 있으면 true) |
boolean containsValue(Object key) | HashMap에 지정된 값(value)가 포함되어 있는지 확인한다. (포함되어 있으면 true) |
Set entrySet() | HashMap에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장하여 반환한다. |
Object get(Object key) | 지정된 키(Key)의 값(객체)을 반환한다. |
boolean isEmpty() | HashMap이 비어 있는지 확인한다. |
Set keySet() | HashMap에 저장된 모든 키가 저장된 Set을 반환 한다. |
Object put(Object key, Object value) | HashMap에 키와 값을 저장 한다. |
void putAll(Map m) | Map에 해당하는 모든 요소를 HashMap에 저장 한다. |
Object remove(Object key) | HashMap에서 지정된 키로 저장된 값(객체)를 제거한다. |
int size() | HashMap에 저장된 요소의 개수를 반환한다. |
Collection values() | HashMap에 저장된 모든 값을 컬렉션 형태로 반환한다. |
// HashMap에 포함된 Key , Value를 Set에 담고 iterator에 값을 Set 정보를 담아 준다.
Set<Entry<String, Integer>> set = map.entrySet();
Iterator<Entry<String, Integer>> it = set.iterator();
// HashMap에 포함된 key, value 값을 호출 한다.
while (it.hasNext()) {
Map.Entry<String, Integer> e = (Map.Entry<String, Integer>)it.next();
System.out.println("이름 : " + e.getKey() + ", 점수 : " + e.getValue());
}
// Map에서 저장된 Key들을 가져올 Set을 만든다.
Set<String> set2 = map.keySet();
System.out.println("참가자 명단 : " + set2);
// Map에 저장된 value값들 Collection<Interger> 형태로 얻어 오고 iterator에 담는다. Iterator<Integer> it2;
Collection<Integer> values = map.values();
it2 = values.iterator();
int total = 0;
while (it2.hasNext()) {
Integer i = (Integer)it2.next();
total += i.intValue();
}
내가 시험 중에 막혔던 부분은 이 부분이다. 이 부분을 알고 갔더라면 하는 아쉬움이 남는다.
위를 보니 Set<Entry<String,Integer>> 로 Set을 정의 하는데 Set에 대해서도 공부가 필요해 보인다.
위에 쓰인 Entry가 생소한 개념이라 공부가 필요하네요.
Set을 이용해 Map의 정보를 가져온 다음 그 Set을 Iterator를 이용해서 검색을 하게 되네요.
자바를 잘하려면 Iterator 사용이 필수적이겠네요.
자바 공부 시작하려니 어렵네요.
좋은 정보 감사합니다.