hashCode()와 equals()

송성빈·2024년 6월 26일
post-thumbnail

개요

Hash 에 대해서 알아보고 자바에서 hashCode()equals() 메서드를 재정의해야 되는 이유에 대해서 알아보자.


Hash

  • Hash 란 데이터의 내용을 고정된 길이의 고유한 값으로 변환하는 함수나 알고리즘을 의미한다.

Hash Function

  • Hash Function 은 입력받은 데이터를 고정된 길이의 Hash Code 로 출력하는 함수이다.
  • 여기서 의미하는 고정된 길이는 저장된 공간의 크기를 뜻한다.
  • 같은 데이터를 입력하면 항상 같은 Hash Code 가 출력된다.
  • 다른 데이터를 입력해도 같은 Hash Code 가 출력될 수 있는데, 이걸 해시 충돌(Hash Collision) 이라고 한다.

Hash Code

  • Hash Code 는 데이터를 대표하는 값을 뜻한다.

Hash Index

  • Hash Index 는 데이터의 저장 위치를 결정한다.
  • Hash Code 의 결과에 배열의 크기를 나누어 구한다.

자바의 Hash Code

  • Object 의 메서드

    • 자바는 모든 객체가 자신만의 Hash Code 를 표현할 수 있는 기능을 Object 에 있는 hashCode() 메서드로 제공한다.
      기본 구현은 객체의 참조값을 기반으로 Hash Code 를 생성하기 때문에 객체의 인스턴스가 다르면 Hash Code 도 다르며 각각의 인스턴스 마다 다른 Hash Code 를 반환한다.
  • 기본 클래스

    • IntegerString 같은 자바의 기본 클래스들은 대부분 내부 값을 기반으로 Hash Code 를 구할 수 있도록 hashCode() 메서드를 재정의 해두었다.
    • 데이터의 값이 같으면 같은 Hash Code 를 반환한다.
    • 정수를 반환하기 때문에 마이너스 값이 나올 수 있다.

hashCode() 와 equals() 메서드를 재정의 해야 되는 이유

  • 동일성(Identity)과 동등성(Equals)

    자바에서는 두 객체가 같다는 표현을 2가지로 분리해서 사용한다.

    • 동일성(Identity): == 연산자를 사용하여 물리적으로 두 객체가 같은 메모리에 있는 객체인지 참조 값을 확인

    • 동등성(Equals): equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인

      User user1 = new User("A");
      User user2 = new User("A");
      
      System.out.println(user1 == user2) // false
      System.out.println(user1.equals(user2)) // true

hashCode() 메서드를 재정의하지 않으면, 동일한 데이터를 가진 객체라도 다른 해시 코드가 반환될 수 있어서 데이터 구조에서 중복 문제가 발생할 수 있다.

따라서 같은 데이터에 대해 동일한 해시 코드를 반환하도록 hashCode() 메서드를 재정의해야 한다.
그러나 해시 충돌로 인해 서로 다른 데이터가 같은 해시 버킷에 들어갈 수 있기 때문에 이를 정확히 비교하기 위해 equals() 메서드도 재정의하여 사용해야 한다.

0개의 댓글