RATSENO

[JAVA]Map 컬렉션 - HashMap 본문

DEV/JAVA

[JAVA]Map 컬렉션 - HashMap

RATSENO 2020. 2. 5. 12:41

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. HashMap의 키로 사용할 객체는 hashCode()와 equals() 메서드를 

재정의해서 동등 객체가 될 조건을 정해야 합니다. 

hash값이란?

 

hash는 '으깨다'라는 뜻으로, Hash는 Hash Table을 이용하여 데이터를 저장한다. 각 객체가 다른 코드값을 int로 생성해 인덱스로 사용하는데 이 알고리즘을 구현한 메소드를 Hash Method라고 하며 Hash Method에 의해 반환된 데이터 고유의 숫자 값을 Hash Code 라고 한다.

 

자바의 모든 클래스가 상속하고 있는 Object에는 hashCode()라는 메소드가 있다.

(객체의 주소값같은 데이터라고 생각하자)

 

그래서 문자열의 hashCode() 메소드는 같은 값을, 객체의 hashCode() 메소드는 다른 값을 반환한다. 
출처 : https://kutar37.tistory.com/entry/%EC%9E%90%EB%B0%94-HashMap-LinkedHashMap-TreeMap

동등 객체, 즉 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야합니다.

주로 키 타입은 String을 많이 사용하는데,

String은 문자열이 같을 경우 동등 객체가 될 수 있도록 hashCode()와 equals() 메소드가 재정의 되어있습니다.

HashMap을 생성하기 위해서는 키 타입과 값 타입을 파라미터로 주고 기본 생성자를 호출하면 됩니다.

Map<K, V> map = new HashMap<K, V>();
//K : 키 타입
//V : 값 타입

키와 값의 타입은 기본 타입(byte, short, int, float, double, boolean, char)을 사용할 수 없습니다.

클래스 및 인터페이스 타입만 가능합니다.

키로 String 타입을 사용하고 값으로 Integer 타입을 사용하는 HashMap은 다음과 같이 생성할 수 있습니다.

Map<String, Integer> map = new HashMap<String, Integer>():
package sample.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapSample {
    public static void main(String[] args) {
        //Map 컬렉션 생성
        Map<String, Integer> map = new HashMap<>();

        //객체 저장
        map.put("A", 100);
        map.put("B", 80);
        map.put("C" , 70);
        System.out.println("총 Entry 수 :" +  map.size());

        //객체 검색
        Integer score = map.get("A");
        System.out.println("A의 점수 :" + score);

        //객체를 하나씩 처리
        Set<String> keySet = map.keySet();
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            Integer value = map.get(next);
            System.out.println("key:"+value);
        }
        System.out.println();

        //객체 삭제
        map.remove("C");
        System.out.println("총 Entry 수 :" +  map.size());

        //객체를 하나씩 처리
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
        while (entryIterator.hasNext()){
            Map.Entry<String, Integer> next = entryIterator.next();
            String key = next.getKey();
            Integer value = next.getValue();
            System.out.println("key:"+value);
        }
        System.out.println();

        //객체 전체 삭제
        map.clear();
        System.out.println("총 Entry 수 :" +  map.size());

    }
}

 

다음 예제는 사용자 정의 객체인 Student를 키로하고 점수를 저장하는 HashMap 사용 예제입니다.

학번과 이름이 동일한 Student를 동등 키로 간주하기 위해 Student 클래스에는 hashCode()와 equals() 메소드가 재정의 되어있습니다.

package sample.map;

public class Student {
    public int sno;
    public String name;

    public Student(int sno, String name) {
        this.sno = sno;
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        //학번과 이름이 동일할 경우 true를 리턴
        if(obj instanceof Student){
            Student student = (Student) obj;
            return (sno == student.sno) && (name.equals(student.name));
        }else{
            return false;
        }
    }

    @Override
    public int hashCode() {
        //학번과 이름이 같다면 동일한 값을 리턴
        return sno + name.hashCode();
    }
}
package sample.map;

import java.util.HashMap;
import java.util.Map;

public class HashMapSample2 {
    public static void main(String[] args) {
        Map<Student, Integer> map = new HashMap<Student, Integer>();

        Student gildong1 = new Student(1, "홍길동");
        Student gildong2 = new Student(1, "홍길동");

        System.out.println("홍길동1 hashCode:" + gildong1.hashCode());
        System.out.println("홍길동2 hashCode:" + gildong2.hashCode());

        System.out.println(gildong1.equals(gildong2));
        System.out.println(gildong2.equals(gildong1));

        map.put(gildong1, 95);
        map.put(gildong2, 95);

        System.out.println("총 Entry 수 : " + map.size());
    }
}
홍길동1 hashCode:54150063
홍길동2 hashCode:54150063
true
true
총 Entry 수 : 1

'DEV > JAVA' 카테고리의 다른 글

CompletableFuture<T> -1  (0) 2021.03.14
[JAVA]TreeSet  (0) 2020.02.05
[JAVA]Map 컬렉션  (0) 2020.02.05
[JAVA]인터페이스  (0) 2019.12.26
[JAVA]추상 클래스  (0) 2019.12.16
Comments