이번 포스팅에서는 Number, Any 자료형과 is, as 연산자를 통해
코틀린의 스마트 캐스트에 대해 알아보자.
스마트 캐스트?
프로그래밍에서 캐스팅이란 주로 형 변환을 뜻한다.
스마트 캐스트를 직역하면 똑똑한 형 변환이라 할 수 있다.
이는 컴파일러가 자동으로 형 변환을 해주는 행위를 뜻한다.
코틀린에서 스마트 캐스트가 어떤 상황에서 사용되는지,
또 어떤 방법으로 적용할 수 있는지 알아보자.
Number
Number 클래스는 숫자를 저장할 수 있는 특수한 자료형이며
대표적으로 스마트 캐스트가 적용되는 자료형이다.
Number 형으로 정의된 변수는 저장되는 값에 따라 자료형이 변한다.
스마트 캐스트가 적용되는 것을 확인해 보자.
var num: Number = 10
println(num)
num = 10.5 // Double 스마트 캐스트
println(num)
num = 10.7f // Float 스마트 캐스트
println(num)
num = 20L // Long 스마트 캐스트
println(num)
위 처럼 Number형으로 선언한 변수에는 다양한 숫자 자료형이 초기화될 수 있다.
결과)
컴파일도 잘 이루어진 것을 볼 수 있다.
재밌는 점은, 해당 변수에 마우스만 올려보아도 스마트 캐스트 문구를 확인할 수 있다는 것이다.
Number 자료형으로 선언했지만,
위 처럼 Double, Float, Long 자료형으로 스마트 캐스팅된 것을 확인할 수 있다.
이제 해당 변수의 값이 아닌, 자바의 자료형을 출력해본다.
var num: Number = 10
println(num.javaClass)
num = 10.5
println(num.javaClass)
num = 10.7f
println(num.javaClass)
num = 20L
println(num.javaClass)
결과)
정말 자료형이 변환된 것을 확인할 수 있다.
Any
Any 클래스는 코틀린의 최상위 기본 클래스로,
어떠한 자료형이라도 될 수 있는 특수한 자료형이다.
위에서 설명한 Number 클래스는 숫자 자료형만을 포함했다면,
Any는 모든 자료형을 포함하기에 더욱 상위 클래스인 것이다.
Number 탭에서 사용했던 예제와 비슷한 형식으로 테스트해보자.
var any: Any = 10
println(any.javaClass)
any = false
println(any.javaClass)
any = 'A'
println(any.javaClass)
any = "Hello"
println(any.javaClass)
결과)
모두 스마트 캐스트된 것을 볼 수 있다.
이제 Any 자료형을 is, as 연산자를 통해 스마트 캐스트해보자.
is 연산자
is 연산자는 비교 연산자와 같은 느낌으로 사용할 수 있으며
왼쪽 항의 변수와 오른쪽 항의 변수의 자료형이 같으면 true, 다르면 false를 반환한다.
var any: Any = "Oscar"
if (any is String) {
println("any is String")
}
// 출력 결과 : any is String
정확히는 자료형의 비교라기보다 클래스의 비교라고 할 수 있겠다.
is 연산자는 단순히 클래스의 비교 결과를 반환하는 역할 말고도
또 다른 중요한 역할을 한다.
해당 조건문의 범위(중괄호) 내에서 해당 객체를 캐스팅해주는 역할이다.
Any 형태일 때는 위 처럼 length 값을 찾을 수 없기에 에러를 표시하고,
is 연산자가 사용된 if문 내부에서는 String 클래스의 length 값을 호출할 수 있는 모습이다.
as 연산자
as 연산자는 위에서 알아본 is 연산자와 비슷한 기능을 수행한다.
is 연산자는 조건문 내에서만 캐스팅을 수행했다면,
as 연산자는 선언한 이후 시점부터 해당 클래스에 전역으로 캐스팅된다.
위 처럼, as 연산자를 사용해 String으로 캐스팅한 이후로는
String 클래스의 length 값을 호출할 수 있는 것을 확인할 수 있다.
Number · Any 자료형과 is · as 연산자를 통해
코틀린의 스마트 캐스트에 대해 알아보았다.
실무에서도 유용하게 사용할 수 있을 것 같다.
'Kotlin (코틀린)' 카테고리의 다른 글
[Kotlin] 코틀린의 for문 / in · .. · until · step · downTo · indices (0) | 2024.06.03 |
---|---|
[Kotlin] 클래스 · 자료형 이름을 내 마음대로 사용하기 / 클래스에 별명 붙이기 / 자료형에 별명 붙이기 (0) | 2024.06.02 |
[Kotlin] 문자열 이어 붙이기 / 형식화된 다중 문자열 사용하기 / ($, """) 기호 (2) | 2024.05.21 |
[Kotlin] 코틀린의 String 저장 방식은 다르다? (0) | 2024.05.20 |
[Kotlin] 코틀린의 참조 타입 → 원시 타입 변환 확인 / 기본형 · 참조형 자료형의 비교 원리 / 이중 등호와 삼중 등호 (==, === (2) | 2024.05.19 |