자바 - equals & hashcode

namkun·2022년 9월 24일
0

JAVA

목록 보기
6/20

equals & hashcode?

  • equals 와 hashcode는 모든 java 객체의 부모 객체인 Object 클래스에 정의된 함수다.
  • 그렇기에 Java의 모든 객체는 Object 클래스에 정의된 equals와 hashcode 함수를 상속받는다.

equals?

boolean equals(Objects obj) 로 정의되는 equals 는 객체간의 같음을 확인하기 위해 사용된다.

두 객체를 비교하고, 논리적으로 동등한 객체라면 true를 return 한다.
논리적으로 동등하다는 것은 둘의 참조값이 다르더라도 객체 내부의 value는 같다는 것을 의미한다.

아래는 Object의 기본 equals 메서드이다.

public boolean equals(Object obj) {
    return (this == obj);
}
  • 동일성 비교 : == 비교. 객체 인스턴스의 주소 값을 비교
  • 동등성 비교 : equals() 메서드를 사용한 비교. 객체 내부의 값을 비교

비교해야하는 대상이 class 자료형의 객체라면, 비교할 객체의 주소를 비교한다.
즉, 객체 자체의 비교시에는 ==equals 나 같다.

equals overriding

  • 컴퓨터 입장에서는 2개의 내용이 같은 객체일지라도 각각 초기화해서 다른 heap 영역에 저장한 것이기에 다른 객체로 본다.
  • 만일 객체 자료형을 비교할 때, 주소값이 아닌 객체의 필드 값을 기준으로 하는 동등 비교를 원하면 equals를 overriding 해서 구현해줘야한다.
  • 대표적으로 String의 equals 메서드가 있다. (주소값의 비교가 아닌 문자열 값의 비교)

hashcode?

  • 객체의 주소값을 Hashing 기법을 이용해서 HashCode로 만들어 반환하는 메서드이다.
  • 주소값으로 만든 고유한 숫자값 이기에, 이는 객체의 지문이라고도 한다.
  • Objects의 hashCode() 메서드는 객체의 메모리 주소를 이용해서 해시코드를 만들어 return하기에 객체마다 다른 값을 return 하게 된다.
  • Object에 정의된 hashCode 메서드를 보면, 'native' 라는 키워드가 보일 것인데, 이는 OS가 가진 메서드를 의미한다.
  • JNI (Java Native Interface) 는 c 또는 저 수준의 언어로 작성된 native 코드를 JVM 에 적재해서 실행시켜 주는데, hashCode가 이 native에 속한 코드이다.
  • 이러한 native 메서드들은 그 안의 내용을 확인할 수 없고, 사용만 가능하다.

hashcode Overriding

객체의 값을 동등성 비교하고 싶을때 hashCode 메서드와 equals 메서드 둘 다 override 해야할 필요가 있는데, 컬렉션 프레임 워크에서 HashSet, HashMap, HashTable과 같은 컬렉션들은 두 객체간의 비교를 할 때 다음과 같이 진행하기 때문이다.

  1. HashCode 메서드의 리턴값을 비교한다.
  2. 같다면, equals의 리턴값을 비교한다.
  3. 1, 2를 모두 통과했다면 두 객체는 같은 객체라고 봐도 된다.

위에서 이야기했듯, HashMap, HashTable에서도 같은 방법을 사용하는데,

예를 들어 HashMap에서 put할 때, key값이 기존에 있는건지 확인하는데 이때 hashcode를 먼저 비교하고, 둘이 같으면 그 다음에 equals를 이용해서 검사한다.

profile
개발하는 중국학과 사람

0개의 댓글