[Kotlin] 동등성(Equality), 동일성(Identify)
코틀린에서는 두 객체를 비교하는타입에는 2가지가 있습니다.
- 동등성, Structural equality (==)
- 동일성, Referential equality (===)
동일성은 객체가 참조하는 주소값을 비교하고, 동등성은 객체가 가지는 정보를 비교합니다.
Java에서는 동일성인 ==
가 코틀린의 동일성인 ===
와 같은 것을 의미하고 Java 동등성인 equals
는 코틀린의 동등성인 ==
를 의미합니다.
Kotlin | Java | |
---|---|---|
동등성(equality) | == | equals |
동일성(Identify) | === | == |
동등성 비교(Structural equality)
코틀린에서는 ==
연산자나 반대인 !=
연산자로 구조적 동등성을 확인 할 수 있습니다.
a?.equals(b) ?: (b === null)
위 코드는 a
가 null
이 아닐 때 equals(Any?)
함수를 호출하고 a
가 null
이 아닐 때 b의 레퍼런스가 null
과 같은지에 대한 코드입니다. a == null
코드는 자동적으로 a === null
로 변환해주기 때문에 null
을 명시적으로 ==
로 비교하는 것은 의미가 없습니다.
equals(other: Any?): Boolean)
함수를 오버라이딩해서 커스텀 equals를 구현할 수 있습니다. equals(other: Foo)
함수와 같은 이름과 시그니처를 가진 함수는 ==
및 !=
연산자를 사용한 동등성 검사에 영향을 주지 않습니다.
또한 동등성 비교는 Comparable<...>
같은 인터페이스를 정의해서 비교할 필요가 없습니다. 오직 커스텀 equals(Any?)
만 구현해서 동작할 수 있게 하면 됩니다
동일성 비교(Referential equality)
동일성 비교는 ===
연산자와 그 반대인 !==
로 동일성 검사를 할 수 있습니다. a===b
가 true를 리턴할 때는 a
와 b
가 가리키는 주소 값이 동일 하다는 것을 의미합니다. 런타임시 primitive타입(Int, String, Float..)의 값의 경우 ===
은 ==
와 동일합니다.
Floating-point 숫자 비교
피연산 함수로 알려진 Float, Dobule(null 혹은 not null)은 IEEE 754 표준에 맞는 부동 소수점 산술을 따라야합니다. 아래와 같은 기준을 따르지 않는다면 동등성 비교가 사용됩니다.
Nan
은NaN
자신과 동등한 것으로 비교가 가능하다NaN
은POSITIVE_INFINITY
를 포함해 다른 어떤 것보다 크다-0.0
은0.0
보다 작다