본문 바로가기
Kotlin

코틀린의 스마트 캐스트(Smart cast)란?

by 서퍼리노 2023. 1. 21.
728x90

코드를 작성하다 보면 형태를 바꿔야 하는 일이 굉장히 많습니다.

널 허용 타입을 연산하기 위해 !!를 사용한 모습

예를 들면 널 허용 타입의 변수를 사용하기 위해

변수의 뒤에 (.!!)를 지정해 주며 널 허용 타입이 아닌 기본 타입에서 제공하는 기능을 사용하는 등

 

굉장히 자주 형태를 변환해야 하는 경우가 생긴다.

 

하지만 이럴 때마다 프로그래머가 관리를 해주는 것은 굉장히 불필요한 일입니다.

 

따라서 코틀린에는 스마트 캐스트(Smart cast)라는 것이 있습니다.

 

짧게 설명하자면, 프로그래밍을 할 때 프로그래머가 모든 형태를 지정하지 않고도,

각 블록에 따라서 컴파일러가 알아서 캐스팅해 주는 것을 말합니다.

 

글로만 보자면 조금 이해하기에 어려움이 있을 듯하여 예제와 함께 살펴봅시다.

 

널 체크

 

코틀린을 사용할 때

널 허용 타입을 아무런 검사도 하지 않고 연산하면

문제가 생길 수 다는 것은 누구나 알고 있을 것이다. 

아래와 같은 코드처럼 널 허용 타입이라고 해도 초기화와 함께 값이 지정되어 있고,

예제 코드처럼 프로그램의 사이클동안 변하지 않는 코드일 경우에는 크게 상관없지만,

 

실제 프로그램의 코드를 작성할 경우에는 그렇지 않다.

 

null이 충분히 들어갈 수 있는 상황에서 null이 연산에 들어감으로써

프로그래머의 실수로 프로그램이 종료될 수 있다. 

 

따라서 위의 예제코드처럼 null을 체크해 주는 것이다.

 

하지만 위의 예제 코드처럼 코드를 작성하게 되면 !!에 경고가 뜨게 된다.

 

경고의 내용은 널이 들어갈 수 없는 타입인 Int 타입에 non-null임을 단정해줄 필요가 없다는 것이다.

 

위의 경고에 따라 코드를 수정하면 이런 식으로 코드가 수정되게 된다.

이런 식으로 코드를 수정하라고 제안하고 있다.

 

흐음...

분명 처음에 null이 들어갈 수 있도록 널 허용 타입으로 지정해 주었다.

 

하지만 해당 분기(if) 문 내부에서는 Int로 사용되고 있었다.

저 분기문으로 감싸진 부분은 애초에 b가 null이라면 분기문이 작동되지도 않는다.

 

따라서 

코틀린에서는 스마트 캐스트라는 기능으로 이를 편리하게 관리해 주고,

이를 만약 개발자가 확인하지 못했더라도,

 

IntelliJ IDEA에서는 이를 블록별로 확인해 준다.

 

여기서 블록은 

 

위처럼 분기문이나 코틀린 스코프 함수 등으로 감싸진 경우를 뜻합니다.

 

정리

코틀린에서는 스마트 캐스트라는 기능이 있는데

이는 변수의 타입을 검사한 후에 굳이 다시 캐스팅 하지 않아도,

그 블록 안에선 원하는 타입으로 선언된 것처럼 사용할 수 있습니다.

 

또한 실제로는 컴파일러가 캐스팅을 수행해줍니다.

728x90