코틀린 자료형의 기본형(Primitive Type)과 참조형(Reference Type)

책의 내용을 좀더 보강해 보겠습니다. 

먼저 코틀린에서 자료형(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) 버튼을 눌러보면 다음과 같이 자바 코드가 생성되어 있습니다.

public final class PrimitiveAndRefKt {
   public static final void main() {
      int a0 = 30;
      int a1 = 40;
      Integer a2 = 50;
      int a3 = true;
      String var4 = a0 + ", " + a1 + ", " + a2;
      boolean var5 = false;
      System.out.println(var4);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }
}

그럼 Int와 Int?의 차이점을 파악하는데 도움이 되었길 바랍니다!

 

 

Tags: 
youngdeok's picture

Language

Get in touch with us

"If you would thoroughly know anything, teach it to other."
- Tryon Edwards -