==, equals, hashCode

minisoo·2023년 11월 26일
0

==

  • 원시 타입일 경우 두 값이 같은지 확인하고, 참조 타입일 경우 두 객체의 주소를 비교하여 동일한지 판단한다

equals

  • default는 == 와 마찬가지로 두 객체가 같은 주소를 가르키는 동일한 객체일 경우 true를 반환 한다
  • Object클래스의 equals() 메서드가 == 연산을 통해 두 객체를 확인하기 때문이다
  • equals()는 해당 메서드를 오버라이딩을 통해 자신이 원하는 형태로 재정의 할 수 있다
  • 대표적으로 String 클래스도 객체 타입이기 때문에 주소값으로 비교하는게 기본이지만, String 클래스의 equals()가 문자열 값을 비교하도록 오버라이딩 되었기 때문에 주소값이 아닌 문자열 값을 비교하게 된다

hashCode

  • 객체의 주소 값을 이용해서 해싱기법을 통해 해시 코드를 반환하는 메서드로 해시코드는 주소값으로 만든 고유한 숫자값이다
  • 서로 다른 두 객체는 같은 해시 코드를 가질 수 없게 된다

equals와 hashCode를 왜 같이 재정의 해야되는가?

  • 두 메서드를 같이 재정의 하지 않으면, hash값을 사용하는 collection(HashSet, HashMap 등)을 사용할 때 문제가 발생하게 된다
  • hash를 사용하는 collection은 객체가 같은지 1차적으로 hashcode()의 리턴 값이 같은지 확인하고 2차로 equals()의 리턴 값을 확인하게 되는데 만약 hashcode를 재정의 하지 않게되면 collection이 오작동 할 수 있게된다
  • hashcode() 재정의 할때는 객체 내 특정 필드의 값을 사용해 해시코드를 반환하도록 재정의 하면 된다 (동일한 값을 가지는 필드의 해시코드는 동일하다)
profile
코딩하는 돌멩이 👻

0개의 댓글