GetHashCode 메서드는 특정 인스턴스를 고유하게 식별할 수 있는 4바이트 int 값을 반환한다.
GethashCode와 Equals 메서드를 연계해서 사용할 수 있다.
Equals 값이 True라면 같은 객체인것이고, 또한 그 객체를 식별하는 [고윳값] 또한 같아야 한다.
반면 Equals 반환값이 False라면, 객체는 같더라도 GetHashCode 의 반환값도 달라야 한다.
이 때문에 보통 Equlas 메서드를 하위 클래스에 [재정의]하면 GetHashCode까지 [재정의]한다.
이를 따르지 않으면 컴파일 경고가 발생한다.
using System;
namespace Project3
{
class Test
{
// 테스트용 클래스
}
class Class1
{
public static void Main(String[] args)
{
short n1 = 256;
short n2 = 32750;
short n3 = 256;
Console.WriteLine(n1.GetHashCode());
Console.WriteLine(n2.GetHashCode());
Console.WriteLine(n3.GetHashCode());
Test t1 = new Test();
Test t2 = new Test();
Console.WriteLine(t1.GetHashCode());
Console.WriteLine(t2.GetHashCode());
}
}
}
object 에서 정의된 GetHashCode는 [참조 타입]에 대해 기본 동작을 정의해 뒀는데, 생성된 참조 타입이 살아 있는 동안 닷넷 프레임워크 내부에서 그러한 인스턴스에 부여한 식별자 값을 반환하기 때문에 프로그램이 실행되는 도중 같은 타입의 다른 인스턴스와 GetHasgCode 의 리턴값이 겹칠 가능성은 많지 않다.
[값 타입]에 대해서는 GetHashCode의 기본 동작을 [재정의]해서 해당 인스턴스가 동일한 값을 가지고 있다면 같은 해시코드를 리턴한다.
GetHashCode는 int, 4바이트를 리턴한다.
값의 범위가
-2,146,483,648 ~ 2,146,483,647 로 제한된다.
short는 그냥 그 값 자체를 반환해도 다른 short 인스턴스와 겹치지(해시 충돌하지) 않을 수 있다.
하지만 int 는 GetHashCode와 범위가 정확히 일치하는데, 이를 통해 1:1 매핑을 할 수 있다.
닷넷 프레임워크 개발자들은 int에 대한 GetHashCode를 재정의하여 그 값을 그대로 반환하게 해두었다.
using System;
namespace Project3
{
class Class1
{
public static void Main(String[] args)
{
int n1 = 256;
int n3 = 256;
Console.WriteLine(n1.GetHashCode());
Console.WriteLine(n3.GetHashCode());
}
}
}
출력 결과:
256
256
long의 경우 int보다 범위가 넓기에 어떤 경우에는 동일한 해시 코드가 반환될 수 있다.
서로 구분되는 값인데 동일한 해시 코드를 생성하는 것을 [해시 충돌] 이라고 한다.
이러한 이유 때문에 Eqhals 와 GetHashCode를 같이 사용하는 것이다.
해당 객체를 고유하게 식별할 수 있는 값이 같을 수 있기 때문이다.
식별할 수 있는 값이 2개 이상 나올 수 있는 여지가 있다면, Equals를 호출해서 다시한번 객체가 동일한지 판단하는 것이다.
기억할 것은 GetHashCode의 경우 동일한 값이 리턴되어 해시 충돌이 발생할 여지가 있다는 것이다.
'C# > 책 정리' 카테고리의 다른 글
C# 정리 ) this (0) | 2021.11.30 |
---|---|
C# 정리 ) System.Array (0) | 2021.11.29 |
C# 정리 ) Equals (0) | 2021.11.28 |
C# 정리 ) GetType (0) | 2021.11.28 |
C# 정리 ) ToString (0) | 2021.11.28 |
댓글