자바 본 강의

hashCode() 예시와 오버라이딩하기

우주코딩 2021. 8. 10. 22:28

해시값 2

해시값 활용 예 2
원본 파일인지 검사할 때, 해커에 의해 왜곡된 데이터가 아닌지 검사할 때

해시 알고리즘 = 해시값을 생성하는 식 (MD5, SHA, PGP) 등

서버 컴퓨터에서 개인 컴퓨터로 파일을 다운로드 할 때, 해커가 전송 데이터를 왜곡하여 해킹 코드가 삽입된 파일을 다운로드

String 클래스의 hashCode() 메서드는 같은 문자열에 대해 같은 해시값을 리턴한다.

String s1 = "Java";
String s2 = "Java";
System.out.println(Integer.toHexString(obj1.hashCode())); // 같은값
System.out.println(Integer.toHexString(obj2.hashCode())); // 같은값

Map에 값을 저장하는 key로 사용할 때 hashCode()를 오버라이딩 해야한다!
보통 값이 같은지 비교할 때 equals()와 함께 사용된다.
그래서 hashCode()를 오버라이딩 할 때 equals()도 함께 오버라이딩 한다.

hashCode() 오버라이딩하기

인스턴스가 다르더라도 데이터가 같으면 같은 해시 값을 리턴하도록 오버라이딩하기

가장 간단한 방법은 모든 값을 문자열로 만들어 붙인 다음에 String 에 재정의된 hashCode()를 사용하는 것이다.
String 클래스에 있는 hashCode() 는 문자열이 같은 경우 같은 해시 값을 리턴하도록 이미 오버라이딩 되어 있기 때문이다.

public int hashCode(){
    String value = String.format("%s,%d,%d,%d,%d,%.1f", 
          this.name, this.kor, this.eng, this.math,
          this.sum, this.aver);)

    return value.hashCode();
}

데이터가 같으면 문자열이 같을 것이고, 문자열이 같으면 해시 코드의 리턴 값도 같을 것이다.

!정리!

hashCode()를 오버라이딩 하는 이유!

=> 두 개의 인스턴스가 같은 데이터인지 비교하기 위해서!