티스토리 뷰
반응형
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() 메소드가 있다.
- 이 메소드는 파라미터로 전달 받은 값들을 이용해서 해시 코드를 생성해주는데, 과정은 다음과 같다.
- 주어진 파라미터값들로 배열을 생성한다.
- 그런 다음 Arrays.hashCode(Object[])를 호출해서 해시코드를 얻는다.
- 마지막으로 이 해시코드를 반환해준다.
- 하나의 클래스에 여러 클래스 변수들이 있을 경우, 이 변수들로 해시코드를 생성하면 동일한 변수 값을 가지는 객체는 동일한 해시코드를 가질 수 있다.
Reference
- https://nesoy.github.io/articles/2018-06/Java-equals-hashcode
- https://minwan1.github.io/2018/07/03/2018-07-03-equals,hashcode/
- https://www.baeldung.com/java-hashcode
반응형
'Programming Language > JAVA' 카테고리의 다른 글
문자열 (String) 형변환 : Casting, valueOf, toString (1) | 2019.09.08 |
---|---|
StringTokenizer (0) | 2019.09.06 |
String, StringBuilder, StringBuffer (0) | 2019.09.02 |
HashTable, HashMap, ConcurrentHashMap (0) | 2019.09.01 |
댓글