개발일지

Kotlin in A..Z (5) - 자료형 비교, 검사, 변환 본문

Kotlin (코틀린)

Kotlin in A..Z (5) - 자료형 비교, 검사, 변환

강태종 2020. 7. 10. 19:07

Kotlin에서 자료형이 다른 변수끼리 연산할 수 없고, 연산을 하려면 형 변환을 거쳐야한다.

 

코드

val num1:Int = 123
val num2:Long = num1 //Long형에 Int형을 대입할 수 없음 Error
// Error : Type mismatch.

- 자동 형 변환

표현식에서 서로 다른 자료형을 연산하면 범위가 큰 자료형으로 Kotlin에서 형 변환을 해준다.

 

코드

val num1:Int = 123
val num2:Long = 321L
val num3 = num1 + num2 // Int + Long에서 Long이 더욱 큰 자료형이므로 Long으로 자동 형 변환

println(num3)
println(num3.javaClass) // 자료형을 확인하는 방법

 

결과

444
long

- 변환 메서드

변환 메서드를 통해 직접 형 변환을 할 수 있다.

메서드 자료형 메서드 자료형
toShort() Short toByte() Byte
toInt() Int toLong() Long
toUShort() UShort toUByte() UByte
toUInt() UInt toULong() ULong
toFloat() Float toDouble() Double
toChar() Char toString() String

 

코드

val num1:Int = 123
val str1:String = num1.toString() // num1을 String으로 변환

println(str1)

 

결과

123

- as에 의한 스마트 캐스트

as는 형 변환이 가능하면 캐스트하고 형 변환이 가능하지 않으면 ClassCastException를 throw한다.

상속관계에서 as에 의한 스마트 캐스트가 가능하다

 

※ : Any는 최상위 Class로 모든 Class는 Any클래스를 상속한다. (Java에서 Object와 비슷)

 

코드

val obj1: Any = 123
val str1: String = obj1 as String // Int형을 String으로 캐스트할 수 없음

println(str1)

 

결과

Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
	at MainKt.main(main.kt:3)
	at MainKt.main(main.kt)

코드

val obj1: Any = "개발일지"
val str1: String = obj1 as String

println(str1)

 

결과

개발일지

- as?에 의한 스마트 캐스트

as?을 이용하여 스마트 캐스트할 때 null을 체크할 수 있다.

 

코드

val obj1: Any? = null
val str1: String? = obj1 as? String
println(str1)

val obj2: Any? = "개발일지"
val str2: String? = obj2 as? String
println(str2)

 

결과

null
개발일지

- 묵시적 형 변환

Any형은 모든 Class의 부모 클래스이기 때문에 무엇이든 될 수 있고, Any형 변수에 값을 대입할 때마다 묵시적으로 Kotlin이 형 변환을 해준다.

 

코드

var obj1: Any = 1
println(obj1.javaClass)

obj1 = "개발일지"
println(obj1.javaClass)

 

결과

class java.lang.Integer
class java.lang.String

- 자료형 검사

is 키워드

variable is 자료형 형식으로 Boolean 값을 반환한다.

 

코드

val str1:String = "개발일지"
println(str1 is String)
if(str1 is String) {
    println("str1 is String")
}
else {
    println("str1 is not String")
}

 

결과

true
str1 is String

variable.javaClass

runtime에서 Class의 형식을 저장하는 프로퍼티이다

 

코드

val str1:String = "개발일지"
println(str1.javaClass)

 

결과

class java.lang.String

'Kotlin (코틀린)' 카테고리의 다른 글

Kotlin in A..Z (7) - 함수  (0) 2020.07.11
Kotlin in A..Z (6) - 연산자  (0) 2020.07.10
Kotlin in A..Z (4) - null  (0) 2020.07.10
Kotlin in A..Z (3) - 문자열  (0) 2020.07.08
Kotlin in A..Z (2) - 자료형  (0) 2020.07.08
Comments