[kotlin] 코틀린 데이터 클래스의 equals()와 hashCode() 오버라이딩

코틀린에서 데이터 클래스를 사용하면 일반 클래스와 비교하여 더 간결한 코드로 인스턴스의 동등성을 비교하고 해시 코드를 생성할 수 있습니다. 하지만 때로는 기본 생성된 equals()와 hashCode()가 우리가 원하는 방식으로 동작하지 않을 수 있습니다. 이때는 어떻게 해야 할까요?

equals() 오버라이딩

코틀린 데이터 클래스를 사용할 때 equals() 메서드를 오버라이딩하고자 한다면, 다음 규칙을 따라야 합니다.

  1. equals() 메서드 오버라이딩: override fun equals(other: Any?): Boolean { }

     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (javaClass != other?.javaClass) return false
         other as MyDataClass
         if (id != other.id) return false
         if (name != other.name) return false
         return true
     }
    
  2. 객체 동일성 비교: this === other를 사용하여 두 객체의 참조가 동일한지를 먼저 확인합니다.

  3. 타입 체크: javaClass != other?.javaClass를 사용하여 두 객체의 타입이 동일한지를 확인합니다.

  4. 타입 변환: other as MyDataClass를 사용하여 다른 클래스를 현재 클래스로 변환합니다.

  5. 필드 값 비교: 이후 필드 값들을 비교하고 모든 필드가 동일한 경우에만 true를 반환합니다.

hashCode() 오버라이딩

hashCode() 메서드를 오버라이딩할 때에도 몇가지 규칙이 있습니다.

  1. hashCode() 메서드 오버라이딩: override fun hashCode(): Int { }

     override fun hashCode(): Int {
         var result = id.hashCode()
         result = 31 * result + name.hashCode()
         return result
     }
    
  2. 해시 코드 생성: 필드 값들을 이용하여 unique 한 해시 코드를 생성합니다.

  3. 해시 알고리즘: 보통 해시 함수를 위한 상수값인 31과 같은 값을 사용하여 해시 코드를 계산합니다.

이러한 오버라이딩을 통해 데이터 클래스의 equals()와 hashCode()를 우리가 원하는 방식으로 동작하도록 할 수 있습니다.


참고문헌: