본문 바로가기
언어/Kotlin&Java

[코틀린/Kotlin] 기초 #06_자료형 변환과 스마트 캐스트

by 옹구스투스 2021. 8. 15.
반응형

환경 : Kotlin Version = 1.5.20, Java version = 14.0.2 JVM, Android Studio

 

코틀린의 자료형 변환과 스마트캐스트에 대해 알아보자


0.참고 자료

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/

 

kotlin.io - Kotlin Programming Language

 

kotlinlang.org

https://www.boostcourse.org/mo132

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org


1. 코틀린의 자료형 변환과 스마트 캐스트

2021.08.10 - [언어/Kotlin&Java] - [코틀린/Kotlin] 기초 #04_기본형 vs 참조형

이전 글에서 코틀린의 자료형은 모두 참조형으로 선언하지만, 컴파일을 거쳐서 최적화될 때는 Int, Long, Short와 같은 참조형 자료형은 기본형 자료형으로 변환된다고 했다.

참조형과 기본형의 저장 방식은 서로 다르기 때문에 자료형을 비교하거나 검사할 때는 다음과 같은 특징을 이해하고 있어야 한다.

1) 코틀린의 자료형 변환

서로 다른 자료형은 변환 과정을 거친 후 비교해야 하고, 이미 자료형이 정해진 변수에 다른 자료형을 재할당하면
자동 형 변환이 되지 않고 자료형 불일치 오류(type mismatch)가 발생한다.

   var a : Int =30
   val b : Long = 30
   println(a==b) //error
   b=a//error

따라서 변환 메서드를 이용하여 자료형을 변환해야한다.

  • toByte() toByteOrNull()
  • toShort() toShortOrNull()
  • toInt() toIntOrNull()
  • toLong() toLongOrNull()
  • toFLoat() toFloatOrNull()
  • toDouble() toDoubleOrNull()
  • toChar() toCharOrNull()
  • toString() toStringOrNull()

String to Int 변환은 toInt(), Integer.parseInt() 모두 가능하고,

Char to Int 변환은 Kotlin에서는 Char자료형을 정수로 표현하는 데 사용할 수 없기 때문에, 

Character.getNumericValue()함수로 대체한다.

var a : Int =53
var b : Char = '1'
val str = a.toString() // str = "53"
a = Integer.parseInt(str) //a =53 
//a = str.toInt()
a = b.toInt() // a = 49 1의 ASCII값인 49
a = Character.getNumericValue(b) // a = 1

 

또한 다음과 같은 표현식에선 자료형이 자동 변환된다.

val result = 1L + 3 // Long + Int -> 더 큰 자료형인 Long으로 변환

 

2) 기본형과 참조형 자료형의 비교

2021.08.10 - [언어/Kotlin&Java] - [코틀린/Kotlin] 기초 #04_기본형 vs 참조형   

이전 글을 참고하자.

 

 

3) 스마트 캐스트

어떤 값이 정수일 수도 있고 실수일 수도 있는 경우 그때마다 자료형을 변환해도 되지만

Number라는 숫자를 저장하기 위한 특수한 자료형 객체를 사용하면 된다.

Number형으로 정의된 변수에는 저장되는 값에 따라 정수, 실수 등으로 자료형이 변환(스마트 캐스트)되고, Number형은

모든 숫자 자료형의 상위 자료형이기 때문에 하위에 속하는 어떤 자료형으로도 변환할 수 있다.

String 같은 경우는 Number에 속하지 않으므로 변환할 수 없다.

var test : Number = 12.2  // test : Double
test = 12 // test : Int
test = 120L // test : Long
test  12.0f // test : Float

 

그러면 어떤 값의 자료형이 특별히 정해지지 않은 경우 String 같은 자료형도 사용하고 싶으면 어떡할까?

이때는 Any형을 사용하면 된다. Any는 자료형이 정해지지 않은 경우 사용하고, 모든 클래스의 뿌리(부모)이다.

Any는 Int, Number, String 등의 자료형의 부모이며, 사용자가 직접 만든 클래스까지 모두 Any형의 자식 클래스이다.

즉, 코틀린의 모든 클래스는 바로 Any라는 슈퍼클래스(Supperclass)를 가지기 때문에

Any형으로 선언된 변수는 어떤 자료형으로도 변환(스마트 캐스트)할 수 있다.

var a : Any ="abc" // a : String으로 스마트 캐스트
a  = 20 // a : Int로 스마트 캐스트

 

4) 자료형의 검사

변수의 자료형은 is 키워드를 이용해 검사할 수 있으며, .javaClass로 자료형을 확인할 수 있다.

val num : Any =256
if(num is Int){ //num이 Int형일 때
	print(num) //256
    print(num.javaClass) // class java.lang.Integer
}
else{
	print("not Int")
}

TODO

var num : Any = 25일 때 num의 type은 class java.lang.Integer이고

var num = 25일 때 num의 tpye은 int이다.

이유를 알아보자.

반응형

댓글