JAVA-Basic

9.hashcode & equals

Jungsoomin :) 2020. 7. 10. 15:46

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
	}
}