Object는 모든 클래스의 상위 클래스이다. Object 가 제공하는 메서드 중에는 hashcode와 equals도 있는데, 이 둘의 관계는 함께 움직여다니는 관계이다. 객체 비교를 하는데 있어 정의를 하는데 쓰인다.
즉, hashcode가 같으면 equals 메소드의 값도 ture 가 나와야한다는 것이다. String에서는 equals와 hashcode가 재정의 되어있는 것으로 기억하고 있다. 그래서 Map 의 Key값으로 String 을 자주 쓰는 것으로도 알고 있고..
하지만 Obejct의 각각의 두 메서드는 필요에 따라 올바른 재정의가 반드시 필요하다. 이클립스의 소스 탭에 필드를 이용해서 hashcode와 equals를 재정의하는 기능을 제공하는데, 이기능을 이용하면 Field 값으로 두 메서드를 재정의하여 원하는 동일 객체 결과를 받을 수 있다.
반드시, 두 메서드가 같이 재정의 되어야한다.
class Book{
int isbn;
//이클립스에서는 hashcode와 equals 메소드를 필드에 맞게 재정의하는 기능이있다.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + isbn;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (isbn != other.isbn)
return false;
return true;
}
}
public class EqualsEx1 {//모든 클래스는 Object 클래스의 자식이므로 전부 Obejct 의 메서드를 쓸 수 있다.
public static void main(String[] args) {
Book book1 = new Book();
Book book2 = new Book();
Book book3 = book1;//같은 인스턴스를 갖는다.
//객체가 같다..?
System.out.println(book1 == book3);
book1.isbn = 100;
book2.isbn = 100;
System.out.println("------------------------------------------");
//객체 간의 equals 메서드는 주소 값을 비교한다. 기본 값은 false이다.
System.out.println(book1.equals(book2));
System.out.println("------------------------------------------");
//Object 타입으로 집어넣어도 부모타입에 자식객체의 주소 값이 들어가므로
Object o1 = book1;
System.out.println(book1.equals(book2));
System.out.println(o1.equals(book2));//재정의 된 equals가 실행된다. 다형성의 구현이다.
}
}
다른 메인메서드
public class HashCodeEx1 {
public static void main(String[] args) {
Book b1 = new Book();
Book b2 = new Book();
//equals의 재정의로 isbn 값이 같으면 같은 객체로 판단하게끔 만들어 놓았다.
b1.isbn = 100;
b2.isbn = 100;
System.out.println(b1.hashCode()); //328638398
System.out.println(b2.hashCode()); //1789550256
System.out.println("=======================================");
//반드시 한 객체의 hashcode값과 equals 메소드는 같아야한다.
System.out.println(b1.hashCode()); //131
System.out.println(b2.hashCode());//131
}
}
'JAVA-Basic' 카테고리의 다른 글
Interface 에 정의된 메소드에서 던질 수 있는 Exception간 관계 (0) | 2020.07.28 |
---|---|
10.Thread와 동기화(synchronized) (0) | 2020.07.10 |
8.Exception 예외와 처리 (0) | 2020.07.10 |
7.람다(Lamda)를 이용한 익명 구현 객체(Anonymous implementation Object) 사용 (0) | 2020.07.10 |
7.익명클래스(AnonymousClass) (0) | 2020.07.10 |