책의 내용을 좀더 보강해 보겠습니다.
먼저 코틀린에서 자료형(Data Type)을 선언하기 위해 Int, Long 등의 자료형은 null 할당이 허용되지 않으며 컴파일 후 기본형 혹은 원시형(Primitive Type)으로 변환되 JVM에서 실행 된다고 했었죠.
하지만 null 할당이 가능하게 하는 물음표(?)기호를 붙인 자료형, 예를 들어 Int?, Long?는 기본형으로 변환되지 않습니다. 객체가 힙(Heap) 공간에 생성되 사용됩니다. 정리하면 다음과 같죠.
선언 | Kotlin 자료형 | Java 자료형 |
---|---|---|
var a0 = 30 | Int | int |
var a1: Int = 40 | Int | int |
var a2: Int? = 50 | Int? | Integer |
표에서 보는것처럼 Int?의 경우에는 Integer라는 클래스가 사용되 객체를 생성합니다. a0와 a1은 자바에서 기본형을 사용합니다. 처음 두개의 변수 a0와 a1은 동영상에서 설명한 것처럼 스택(Stack)에 들어갑니다.
이것을 확인하는 방법은 IntelliJ IDEA나 AndroidStudio에서 Kotlin Bytecode 변환을 확인해 보는 것입니다.
Int? 선언부분을 확인해 보면 다음과 같이 자바의 Integer가 사용되고 있음을 알 수 있습니다. a0와 a1은 스택에 push됩니다.
Integer.valueOf(int i) 는 기본형 변수를 받아 정수형으로 반환합니다. 이 과정에서 기본형을 참조형인 Integer가 감싸 객체로 생성하게 됩니다. 따라서 값 자체가 저장되지 않고 참조 객체가 저장되게 됩니다. 역 컴파일(Decompile) 버튼을 눌러보면 다음과 같이 자바 코드가 생성되어 있습니다.
그럼 Int와 Int?의 차이점을 파악하는데 도움이 되었길 바랍니다!
"어떤 것을 완전히 알려거든 그것을 다른 이에게 가르쳐라."
- Tryon Edwards -