본문 바로가기
JAVA

==연산자와 .equals() 그리고 hashCode

by 고유빙글 2022. 1. 27.

우선 먼저

==

     : 내가 선택한 두 객체가 같은지 비교할때 사용하는 방법들이다.

     : 값 타입들을 비교할때 사용한다면, 숫자값은 int, long, double등과 관계없이 ( 1과 1.0 이라 하더라도 ) 
     우리가 인지하는 것과 같이 같은지 알 수 있다.
     하지만 String의 경우로 보면 인지하는 것과 같이 다름을 알 수 있다.
     이는, == 연산자는 주소값을 비교하는 연산자이기 때문이다.
     String 타입의 경우 주소가 아닌 값을 비교하기 위해서는 .equals() 메소드를 활용해야 한다.

     : == 연산자에 추가적으로 확인해 볼 점은
     static을 붙여 메모리에 클래스와 같은 시점에 올라가는 경우 참조하는 주소값이 다르기 때문에 
     값이 같더라도 == 연산자에 대해 false가 출력된다는 이야기가 있었으나 실험시 true로 나왔다.
     이는 추후 좀 더 확인 해 보아야겠다.

 

hashCode
     : 해쉬코드는 결과적으로는 해쉬 알고리즘 ( 해쉬 함수 )를 통과한 정수 결과값을 말한다.
     : 어떤 명확한 정의가 어딘가에 있겠지만 아직 내 이해 수준으로는 명확한 정의는 어렵다.
     : 먼저 언급한 해쉬 알고리즘을 통과한 결과값임을 보이면 이렇다.

   



     이렇듯 정수 결과값을 반환하게 되는데, 어떻게 사용되고 왜 사용되는가 이전에
     해쉬코드의 특징 몇가지를 살펴보자.

     1. 같은 객체는 동일한 해쉬 알고리즘을 통해 일관된 결과 값을 도출해야 한다.
     2. 어떤 객체가 서로 같지 않더라도 같은 해쉬 코드를 가질 수 있다.

     이러한 코드가 input이 같은데 output이 다르다면 사용하기가 굉장히 까다로울 것이다.
     ( 그러한 결과에 규칙성 마저 없다면 활용하기란 더 어려울 것이다. )
     그리고 우리가 해쉬 코드를 사용하는데에 있어서는 그러한 변화는 연산의 낭비를 유발할 것이므로
     같은 값을 넣으면 같은 결과물을 반환해야 한다.

     input이 다르더라도 output이 같을 수 있다. 물론 우리가 활용하는 목적에 있어서
     다른 값은 다른 해쉬 코드를 가지는 것이 유리한 경우도 있겠지만,
     예를 들어 A, B, ㄱ, ㄴ, ㄷ의 5개 객체가 있고 우리는 이를 한글 자음 바구니와 알파벳 바구니에 
     나누어 넣으려고 한다면 간단한 연산을 통해

     한글인지 알파벳인지 분류만 하면 되고 A, B의 구분은 전혀 필요하지 않다.

     이런 시점에서 2의 특성을 이해해보면 좋을 것 같다.

     하지만 포스트의 맥락에서 유추할 수 있듯이 우리는 두 객체가 같은지를 알아보기 위해 해쉬코드를 사용할때에는
     .equals() 메소드를 오버라이딩해 사용할 것이다.
     이 때에는 성능면에서 다른 객체는 다른 해쉬 코드를 가질 수 있는 알고리즘을 짜야 좋을 것이다.

 

     한번 이를 이용해보자.

 

     이처럼 아무것도 하지 않은 경우에는 주소값을 비교한 통상의 결과물을 확인 할 수 있다.

     이제 .equals() 메소드를 오버라이딩해서 보자.

     ( 직접 지금 상황에 맞춰서만 오버라이딩 한 것으로 코드가 좀 많이 다를 수 있다. )

 

 

 

     이제 equals를 통해 객체간의 비교도 할 수 있게 되었다.

 

     하지만 hashCode()는 다르다. 두 객체는 equals 메소드에 따라 같다고 하지만, hashCode()가 다른 상황이다.

     왜 이러면 안되는지에 대해서는 다른 포스트에서 다루기로 하고,

     equals를 오버라이딩한다면 hashCode() 역시도 오버라이딩 해야함까지만 알아두자.

     ( 같이 다루기에는 포스트의 전달력을 흐릴까 걱정이 된다. )

 

 

     필자는 단순한 방법으로 Man객체의 num을 hashCode()메소드 반환값으로 지정했다.

     ( 테스트용 설계이기도 하거니와, 사람의 번호를 메겼다면 그 번호가 고유값으로 적절하지 않을까 하는 생각인데

     허술함과 적당함이 느껴져 부끄러워 첨언하는 모습이다. )

 

     본 포스트에서 hashCode를 굉장히 부수적으로 오히려 이유도 모른체 맞춰줘야하는 요소로만 다뤘는데

     hashTable이나 실제 데이터를 다루는 알고리즘에서는 hashCode를 이용해 두 객체가 같은지 비교하는데에

     사용되기도 한다.

     본인도 공부하면서 작성하다보니 가볍게 다루는 내용을 참고해 방향이 이렇게 되었는데

     어느 편이 이해에 더 좋은 접근인지는 모르겠다.