equals()
객체의 내용이 같은지 비교한다
public boolean equals(Object obj) {
return (this == obj);
}
hashCode()
객체가 같은 객체인지 확인한다. 반환값으로 일반적으로 Heap에 저장된 객체의 메모리 주소를 반환한다.
public native int hashCode();
//native 키워드는 Java 외의 언어에서 개발된 언어를 Java에서 사용할 경우 사용하는 키워드이다.
equals() 와 hashCode()
동일한 객체는 동일한 메모리 주소를 가져야 하므로,
동일한 객체는 동일한 해시코드를 가져야된다.
public class Main {
public static void main(String[] args) throws IOException {
Set<Person> people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 2
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
}
위에서 HashSet 자료 구조에 동등한 객체 2개를 삽입해 보자. set의 사이즈는 2가 나온다.
해시를 사용하는 자료구조는 Key를 결정할 때 hashCode() 를 사용한다. 객체가 동일한지 판단하기 위해 두 객체의 해시코드가 같은지 먼저 비교후 두 객체가 동등한지 판단한다.
그런데 hashCode() 가 override 되어 있지 않으면 각 객체가 저장된 메모리 주소가 반환된다.
따라서 해시 자료 구조에서는 equals() 와 hashCode() 모두 override 하는 것이 좋다.
package kdt.assignment.shoppingcart_09.domain;
import lombok.Getter;
import java.util.Objects;
@Getter
public class Product {
private int key;
private String name;
private int price;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Product product = (Product) o;
return key == product.key && price == product.price && Objects.equals(name, product.name);
}
@Override
public int hashCode() {
return Objects.hash(key, name, price);
}
}
'구름톤 딥다이브 풀스택 11회차' 카테고리의 다른 글
[spring/오류해결] 스프링부트 jsp 404 파일 못찾음 이슈 (0) | 2024.09.15 |
---|---|
[구름톤 딥다이브 1차 스터디 -2회] 알고리즘 풀이 + 자바 기본 cs 워밍업 면접 (4) | 2024.09.14 |
[구름톤 딥다이브 1차 스터디 -1회] 알고리즘 풀이 + 자바 기본 cs 워밍업 면접 (0) | 2024.09.06 |