프로그래밍/java

[자바/Java] hashCode() , equals()

pupu91 2022. 8. 29. 20:20
반응형

 

1 .  equals() 

: 자신과(this) 매개변수로 전달 받은 객체(obj)를 동일한지 비교

  true or false 를 반환

 

 

 

동일 객체와 동등 객체

동일 객체 : 주소가 동일한 인스턴스

동등 객체 : 주소는 다르더라도 필드 값이 동일한 객체

= > equals() 기본 기능은 동일 객체를 판단함. 동등 객체를 판단해야 하는 경우 equals()를 오버라이딩하여 확인!

 

 

 

equals() 동일 객체 예시

Book book1 = new Book(1, "홍길동전", "허균", 50000);
Book book2 = new Book(1, "홍길동전", "허균", 50000);

System.out.println("두 인스턴스의 == 연산 비교 : " + (book1 == book2));
System.out.println("두 인스턴스의 equals() 비교 : " + (book1.equals(book2)));

출력 결과
두 인스턴스의 == 연산 비교 : false
두 인스턴스의 equals() 비교 : false
=> 값은 같아도 별도의 인스턴스여서 주소값은 다르게 나오기 때문에 false

 

 

equals() 오버라이딩 

우클릭 -> soure -> Generate hashCode() and equals() 클릭(자동완성)
@Override
	public boolean equals(Object obj) {
		동등객체 판단을 위한 메소드
        두 인스턴스의 주소가 같은거나, 
        전달 받은 객체의 값이 null이거나, 
        this와 obj의 클래스가 같지 않으면 
        서로 다른 필드 값을 가지고 있기 때문에 비교할 필요가 없음
        
		if (this == obj)
			return true;
		
		if (obj == null) 
			return false;
		
		if (getClass() != obj.getClass())
			return false;
		
		전달 받은 레퍼런스 변수를 Book 타입으로 형변환하여 각 필드별로 비교 하기
       기본 자료형인 int는 바로 값 비교 가능/ String은 Objects.equals로 비교해야 함
		Book other = (Book) obj;
		return Objects.equals(author, other.author) && number == other.number && price == other.price
				&& Objects.equals(title, other.title);
		
	}

 

 

 

 

오버라이딩 후 출력 결과 

Book book1 = new Book(1, "홍길동전", "허균", 50000);
Book book2 = new Book(1, "홍길동전", "허균", 50000);

System.out.println("두 인스턴스의 == 연산 비교 : " + (book1 == book2));
System.out.println("두 인스턴스의 equals() 비교 : " + (book1.equals(book2)));

출력 결과
두 인스턴스의 == 연산 비교 : false
두 인스턴스의 equals() 비교 : true

 

 


 

2 . hachCode()

: 객체의 해시코드를 반환하는 메서드

  Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환

  객체마다 다른 값을 반환하기 때문에 객체의 지문이라고도 함

 

 

hashCode()와 equals() 

: equals() 메소드를 재정의 하는 경우 반드시 hashCode() 메소드도 재정의(오버라이딩) 해야 함.

  equals() 결과가 true인 두 객체의 해시코드는 같아야 하기 때문(중요!!)

 

 

 

재정의 전 hashCode() 예시

Book book1 = new Book(1, "홍길동전", "허균", 50000);
Book book2 = new Book(1, "홍길동전", "허균", 50000);

System.out.println("book1의 hashCode : " + book1.hashCode());
System.out.println("book2의 hashCode : " + book2.hashCode());

출력 결과
book1의 hashCode : 81009902
book2의 hashCode : 57748372

 

 

 

 

hashCode() 오버라이딩

 

@Override
 public int hashCode() {
	return Objects.hash(author, number, price, title);
 }

 

 

 

오버라이딩 후 출력 결과

Book book1 = new Book(1, "홍길동전", "허균", 50000);
Book book2 = new Book(1, "홍길동전", "허균", 50000);

System.out.println("book1의 hashCode : " + book1.hashCode());
System.out.println("book2의 hashCode : " + book2.hashCode());

출력 결과
book1의 hashCode : 2010083375
book2의 hashCode : 2010083375

 

반응형