[Java] 자바 해시코드 hashCord( ) 의 기능 / 오버라이딩

2020-12-08


해시 코드란 객체를 식별하는 하나의 정수 값을 나타내는 말이다. 이는 각 객체의 메모리 번지마다 다른 해시 코드 값을 만들어 리턴하기 때문에, 객체마다 다른 값을 가지게 된다.

 

해당 해시코드는 HasMap / HashSet / Hashtable과 같은 프레임워크에서 논리적 동등 여부를 체크하기 위해서 오버라이딩되곤 하는데, 이와 같은 오버라이딩을 하는 이유를 알아보자.


package hashCode;

public class thashCode {
	public int key;
	
	public thashCode(int key) {
		this.key = key;
	}
	
	
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof thashCode) {
			thashCode trueKey = (thashCord) obj;
			if(this.key == trueKey.key) {
				return true;
			}
		}
		return false;
	}
}

위에 클래스는 동등 객체 비교를 위해 equals 를 오버라이딩 한 thashCode클래스이다. 다만 아직 hashCode는 재정의 해주지 않았다.

package hashCode;

import java.util.HashMap;

public class main {

	public static void main(String[] args) {
		HashMap<thashCode, String> test = new HashMap<thashCode, String>();
		//키값은 thashCode고 매개값은 String인 test hashmap 생성
		
		test.put(new thashCode("1"), "테스트");
		
		String value = test.get(new thashCode("1"));
		//키값 1에 위치한 테스트를 불러오는  value 변수 선언
		System.out.println(value);
		//하지만 출력결과 null 값을 출력함

	}

}

위는 실행을 위한 메인 클래스이다. 해당 클래스에 hashMap 변수인 테스트와 새로운 객체를 생성해 주고 내용으로는 키값은 "1" / 데이터는 "테스트"를 입력해주었다. 

 

이후 value에 테스트 출력을 위한 키값 1에 위치에 있는 데이터를 넘겨주었다. 예상대로라면 "테스트"라는 문자열이 들어가야 하지만 예상과는 다르게 value 값은 null을 출력하게 된다. 이는 hashcode() 값을 재정의 하지 않아 메서드에서 리턴하는 해시 코드가 다르기 때문이다. 이를 위해 정상적인 코드로 재정의 해보겠다.


package hashCode;

public class thashCode {
	public String key;
	
	public thashCode(String key) {
		this.key = key;
	}
	
	
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof thashCode) {
			thashCode trueKey = (thashCode) obj;
			if(key.equals(trueKey.key)) {
				return true;
			}
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		return key.hashCode();
	}
	
}

↑ 위에 클래스는 hashCode를 오버라이딩하여, 기본 object 클래스의 hashcord가 아닌 필드 key의 해쉬 코드 값을 리턴할 수 있게 수정하였다.

 

이후 메인 클래스에서 실행하면 정상적으로 "테스트" 가 출력되는 것을 확인할 수 있다.