단비의 개발블로그

코틀린의 변수와 자료형 (Kotlin) 본문

Java & Kotlin

코틀린의 변수와 자료형 (Kotlin)

단비냥 2021. 3. 23. 22:40
반응형

코틀린의 자료형

코틀린은 기본적으로 null 허용을 하지 않습니다. 즉, 값이 항상 할당되어야 한다는 원칙이 있습니다.

코틀린은 참조형 자료형만을 주로 사용하는데,

Int, Long 등의 null을 허용하지 않는 변수들은 컴파일 후 기본형 (Primitive Type) 으로 변환되어 JVM에서 실행됩니다.

 

물음표(?)를 붙이면 코틀린에서도 null 할당이 가능하죠. 예를 들면 Int?, Long? 등은 기본형으로 변환되지 않고 힙(Heap) 공간에 저장됩니다.

그래서 null을 가질 수 있는 Int?는 래퍼 클래스인 Integer으로 박싱(Boxing) 되어 처리됩니다.

 

즉,

Int -> Int (Primitive type)

Int? -> Integer 

이와같이 처리됩니다

 

코틀린의 동등성 연산 (== , ===)

먼저 == 은 내부적으로 equals를 호출합니다.

그래서 이 같은지를 비교합니다.

반면, ===은 객체가 같은 주소를 참조하는지 (같은 객체를 가지는지) 주소값에 대한 비교를 합니다.

즉, 자바의 == 와, 코틀린의 ===은 같은 역할을 하게 됩니다.

 

그럼 이 코드에서는 어떻게 프린트되어 나올까요??

 

 

놀랍게도

boxedA === anotherBoxedA  -> true

boxedB === anotherBoxedB  -> false

를 리턴합니다.

 

그 이유는, Integer 형은 [-128. 127] 범위에서 캐싱하기 때문에 범위 내에 값이 있으면 새로운 인스턴스를 생성하지 않습니다.

그러므로 Integer로 박싱될 때 a는 100이기 때문에 새로운 객체를 생성하지 않아, boxedA와 anotherBoxedA는 같은 객체를 가지게 되는 것입니다.

반대로 캐싱되지 않은 boxedB와 anotherBoxedB는 다른 객체를 가져 false를 리턴하게 되는 것입니다.

 

이것에 대해 설명한 stackOverflow 페이지입니다.

stackoverflow.com/questions/45139381/kotlin-boxed-int-are-not-the-same

마치며

처음 이 문제를 접했을 때는 문제에 오타가 났나 하고 생각했었는데,

이유를 알고나서는 오타가 아닌것에 꽤 충격이었고..ㅋㅋ 잘 이해도 가지 않았기 때문에 Java와 Kotlin의 변수 타입부터 Boxing까지 공부해보는 시간을 가졌습니다. 

자바부터 코틀린까지 공부하고 비교해보고 나니 이제야 이해가 됩니다! 😄👍

반응형
Comments