코틀린에서는 두 객체를 비교하는타입에는 2가지가 있습니다.
동일성은 객체가 참조하는 주소값을 비교하고, 동등성은 객체가 가지는 정보를 비교합니다.
Java에서는 동일성인 ==
가 코틀린의 동일성인 ===
와 같은 것을 의미하고 Java 동등성인 equals
는 코틀린의 동등성인 ==
를 의미합니다.
Kotlin | Java | |
---|---|---|
동등성(equality) | == | equals |
동일성(Identify) | === | == |
코틀린에서는 ==
연산자나 반대인 !=
연산자로 구조적 동등성을 확인 할 수 있습니다.
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?)
만 구현해서 동작할 수 있게 하면 됩니다
동일성 비교는 ===
연산자와 그 반대인 !==
로 동일성 검사를 할 수 있습니다. a===b
가 true를 리턴할 때는 a
와 b
가 가리키는 주소 값이 동일 하다는 것을 의미합니다. 런타임시 primitive타입(Int, String, Float..)의 값의 경우 ===
은 ==
와 동일합니다.
피연산 함수로 알려진 Float, Dobule(null 혹은 not null)은 IEEE 754 표준에 맞는 부동 소수점 산술을 따라야합니다. 아래와 같은 기준을 따르지 않는다면 동등성 비교가 사용됩니다.
Nan
은 NaN
자신과 동등한 것으로 비교가 가능하다
NaN
은 POSITIVE_INFINITY
를 포함해 다른 어떤 것보다 크다
-0.0
은 0.0
보다 작다