목차
- 기본타입 형변환
- 객체의 형변환
- 스마트캐스트
형변환이란 하나의 변수에 지정된 자료형을 호환하는 다른 자료형으로 변경하는 기능을 말한다.
Java에서는 자동 형변환을 지원했으며, 강제 형변환도 손쉽게 가능했다.
형변환이 가능하다면 그냥 변수명 앞에 타입만 붙여주면 된다.
하지만! 코틀린은 형변환 시 발생할 수 있는 오류를 막기 위해 다른 언어들이 지원하는 암시적 형변환은 지원하지 않는다.
캐스팅 연산도 지원하지 않는다.
명시적 형변환 - 변환될 자료형을 개발자가 직접 지정
암시적 형변환 - 변수를 할당할 시 자료형을 지정하지 않아도 자동으로 형변환
그렇다면 어떻게 해야 할까?
1. 기본타입 형변환
기본 타입 형변환은 Java와 비슷하게 정의된 함수를 통해 손쉽게 형변환 할 수 있다.
val longValue:Long = 34
val intValue:Int = longValue.toLong() // Long을 Int로 강제 형변환
val stringValue:String = "1234"
val stringToInt = Integer.parseInt(stringValue) // 정수 1234로 변환
형변환 함수들
- toByte()
- toShort()
- toInt()
- toLong()
- toFloat()
- toDouble()
- toChar()
- String의 형변환은 Java와 동일
2. 객체들 사이에서의 형변환
Java에서 객체를 사용할 때 앞에 (자료형)을 붙여서 명시적으로 형변환 해주어야 했다. Kotlin에서도 이러한 명시적 형변환이 가능한데 바로 as 키워드를 사용한다.
자바
Map<String, Object> map = Map.of("key1", "value1", "key2", 2);
String a = (String) map.get("key1");
int b = (int) map.get("key2");
코틀린
val map = mapOf<String, Any>(Pair("key1", "value1"), Pair("key2", 2))
val a = map["key1"] as String
val b = map["key2"] as Int
자바의 명시적 형변환과 다른점이라면 자바는 형변환 하고자 하는 대상의 앞에 (자료형)을 선언했지만, Kotlin에서는 대상의 뒤에 as 자료형을 붙여야 한다.
3. 스마트 캐스트(Smart Cast)
코틀린에서는 스마트캐스트라는 기능을 제공한다. 직역하면 똑똑한 형변환이라고 할 수 있는데, 말 그대로 특정상황에서 컴파일러가 알아서 형변환을 해주는 기능이다.
예를 들어, Any를 값으로 갖는 Map에서 값을 가져왔을 때 그 값의 타입이 무엇인지 확인을 하고 그에 따라 다른 연산을 수행해야 할 때가 있다.
자바에서는 if문의 조거식에서 instanceof를 사용해서 객체타입을 검사하더라도 if문 내부에서 명시적으로 형변환을 해줘야 해당 타입에 맞는 연산이 가능하다.
Map<String, Object> map = Map.of("key1", "value1", "key2", 2);
Object a = map.get("key1");
if (a instanceof String) {
System.out.println(((String) a).length());
}
코틀린에서는 이러한 경우에 is 키워드를 사용하여 타입을 확인하는데 따로 if문 내부에서 따로 형변환을 하지 않아도 자동으로 검사한 타입으로 취급하게 된다. if문 해당조건식의 블록에 접근했다는 것은 해당타입인지 검사한 것을 의미하고, 이는 곧 그 객체가 검사한 타입이라는 의미이므로 컴파일러가 스스로 판단을 한 것이다. 이것을 스마트 캐스트라고 한다.
val map = mapOf<String, Any>(Pair("key1", "value1"), Pair("key2", 2))
val a = map["key1"]
if (a is String) {
println(a.length)
}
끝!
'코틀린' 카테고리의 다른 글
[Kotlin] 조건문 (0) | 2024.01.30 |
---|---|
[Kotlin] 타입추론과 함수 (1) | 2024.01.29 |
[Kotlin] 배열 사용법 (0) | 2024.01.28 |
[Kotlin] 변수의 자료형 (1) | 2024.01.25 |
[Kotlin] 변수(val, var) 초간단 정리 (0) | 2024.01.24 |