2019. 5. 21. 10:41ㆍKotlin
코틀린의 특징은 모든것이 객체이다 , 자바와 달리 primitive type을 제공하지 않는다 .
※ primitive type이란 비객체 타입이다 . 따라서 null값을 가질 수 없고 OS가 바뀐다고 자료형의 길이가 변하지 않는다 .
또한 기본 자료형은 반드시 사용하기전에 선언되어야 한다 .
코틀린은 자바와 다르게 8진수를 지원하지 않는다.
Note that characters are not numbers in Kotlin. ( 코틀린 공식문서 )
코틀린에서 자료형 사용시 Java 플랫폼에서 숫자형은 JVM primitive Type으로 처리된다.
다음의 예제의 출처는 인프런 새차원님의 강좌에서 확인했던내용을 정리해서 올려본 내용입니다.
저는 Jetbrain사의 IntelliJ를 사용중이며 IntelliJ의 상단의 [Tools] -> [Kotlin] -> [show Kotlin Bytecode]를 통하여 어떻게 동작되는지 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 |