[Kotlin] 코틀린의 기본 타입 ( Java와의 비교 )

2019. 5. 21. 10:41Kotlin

코틀린의 특징은 모든것이 객체이다 , 자바와 달리 primitive type을 제공하지 않는다 . 


※ primitive type이란 비객체 타입이다 . 따라서 null값을 가질 수 없고 OS가 바뀐다고 자료형의 길이가 변하지 않는다 . 

    또한 기본 자료형은 반드시 사용하기전에 선언되어야 한다 . 

 

 

코틀린은 자바와 다르게 8진수를 지원하지 않는다. 


Note that characters are not numbers in Kotlin. ( 코틀린 공식문서 )

Kotlin 공식문서에 나와있는 Data Type

 

 

코틀린에서 자료형 사용시 Java 플랫폼에서 숫자형은 JVM primitive Type으로 처리된다.


다음의 예제의 출처는 인프런 새차원님의 강좌에서 확인했던내용을 정리해서 올려본 내용입니다. 

 

저는 Jetbrain사의 IntelliJ를 사용중이며 IntelliJ의 상단의 [Tools] -> [Kotlin] -> [show Kotlin Bytecode]를 통하여 어떻게 동작되는지 Decompile해서 확인한 내용입니다 . 

Kotlin 기본 타입을 Decompile한 이미지

다음 이미지는 변수의 타입에 Int클래스 타입을 사용하였습니다 하지만 JVM에서 동작된 방식을 확인해보니 변수 a , b 에 자바의 primitive type으로 자료형이 대입되어있는것을 확인할 수 있습니다 . 따라서 a와 b 는 값도 같고 참조하는 곳또한 같아서 true , true의 결과를 반환하는것을 확인 할 수 있습니다 . 그렇다면 nullable한 클래스타입이나 제네릭의 같은경우는 박싱이 되어 객체처럼 사용되는데 어떻게 동작되는지 확인해 보겠습니다.

 

아래 이미지를 보면 Int?를 이용하여 Nullable 하게 입력을 받겠다고 타입을 선언하였습니다 . 또한 decompile하여 확인해보니 JVM에서 int primitive type이 아닌 Integer 객체로 받는걸 확인할 수 있습니다 . 따라서 ==을 이용하여 값만 비교시 true가 출력되지만 ===을 이용하여 같은 객체인지 확인을 한다면 false가 출력되는것을 확인할 수 있습니다 . 이로써 알수있는것은 박싱이되어 객체로 사용이 된다면 identity가 유지되지 않는다는것을 확인할 수 있습니다 . 

 

 

자바에서 숫자형으로 취급되었던 char자료형이 코틀린에서는 숫자형으로 취급되지 않는다 . 


자바에서 Char a = 'a'는 통삭적으로 ASCII 코드값으로 97로 처리가 가능하였습니다 .

하지만 코틀린에서는 char자료형이 있지만 숫자로 취급되지 않아 따로 처리를 해주어야합니다.

import kotlin.coroutines.experimental.buildIterator

fun main(args: Array<String>) {

    val charTest : Char = 'a';

    println('a' == 97)
    // Operator '==' cannot be applied to 'Char' and 'Int'

    println('a'.toInt() == 97)
}

 

위의 소스코드를 확인해보겠습니다.

'a'와 97을 비교하려고 하니 Char타입과 Int타입은 ==를 이용하여 비교할 수 없다는 Error가 발생한다 따라서 Char를 비교시 

toInt()를 사용하여 문자를 Int로 변환하여 비교한다 . 

 

Kotlin에서의 배열 


Kotlin에서의 배열은  Array클래스로 표현이 되며 , get , set , size등 유용한 함수들을 포함하고 있습니다 .

 

Kotlin에서의 배열을은 일반 배열과 특별한 Array 클래스 배열이 있습니다 . 

위의 예제를 보면 Array<Int>로 선언된 배열과 IntArray로 선언된 배열이 있습니다 . 두개의 차이는 과연 뭐가있을까요 

IntArray로 선언된 배열은 decompile시 JVM에서 프리미티브 타입으로 선언되고 일반 배열 []로 꺼낼때와 get으로 꺼낼떄 불필요한 박싱에 의한 오버헤드가 덜일어나게 됩니다 . 이러한 이유는 decompile을 하여 본 get() 메서드를 확인해보면 일반 Array<Int>로 선언한 배열은 get()을 통하여 가져올때 Number로의 형변환 , invValue()의 사용을 통해 자원을 더 먹게됩니다. 그렇다고 IntArrat가 Array를 상속한 클래스도 아닙니다 하지만 Array와 같은 메소드와 프로퍼티를 사용할 수 있습니다 . 

 

 

Kotlin 문자열 리터럴


fun main(args: Array<String>) {

    val s = """ '반갑습니다"'" """
    print(s)

}
//출력 결과 '반갑습니다"'"

""" """ (쌍따옴표 3개)를 이용하면 escaping 처리가 필요없이 사용 가능 .

 

'Kotlin' 카테고리의 다른 글

[Kotlin] 상속  (0) 2019.05.21
[Kotlin] class 의 활용 및 개념  (0) 2019.05.21
[Kotlin] Package , Return and Jumps  (0) 2019.05.21
[Kotlin] 코틀린 Control Flow  (0) 2019.05.21
[Kotlin] Kotlin 기초 문법 (Basic Syntax)  (0) 2019.05.20