[Kotlin] 동등성(Equality), 동일성(Identify)

케니스·2023년 1월 19일
0

코틀린에서는 두 객체를 비교하는타입에는 2가지가 있습니다.

  • 동등성, Structural equality (==)
  • 동일성, Referential equality (===)

동일성은 객체가 참조하는 주소값을 비교하고, 동등성은 객체가 가지는 정보를 비교합니다.

Java에서는 동일성인 ==가 코틀린의 동일성인 ===와 같은 것을 의미하고 Java 동등성인 equals는 코틀린의 동등성인 ==를 의미합니다.

KotlinJava
동등성(equality)==equals
동일성(Identify)=====

동등성 비교(Structural equality)

코틀린에서는 == 연산자나 반대인 != 연산자로 구조적 동등성을 확인 할 수 있습니다.

a?.equals(b) ?: (b === null)

위 코드는 anull이 아닐 때 equals(Any?)함수를 호출하고 anull이 아닐 때 b의 레퍼런스가 null과 같은지에 대한 코드입니다. a == null 코드는 자동적으로 a === null로 변환해주기 때문에 null을 명시적으로 ==로 비교하는 것은 의미가 없습니다.

equals(other: Any?): Boolean) 함수를 오버라이딩해서 커스텀 equals를 구현할 수 있습니다. equals(other: Foo) 함수와 같은 이름과 시그니처를 가진 함수는 ==!= 연산자를 사용한 동등성 검사에 영향을 주지 않습니다.

또한 동등성 비교는 Comparable<...> 같은 인터페이스를 정의해서 비교할 필요가 없습니다. 오직 커스텀 equals(Any?)만 구현해서 동작할 수 있게 하면 됩니다

동일성 비교(Referential equality)

동일성 비교는 ===연산자와 그 반대인 !==로 동일성 검사를 할 수 있습니다. a===b가 true를 리턴할 때는 ab가 가리키는 주소 값이 동일 하다는 것을 의미합니다. 런타임시 primitive타입(Int, String, Float..)의 값의 경우 =====와 동일합니다.

Floating-point 숫자 비교

피연산 함수로 알려진 Float, Dobule(null 혹은 not null)은 IEEE 754 표준에 맞는 부동 소수점 산술을 따라야합니다. 아래와 같은 기준을 따르지 않는다면 동등성 비교가 사용됩니다.

  • NanNaN자신과 동등한 것으로 비교가 가능하다

  • NaNPOSITIVE_INFINITY를 포함해 다른 어떤 것보다 크다

  • -0.00.0 보다 작다

참고

Kotlin Docs - Equality

profile
노력하는 개발자입니다.

0개의 댓글