코틀린 언어 정리 1-7
기본 - operator(연산자)
일치, 불일치 연산자
일치, 불일치 연산자는 비교 대상에 따라 참조 동등성(referential equality), 구조 동등성(structural equality, 값 비교)의 두 가지 특성으로 구분됩니다.
==, != ( 구조 동등성 연산 )
표현식의 결과로 리턴되는 값이 같은지를 비교하는 연산자입니다. 예를 들면 "A == B" 일 경우 A와 B가 표현식으로서 리턴된 값이 같은지를 비교( equality check )합니다. 간단하게 정리하면 값 비교입니다.
===, !== ( 참조 동등성 연산 )
참조하는 대상이 같은지 확인 하는 연산자입니다. 예를 들면 "A === B" 일 경우, A와 B가 참조하는 객체가 동일한지 확인합니다.( identity check ) 간단하게 말하면 객체 주소 비교와 비슷한 개념입니다.
이 연산자는 오버로딩이 허용되지 않습니다.
C/C++ 처럼 포인터 같은 개념/기능을 명시적으로 지원하지 않으므로(객체의 주소값을 직접 참조할 수 없으므로) 별도로 필요한 연산자입니다.
주의
기본 타입을 이 연산자로 비교하게 될 경우 Java로 변환할 때의 특성 때문에 주의해야 하는 사항이 있습니다. 기본 타입의 변수를 비교하는 경우, 코틀린의 기본 타입( Long, Int, Byte 등 주로 숫자형 Type들을 말하며 코틀린에서는 이런 기본 타입들도 객체로 처리됩니다. )이 Java로 변환될 때 객체가 아닌 기본 타입으로 처리되기 때문에 === 연산자를 사용해도 == 연산자 처럼 값 비교로 동작합니다. 하지만 기본 타입의 nullable 타입은 코틀린도 객체, Java에서도 객체로 처리되기 때문에 동일한 객체(인스턴스)인지 비교하는 연산(참조 동등성 연산)을 하므로 특별히 예외적인 상황이 없어야 합니다. 그런데 숫자의 크기에 따라 이해하기 어려운 결과가 나오는 경우가 있습니다. 서로 다른 nullable 숫자형( ex. Int? ) 타입의 두 변수가 -128~127 범위에서 동일한 숫자를 가지는 경우 === 연산의 결과 값이 true로 나옵니다. 원래는 서로 다른 객체가 생성되어 각각 값을 저장하고 있으므로 false가 나와야 하는데 true가 나옵니다.
예제
이런 결과는, 현재 시점에서 코틀린이 나오게 된 이유가 Java에 종속적이고, Java에서 일반적으로 보이지 않는 구현 특성(숫자 처리 최적화) 때문에 발생합니다. 개인적 판단으로는, 이런 특성은 플랫폼 종속적인 내용이므로 최대한 사용하지 않는 것이 버그 발생을 줄이는 길입니다. 따라서 기본 타입을 비교할 때는 굳이 이런 특수 상황까지 고려해서 ===, !== 을 사용하지 말고 ==, != 연산자를 사용해야 합니다.
'코틀린( Kotlin )' 카테고리의 다른 글
코틀린 1-9 기본 - operator(연산자) - 연산자 오버로딩 (0) | 2020.04.03 |
---|---|
코틀린 1-8 기본 - operator(연산자) - spread operator( 전개 연산자 ), 범위 연산자, 비트 연산자 (0) | 2020.04.03 |
코틀린 1-6 기본 - operator(연산자) - null 안전 처리 연산자 (0) | 2020.04.02 |
코틀린 1-5 기본 - 접근 제한자, 예외처리 (0) | 2020.04.01 |
코틀린 1-4 기본 - 제어문 (0) | 2020.04.01 |