4.2.2 널 가능성과 스마트 캐스트
널이 될 수 있는 값을 처리하는 가장 직접적인 방법은 해당 값을 조건문을 사용해 null과 비교하는 것이다.
fun isLetterString(s: String?): Boolean {
if (s == null) return false
// s는 여기서 널이 될 수 없다
if (s.isEmpty()) return false
for (ch in s) {
if (!ch.isLetter()) return false
}
return true
}
s 자체의 타입을 바꾸지는 않았지만 null에 대한 검사를 추가하면 코드가 어떤 이유에서인지 컴파일된다. 스마트 캐스트(smart cast)라고 불리는 코틀린 기능이 이런 일을 가능하게 해준다. 기본적으로 null에 대한 동등성 검사를 수행하면, 컴파일러는 코드 흐름의 가지 중 한쪽에서는 대상 값이 확실히 널이고 다른 가지에서는 확실히 널이 아니라는 사실을 알 수 있다. 그 후 컴파일러는 이 정보를 사용해 값 타입을 세분화함으로써 널이 될 수 있는 값을 널이 될 수 없는 값으로 타입 변환(cast)한다. 이런 기능을 스마트 캐스트라고 부른다. 앞의 예제에서 컴파일러는 s == null이 참인 경우 해당 가지가 return 문으로 끝나기 때문에 s == null을 비교하는 비교문 다음의 문장은 s가 널일 경우 결코 실행되지 않는다는 사실을 알 수 있다. 그 결과 변수 s를 널이 될 수 없는 String 타입으로 가정하고 나머지 함수 본문을 실행한다.