Posts equals(), hashCode()
Post
Cancel

equals(), hashCode()

equals()와 hashCode() 메서드는 모든 자바 객체의 부모인 Object 클래스에 정의되어있다. 따라서 모든 자바 객체는 equals()와 hashCode() 메서드를 가지고 있다.

equals()

현재 객체와 파라미터로 들어온 객체가 같은 지 검사하기 위해 사용한다. 기본적으로는 두 객체의 메모리 주소가 같아야 동일한 객체가 된다.

1
2
3
public boolean equals(Objecet obj) {
  return (this == obj);
}

이러한 equals 객체를 오버라이드하여 필드값이 같은 객체를 같은 객체라고 판단하게 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@AllArgsConstructor
@Getter
public class User {
  private String name;
  
  @Override
  public boolean equals(Object obj) {
    if(obj instanceof User) {
      return this.getName().equals(obj.getName()); 
    } else {
      return false;
    }
  }
}

hashCode()

런타임 중에 객체의 유일한 integer 값을 반환한다. Object 클래스에서는 heap에 저장된 객체의 메모리 주소를 반환하도록 되어있다.

1
public native int hashCode();

native 키워드

  • 메소드가 JNI(Java Native Interface)라는 native code를 이용해 구현되었음을 의미
  • native는 메소드에만 적용가능한 제어자로, C or C++ 등 Java가 아닌 언어로 구현된 부분을 JNI를 통해 Java에서 이용하고자 할 때 사용
  • 일반 개발자는 사용할 수 없다.
  • hashCode에서는 HashTable과 같은 자료구조를 사용할 때 데이터가 저장되는 위치를 결정하기 위해 사용한다.


equals() 와 hashCode()의 관계

동일한 객체는 동일한 메모리 주소를 갖는다는 것을 의미하므로, 동일한 객체는 동일한 해시태그를 가져야한다. 그렇기 때문에 만약 우리가 equals() 메서드를 오버라이드한다면, hashCode() 메서드도 오버라이드 되어야한다. equals()와 hashCode()는 아래와 같은 관계를 만족해야한다.

  • Java 프로그램을 실행하는 동안 equals()에 사용된 정보가 수정되지 않았다면, hashCode()는 항상 동일한 정수값을 반환해야한다.
  • 두 객체가 equals()에 의해 동일하다면, 두 객체의 hashCode() 값도 일치해야한다.
  • 두 객체가 equals()에 의해 동일하지 않다면, 두 객체의 hashCode() 값도 일치하지 않아도 된다.


출처

https://mangkyu.tistory.com/101

https://kwonnam.pe.kr/wiki/java/equals_hashcode

This post is licensed under CC BY 4.0 by the author.

Content-Disposition

junit - spy

Comments powered by Disqus.