반갑습니다!

[Kotlin] 자료형의 변환 본문

Kotlin

[Kotlin] 자료형의 변환

김덜덜이 2020. 6. 3. 18:37

명시적 형변환

코틀린에서는 자바에서 지원하던 묵시적 형변환을 지원하지 않는다. 때문에 명시적 형변환을 사용해야한다. 지원하는 형변환은 다음과 같다.

  • toByte: Byte
  • toLong: Long
  • toShort: Short
  • toFloat: Float
  • toInt: Int
  • toDouble: Double
  • toChar: Char

스마트 캐스트

코틀린에서는 자바와 달리 변수를 선언할 때 자료형을 명시하지 않아도 된다는 특징이 있다. 이는 컴파일러에서 추론해서 자료형을 변환시켜주기 때문이다. Number형으로 정의된 변수에는 저장되는 값에 따라 정수, 실수 등으로 자료형이 변환된다.

var test: Number = 12.2        // 12.2에 의해서 Float으로 스마트 캐스트
println("$test")        // 12.2
test = 12        // 12에 의해서 Int로 스마트 캐스트
println("$test")        // 120
test += 12.0f    // 12.0f에 의해서 Float으로 스마트 캐스트
println("$test")        // 132.2

등호의 사용

코틀린에서는 등호를 사용한 비교를 2가지 방식으로 할 수 있다.

  • == 값만 비교하는 경우
  • === 값과 참조 주소를 비교하는 경우
    자바에서는 == 연산을 통해 값과 참조 주소를 모두 비교하기 때문에 주의해야한다.
    val a = 128
    val b = 128
    pritnln(a == b)        // true
    println(a === b)    // true
    a와 b 모두 컴파일 과정을 거쳐 기본 자료형이 된다.
val a: Int = 128
val b: Int? = 128
println(a == b)     // true
println(a === b)     // false

b는 Nullable한 변수이므로 컴파일 과정을 통해 기본형으로 변환되지 않고 객체가 된다. 따라서 a와 b의 참조 주소가 다르다.

val a: Int = 128
val b: Int? = a
val c: Int? = a
println(b == c)     // true
println(b === c)    // false

b와 c 모두 객체가 되므로 참조 주소가 다르다.

코틀린에서는 참조형으로 선언한 변수의 값이 -128 ~ 127 범위에 있으면 캐시에 그 값을 저장한다. 따라서 그 경우 참조형에 대한 비교 연산을 했을 때 같은 값이 나올 수 있다.

자료형의 검사

코틀린에서는 is 키워드를 사용해서 자료형을 검사할 수 있다.

fun main() {
    var num:Number = 123

    if(num is Int){
        println("Int value : $num")
    }
    num = 123.5f

    if(num !is Int){
        println("number is not Integer : $num")
    }
}

/*
 * 실행 결과
 * Int value : 123
 * number is not Integer : 123.5
 */

Any

코틀린에서 Any는 모든 클래스의 루트가 되는 클래스이다. 자바에서 Object 클래스라고 생각하면 이해하기 쉽다. 따라서 스마트 캐스트를 사용하면 Any는 언제든지 필요한 자료형으로 변환할 수 있다는 특징이 있다.

fun main() {
    var a: Any = 123
    println("a: $a,  type: ${a.javaClass}")
    a = 123.4f
    println("a: $a,  type: ${a.javaClass}")
    a = "Hello Kotlin!"
    println("a: $a,  type: ${a.javaClass}")
}

/*
 * 실행 결과
 * a: 123,  type: class java.lang.Integer
 * a: 123.4,  type: float
 * a: Hello Kotlin!,  type: class java.lang.String
 */

'Kotlin' 카테고리의 다른 글

[Kotlin] 함수  (0) 2020.06.09
[Kotlin] 비트 연산  (0) 2020.06.08
[Kotlin] Null vs Non-Null  (0) 2020.05.01
[Kotlin] 자료형과 변수  (0) 2020.04.30
[Kotlin] Introduction to Kotlin  (0) 2020.04.30