Basic Types
코틀린에서 모든 것은 객체이다.
모든 것에 멤버 함수나 프로퍼티를 호출 가능하다.
숫자
Java의 숫자형과 거의 비슷하다.
하지만 Java에서 숫자형이던 char가 kotlin에서는 숫자 형이 아니다.
- Double: 64bit
- Float: 32bit
- Long: 64bit
- Int: 32bit
- Short: 16bit
리터럴
underscore를 사용하여 리터럴을 표현할 수 있다.
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_1234_5678
긴 숫자들을 헷갈리지 않고 사용할 수 있을 것 같다.
Representation
Java 플랫폼에서 숫자형은 JVM primitive type으로 저장된다.
Nullable이나 제네릭의 경우에는 박싱된다. 박싱된 경우 identity를 유지하지 않는다.
fun test() {
var a: Int = 10000
var b: Int = 10000
//identity check
println("===${a===b}")
//equality check
println("==${a == b}")
}
Decomplie로 Java코드를 얻어내 JVM에서 어떻게 동작했나 봤더니 primitive type으로 동작했다.
분명히 클래스로 Kotlin코드를 작성했는데 박싱이 된것이다.
b를 nullable로 바꿔서 확인해보자.
b가 Object 타입으로 동작했다. 실행결과는 어떨지 확인해 보자.
값은 같지만 type은 다르다는 결과가 나왔다.
이 부분을 알고 있어야 에러 발생이 더 적어질 것이다.
Explicit Conversions
작은 타입은 큰 타입의 하뤼 타입이 아니다. 즉, 작은 타입에서 큰 타입으로 대입이 되지 않는다.
val a: Int = 1 // A boxed Int
//val b: Long = a //에러
val b: Long = a.toLong()
int는 32bit이고 Long은 64bit이기 때문에 바로 대입이 가능할 것 같지만 에러가 발생한다.
명시적으로 변환을 해줘야 한다.
문자
Char는 숫자로 취급되지 않는다.
fun check(c: Char){
if(c == 1){ } //ERROR
}
fun check(c: Char){
if(c == 'a'){ } //OK
}
Java와 달리 Char가 숫자와 비교가 되지 않는다.
배열
배열은 Array라는 클래스로 표현이 된다.
get, set이라는 메서드를 이용하여 접근한다. size 같은 멤버 함수를 포함하고 있다.
var array: Array<String> = arrayOf("헬로", "코틀린")
println(array.get(0))
println(array[0])
println(array.size)
배열 생성에는 크게 두 가지 방법이 있다.
val b = Array(5,{i -> i.toString() })
val a = arrayOf("0","1","2","3","4")
Array팩토리 함수를 이용할 수 있고, arrayOf 라이브러리 함수를 이용할 수도 있다.
특별한 Array클래스가 하나 있다.
Primitive 타입의 박싱 오버헤드를 없애기 위한 배열이다. 그 예로는 IntArray, ShortArray 등이 있다.
Array를 상속한 것은 아니지만 사용 방법은 완전히 동일하다.
primitive 타입을 사용하지 않을 경우 사용하면 된다. 즉, null이 확실히 없을 때 사용하자.
문자열
문자열은 Java와 매우 흡사하다.
var x: String = "Kotlin"
println(x.get(0))
println(x[0])
println(x.length)
for(c in x){
println(c)
}
문자열 리터럴
- escaped string("Kotlin"): 전통적인 방식으로 Java String과 유사 '\'을 이용해 escape
- raw string("""Kotlin"""): escape를 처리할 필요가 없다.
val s = "Hello, world!\n"
val s = """
""코틀린의
raw String
입니다.""
"""