Published 2021. 10. 5. 22:19
반응형

hashCode()

  1. 객체의 해시코드를 반환하는 메서드
  2. Object 클래스의 hashCode()는 객체의 주소를 이용해 int로 변환해서 반환
  3. 두 객체가 같은 객체인지 확인하기 위해 사용.

Object 클래스에서 어떻게 구현 되어 있을까?

  • native 메서드는 OS의 메서드이고, C언어로 작성되어 있음.
    body가 없는데 이는 이미 OS에서 작성된 기능이기 때문에 직접 만질 일이 없기 때문 입니다.
    그래서 변경하기 위해 @Override를 해야 합니다.

hashCode() 메서드 overriding 규칙

  • equals()를 overried하면, hashCode()도 overriding 해야 합니다.
    왜냐하면, equals()의 결과가 true인 두 객체의 hashCode는 같아야 하기 때문 입니다..*
    원래 hashCode는 주소를 이용하여 int로 반환하는 것이기 때문에 객체마다 다릅니다.
    하지만, 우리가 euqals()로 값을 비교할 때는 주소가 아닌 **인스턴스 변수
    를 비교하는 것이기 때문에
    반드시 hashCode()도 인스턴스 변수를 기준으로 반환하도록 overriding해야 합니다.

  • 인스턴스 변수로 비교를 할까?
    객체는 인스턴스 변수의 집합이기 때문입니다. 메서드 내에서 사용되는 로컬 변수는 객체를 조작하기 위한 요소일 뿐
    본체는 인스턴스 변수가 됩니다. 결국 객체의 상태가 객체를 결정짓게 되는 것입니다.

  • 본래의 주소 값을 이용한 hashCode를 얻고 싶다면
    아래와 같은 메서드를 사용하면 됩니다.

equals()는 무엇일까?

객체를 비교할 때 사용하는 메서드 입니다.
String 클래스에는 이미 overriding 되어 있어서, 우리는 편하게 사용할 수 있습니다.
하지만 Custom 클래스에 Overriding을 하지 않고 사용하면, 주소를 비교하게 되기 때문에 대부분의 상황에는 Overriding이 필요합니다.

Object 클래스에서 equals()는 어떻게 구현 되어 있을까?

아래와 같기 때문에 주소를 비교하게 되므로, 대부분의 상황에는 overriding이 필요한 것 입니다.

근데 왜 equals()를 overriding할 때 hashCode()도 바드시 overriding을 해야 할까?

Hash를 기반으로 하는 HashTable, HashMap, HashSet과 같은 클래스들 때문에 그렇습니다.
위에서 본래 Object의 hashCode()는 주소를 가공하여 int로 반환한다고 하였습니다.
그리고 인스턴스 변수가 같고, 클래스 정보가 같으면 같은 hashCode를 반환 하도록 해야 합니다.
위의 클래스들은 Hash 기반으로 검색을 하기 때문입니다. 코드로 알아 보겠습니다.

6번 라인은 같은 주소로 조회를 한 결과, 7번 라인은 새로운 객체를 생성한 결과 입니다.
분명 인스턴스 변수는 같기 때문에 유저정보1을 조회해야 하는데 null이 나옵니다.
그런데 equals()만 overriding 되어 있으면, equals()로 비교 시에는 같다고 나올텐데 저렇게 조회할 때는 값을 가져오지 못하는 상황이 발생 합니다.
이런 버그는 찾기도 정말 어렵습니다. 예외, 에러 그 무엇도 발생하지 않기 때문 입니다.

toString()

객체를 문자열(String)으로 변환하기 위한 메서드

Object 클래스에서 어떻게 구현 되어 있을까?

  • Object에 구현되어 있는 sString은 아래와 같은 형태로 반환 합니다.
    1. getClass : 객체
    2. getName : 클래스 명
    3. @ : 위치
    4. Integer.toHexString() : 16진수
    5. hashCode() : 객체 주소

toString 메서드 overriding 규칙

  • 그런데 Object에 구현된건 유용하지 않으므로 보통 overriding을 하는데 아래와 같이 한다.
    객체는 인스턴스 변수의 집합이기 때문에 인스턴스 변수를 overriding 합니다.
반응형
복사했습니다!