더북(TheBook)

||&& 연산의 오른쪽에서도 같은 일이 벌어진다.

fun isSingleChar(s: String?) = s != null && s.length == 1

스마트 캐스트를 실행하려면 대상 변수의 값이 검사 지점과 사용 지점 사이에서 변하지 않는다고 컴파일러가 확신할 수 있어야 한다. 특히 지금까지 살펴본 불변 지역 변수는 초기화 후 변경되지 않으므로 항상 제한 없이 스마트 캐스트를 쓸 수 있다. 하지만 널 검사와 사용 지점 사이에서 값이 변경되는 경우에는 스마트 캐스트가 작동하지 않는다.

var s = readLine() // String?
if (s != null) {
  s = readLine()
  // 변수 값이 바뀌므로 스마트 캐스트를 쓸 수 없음
  // error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
  println(s.length)
}

(객체의) 가변 프로퍼티에 대해서는 절대 스마트 캐스트를 적용할 수 없다. 일반적으로 언제든 코드의 다른 부분에서 프로퍼티 값을 바꿀 수 있기 때문이다. 8장 클래스 계층 이해하기에서 이런 규칙과 규칙의 예외를 자세히 설명한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.