-
[Kotlin In Action] 객체의 동등성: equals()와 해시 컨테이너: hashCode() 그리고 data class언어/Kotlin 2022. 4. 26. 21:46반응형
equals()를 오버라이드할 때 반드시 hashCode()도 함께 오버라이드해야 한다. equals()만 오버라이드한 Client 클래스를 보자.
val processed = hashSetOf(Client("오현석", 4122)) println(processed.contains(Client("오현석", 4122)))
위 코드에서 프로퍼티가 모두 일치하므로 새 인스턴스와 집합에 있는 기존 인스턴스는 동등하다. 따라서 새 인스턴스가 집합에 속했는지 확인하면 true가 반환될것 같다. 그러나 false를 반환한다.
문제 두 가지
- JVM 언어에서는 hashCode가 지켜야 하는 "equals()가 true를 반환하는 두 객체는 반드시 같은 hashCode()를 반환해야 한다."는 제약이 있다.
- HashSet은 원소를 비교할 때 비용을 줄이기 위해 먼저 객체의 해시 코드를 비교하고 해시 코드가 같은 경우에만 실제 값을 비교한다.
이 문제를 해결하기 위해 hashCode()를 추가하는 방법과 data class로 만드는 방법이 있다.
class Client(val name: String, val postalCode: Int) { ... override fun hashCode(): Int = name.hashCode() * 31 + postalCode } or data class Client(val name: String, val postalCode: Int) { ... }
kotlin에서 data class는 toString(), equals(), hashCode(), copy()를 자동생성 해준다. 모든 class의 객체는 디폴트로 유일한 객체 이지만, data class의 객체는 데이터가 같으면 같은 객체로 취급한다.
반응형'언어 > Kotlin' 카테고리의 다른 글
[Kotlin in Action, Effective Kotlin] 제네릭과 변성 variance (0) 2022.05.29 [Kotlin] - List의 합집합, 차집합, 교집합 (0) 2022.05.08 [Kotlin In Action] 로컬 함수와 확장 (0) 2022.04.25 [Kotlin In Action] 선택 표현과 처리 when (0) 2022.04.23 영역함수 (apply, also, let) (0) 2022.03.19