Simple&Natural

자바에서 hashcode, identityHashcode, equals, == 연산자의 비교 본문

언어/Java&Kotlin

자바에서 hashcode, identityHashcode, equals, == 연산자의 비교

Essense 2020. 3. 16. 22:56
728x90

자바에서 가끔 객체의 동일성을 판단해야 하는 경우가 있다.

 

이때 무조건 hashcode나 identityHashcode를 쓰면 될 것 같지만 사실 이 둘은 완벽한 고유성을 보장해주지 않는다.

 

정확히 말하면 해시코드 값이 다르면 서로 다른 객체이지만

객체가 서로 다르다고 하여 반드시 다른 해시코드 값을 갖지는 않는다.

 

소스코드로 확인해보자.

hashcode 대신 System.identityHashcode 를 사용해도 동일한 결과가 나온다. 

출력값)

Exception!, treeSet's size = 99
Finished at count = 122354

 

중복을 허용하지 않는 Key 값의 집합인 TreeSet에 임의의 객체를 생성하여 해당 객체의 hashcode를 넣어주는 예제이다.

만약 중복이 발생한다면 생성된 object의 갯수(objSize)와 treeSet의 크기가 일치하지 않을 것이다.

 

위의 예제는 100개의 객체를 비교하는 연산을 100만번 시행하는 코드다.

100만개의 객체를 100번 비교해도 역시 예외가 발생한다. 

 

객체의 갯수나 반복횟수를 줄여보면 이러한 예외가 발생하지 않지만

객체의 사이즈나 시행횟수가 일정 이상 늘어나면 다시 예외가 발생한다.

 

즉, 다른 객체라고 하여 반드시 다른 해시코드 값을 갖지 않는다 (= 해시코드가 같아도 객체가 다를 수 있다)

 

 

 

코틀린에서 객체 동일성을 판단하는 경우

class와 data class는 다르게 동작한다.

 

class Person(val name: String) 과

data class Person(val name: String) 을 비교해보자

 

Person person1 = Person("paul")

Person person2 = Person("paul")

이라는 두 객체를 생성한다.

 

println(person1==person2)

println(person1===person2)

println(person1.equals(person2)) 로 출력값을 확인해보면

 

전자의 결과

false

false

false

 

후자의 결과

true

false

true 이다.

 

그 이유는 일반 클래스의 경우 컴파일 시 참조값을 비교하는 반면에

데이터 클래스의 경우 컴파일러가 내부 데이터를 비교하기 때문.

 

일반적으로 ==과 equals는 동일한 결과값을 출력한다. (내부적으로 equals를 호출하기 때문)

 

 

 

참고자료)

https://agrawalsuneet.github.io/blogs/equality-in-kotlin/

 

Equality in Kotlin (‘==’, ‘===’ and ‘equals’)

We often need to compare the data of two variables or objects or the references of two objects in Kotlin. This brings in another question, which equality check should we use in which case.

agrawalsuneet.github.io

 

728x90

'언어 > Java&Kotlin' 카테고리의 다른 글

computeIfAbsent() vs putIfAbsent()  (0) 2020.03.20
코틀린의 캡슐화  (0) 2020.03.19
for문 조건  (0) 2020.02.26
스코프함수 정리  (0) 2020.02.25
꼬리재귀(Tail Recursion)  (0) 2020.01.22