hashcode, equals 메서드
hashCode(Object obj)
와 equals(Object obj)
는 Object
클래스가 가지는 메서드중 하나이다.
hash functions
- hash function 𝒉
hash-key
를 입력으로 받아bucket number
를 출력하는 함수 bucket number
0부터 B-1의 값을 가지는 정수 (B는 bucket의 수)hash key
어떤 data type이든 가능하다.
hash function 𝒉는 hash-key
를 무작위 추출(randomize)한다.
즉, 𝒉는 적당한 수의 hash-key
들을 B개의 bucket
으로 거의 균일하게 대응시킨다.
hash-key
의 수가 B보다 작은 경우 모든 hash-key
를 각 bucket
으로 균일하게 대응시킬 수 없다. 이는 적당한(reasonable) 수가 아니다.
일반적으로 hash code
가 동일한 객체가 존재하는 것이 가능하다.
hash function을 이용한 hashing 기법은 대량의 데이터를 저장하고 검색하는 데 유용하다.
찾는 값의 hash-key
를 입력하면 그 값이 저장된 위치(bucket)를 알려주는 hash code
를 반환한다.
해당 bucket에서만 값을 탐색하면 되기 때문에 일반적으로 linear search, binary search보다 빠르다.
example
int hashFunction(int hashKey) {
return hashKey % 5;
}
위의 함수는 임의의 입력에 대해 5개의 bucket을 생성한다.
modulo operation을 이용해 해시함수를 만드는 경우에는 소수를 사용하는 것이 좋다.
hashCode
이 메서드는 hash function
을 구현한 것이다.
Object
클래스에 정의된 hashCode
메서드는 객체의 주소값을 사용해 hash code를 만들어 반환한다.
- 32-bit JVM - 객체와 hash code값이 일대일대응
- 64-bit JVM - hash code값이 중복될 수 있다.
64-bit JVM에서는 8bytes 주소값을 사용하는데 이 값으로 4bytes hash code를 만들기 때문이다.
두 객체의 같고 다름을 필드 값을 기준으로 결정하고 싶다면 equals
메서드 뿐만 아니라 hashCode
메서드도 오버라이딩해야 한다.
해싱기법을 사용하는 HashMap
이나 HashSet
과 같은 클래스는 내부적으로 hashCode
메서드를 사용해 두 객체가 같은지 다른지 판단하기 때문이다.
hashCode
메서드를 오버라이딩할 때에는 주로 Objects.hash(...)
메서드를 사용한다.
equals
참조변수의 주소값을 비교한다.
public boolean equals(Object obj) {
return (this == obj);
}
equals
함수는 위와 같이 정의되어 있다.
public class Study {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("true");
else
System.out.println("false");
}
}
class Value {
private int value;
public Value(int value) {
this.value = value;
}
}
위의 코드에서 v1
이 가리키는 객체와 v2
가 가리키는 객체는 필드 값이 10
으로 똑같지만 주소값이 다르기 때문에 결과는 false
이다.
객체의 주소가 아닌 필드값을 기준으로 같고 다름을 판단하고 싶다면 equals
메서드를 오버라이딩하면 된다.
class Value {
private int value;
public Value(int value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
return (this.value == ((Value)obj).value);
}
}
Comments