코틀린에서 데이터 클래스를 사용하면 일반 클래스와 비교하여 더 간결한 코드로 인스턴스의 동등성을 비교하고 해시 코드를 생성할 수 있습니다. 하지만 때로는 기본 생성된 equals()와 hashCode()가 우리가 원하는 방식으로 동작하지 않을 수 있습니다. 이때는 어떻게 해야 할까요?
equals() 오버라이딩
코틀린 데이터 클래스를 사용할 때 equals() 메서드를 오버라이딩하고자 한다면, 다음 규칙을 따라야 합니다.
-
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 }
-
객체 동일성 비교:
this === other
를 사용하여 두 객체의 참조가 동일한지를 먼저 확인합니다. -
타입 체크:
javaClass != other?.javaClass
를 사용하여 두 객체의 타입이 동일한지를 확인합니다. -
타입 변환:
other as MyDataClass
를 사용하여 다른 클래스를 현재 클래스로 변환합니다. -
필드 값 비교: 이후 필드 값들을 비교하고 모든 필드가 동일한 경우에만 true를 반환합니다.
hashCode() 오버라이딩
hashCode() 메서드를 오버라이딩할 때에도 몇가지 규칙이 있습니다.
-
hashCode() 메서드 오버라이딩:
override fun hashCode(): Int { }
override fun hashCode(): Int { var result = id.hashCode() result = 31 * result + name.hashCode() return result }
-
해시 코드 생성: 필드 값들을 이용하여 unique 한 해시 코드를 생성합니다.
-
해시 알고리즘: 보통 해시 함수를 위한 상수값인 31과 같은 값을 사용하여 해시 코드를 계산합니다.
이러한 오버라이딩을 통해 데이터 클래스의 equals()와 hashCode()를 우리가 원하는 방식으로 동작하도록 할 수 있습니다.
참고문헌: