Kotlin (코틀린)

[Kotlin] 스마트 캐스트 - Number / Any / is 연산자 / as 연산자

Oscar:) 2024. 5. 26. 21:03

 

 

이번 포스팅에서는 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 연산자를 통해

코틀린의 스마트 캐스트에 대해 알아보았다.

 

실무에서도 유용하게 사용할 수 있을 것 같다.