equals() :
hashCode() :
equals():
equals()를 오버라이드할 때 중요한 점
import java.util.Objects;
public class Member {
private final String name;
private final int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Member)) return false;
Member member = (Member) o;
return age == member.age &&
Objects.equals(name, member.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
단점
class Member {
String name;
}
Set<Member> set = new HashSet<>();
Member m = new Member("kim");
set.add(m);
m.name = "lee";
set.contains(m); // 이상 동작 가능
equals보다는 == , === 를 사용한 equality 를 위한 연산자 문법 사용이 권장된다.
== : equals() 기반 비교, 내부적으로 equals 사용
- Kotlin의 모든 클래스는 기본적으로 Any를 상속하는데, 자바 Object처럼..
- Any에는 이미 equals 함수가 있는데, 같은 인스턴스면 true, 다르면 false
```kotlin
// 기본 equals 함수
open operator fun equals(other: Any?): Boolean
// 오버라이드 equals 함수
override fun equals(other: Any?): Boolean
```
=== : 참조 동일성 비교, 같은 인스턴스인지 비교
Any.equals(): 참조 동일성 성격
data class는 equals()와 hashCode() 자동 생성
- 같은 타입이라면 true
data class의 경우
data class Member(
val name: String,
val age: Int
)
val m1 = Member("kim", 20)
val m2 = Member("kim", 20)
println(m1 == m2) // true
println(m1 === m2) // false
class Money(val amount: Int) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Money) return false
return this.amount == other.amount
}
override fun hashCode(): Int {
return amount
}
}
equals()보다는 contentEquals()로 비교