티스토리 뷰

Programming Language/JAVA

equals() & hashcode()

기내식은수박바 2019. 11. 29. 01:06
반응형

equals() ?

  • 두 객체내 데이터 (내용) 이 일치하는지 확인하는 메소드이다.

 

이 메소드가 왜 필요한지?

  • 두 개의 Person 객체가 있다고 해볼 때, 이 두 객체를 비교해보자.
  • 결과는 어떻게 나올까?

  • 위 객체 코드 비교에 대한 결과는 아래와 같다.

Why ?

  • person1과 person2는 동일한 객체가 아닌 각각 개별적인 객체이기 때문이다.
  • 동일한 객체라는 것은 메모리에 담긴 객체를 동일하게 참조한다는 것이며, 아래와 같다.

  • 따라서 결과 또한 바뀌게 된다.

그렇다면 의문이 생긴다.

equals는 내용을 비교한다고 했는데, 왜 맨 위의 예제에서 equals로 비교 한 것도 false가 나온 것인지?

  • 결론은 간단하다. Object의 equals 함수 코드 구현을 보면 다음과 같기 때문이다.
  • 코드를 보면 객체의 비교를 == 으로 비교하며, 동일한 객체인지를 확인 하는 것이다.

따라서, 객체의 내용이 같은지를 비교하기 위해서는 equals 메소드를 오버라이딩을 해줘야 한다.

  • == 으로 비교한 결과 값은 false, equals로 비교한 값은 true로 바뀌는 걸 볼 수 있다.
  • 오버라이딩이 가능한 메소드들은 개인이 원하는 방향으로 코드를 구현하면 된다.

 

hashcode() ?

  • 객체를 식별할 정수값을 말한다.
  • Object의 hashcode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 반환하기 때문에 각 객체마다 번지가 다르므로 서로 다른 값을 가지고 있다.

만약 equals를 통해 true로 나온 두 객체를 HashSet에 삽입할 때 동일한 원소로 인식하게 하고 싶은 경우

  • 이제 equals도 오버라이딩 했으니 동일하게 인식할 것 같았지만, HashSet에 삽입했더니 크기가 2가 나왔다.

 

Why ?

  • Hash : https://soobarkbar.tistory.com/50?category=824429
  • Hash Collection (Hash [Map, Table, Set, Linked-Set, etc)Key를 결정할 때 hashCode()를 사용하기 때문이다.
  • 이 Collection 들은 아래와 같은 과정을 거쳐 객체를 판별한다.

 

그렇다면 hashCode() 는 해시 값을 어떻게 결정하는가?

Object의 hashCode()

  • hashCode()로 native call을 하여 Memory에서 가진 해쉬 주소값을 출력한다.
  • 특별한 설정을 하지 않았을 경우, System.identityHashCode()와 동일한 값을 나타낸다.

 

따라서, 동일한 객체 원소로 인식되게 하기 위해서는 hashCode() 메소드를 오버라이딩 해줘야 한다.

  • 아래의 코드에서 Objects.hash() 메소드가 있다.
  • 이 메소드는 파라미터로 전달 받은 값들을 이용해서 해시 코드를 생성해주는데, 과정은 다음과 같다.
    1. 주어진 파라미터값들로 배열을 생성한다.
    2. 그런 다음 Arrays.hashCode(Object[])를 호출해서 해시코드를 얻는다.
    3. 마지막으로 이 해시코드를 반환해준다.
  • 하나의 클래스에 여러 클래스 변수들이 있을 경우, 이 변수들로 해시코드를 생성하면 동일한 변수 값을 가지는 객체는 동일한 해시코드를 가질 수 있다.

 

Reference

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함