본문 바로가기

kotlin

Any , 타입변환

Any





kotlin 의 Any 클래스는 최상위 단위 클래스이다.


java 의 Object 클래스와 비슷하지만 명백히 다른점이 있다.


val a : Any  = 1234

val a2 : Any = 'A'
var a3 : Any = "xyz"
a3 = 3.141592
a3 = true


a3 변수는 Any 타입 이므로 다른 타입으로 변수를 바꾸어도 된다.





type check 



타입을 체크하는것은 is 라는 키워드로 가능하다 java의 instanceof 와 비슷한 행동을 하고 조건문에도 is 타입을 사용한다.


결과는 java와 같이 boolean 타입으로 return한다.



val c1 = 123

val c2 = 123L
val c3 : Byte = 123
val c4: Short = 123

println("c1.javaClass = ${c1.javaClass} ${c1 is Int}")
println("c2.javaClass = ${c2.javaClass} ${c2 is Long}")
println("c3.javaClass = ${c3.javaClass} ${c3 is Byte}")
println("c4.javaClass = ${c4.javaClass} ${c4 is Short}")



자동 타입 변환 



val c5: Any = c3 +1L

println("c5.javaClass = ${c5.javaClass} ${c5 is Byte}")


c5에 1을 더하거나 Long Double 등 많은 것들을 더하면 타입이 바뀜



val c5: Any = c3    //byte


val d : Int = c5 as Int // ClassCastException


c5 는 Byte 형 변수이다 이것을 강제로 as 라는키워드를 이용하여 Int로 바꾸려할때 Class 


Exception in thread "main" java.lang.ClassCastException: java.lang.Byte cannot be cast to java.lang.Integer


이 발생한다. 다른언어에서는 Int가 Byte보다 자료형이 크니까 바꿔주지만 kotlin에서는 완전히 다른 객체 이므로 클래스 변환이 불가하다.


해결방법은 타입을 변환해서 넣어 줘야 한다.



val d : Int = 123

val d1: Int = d.toInt()
val d2 : Short = d.toShort()
val d3 : Long = d.toLong()
val d4: Float = d.toFloat()
val d5: Double = d.toDouble()
val d6: Char = d.toChar()
val d7: Float = d.toFloat()
val d8 : String = d.toString()

println("d1 = ${d1}")
println("d2 = ${d2}")
println("d3 = ${d3}")
println("d4 = ${d4}")
println("d5 = ${d5}")
println("d6 = ${d6}")
println("d7 = ${d7}")
println("d8 = ${d8}")


위의 예제는 타입을 강제 변환해서 넣었다. 


as라는 연산자 키워드는 확실히 타입이 맞을때 사용하고 아니라면 to로 시작하는 명시적 변환 메소드를 사용하는것이 권장 사항이다.


as? 라는 연산자가 존재하는데 캐스팅이 된다면 계속 진행하고 안된다면 execption을 주지않고 그냥넘어간다.






'kotlin' 카테고리의 다른 글

Array  (0) 2018.12.06
Nullable (? , !!, ?:)  (0) 2018.12.06
asList와 toList  (0) 2018.12.04
Kotlin의 유용한 함수 - let, apply, run, with  (0) 2018.12.04
constructor와 init  (0) 2018.12.03