타입 시스템은 자바와 비교시 코드의 가독성을 향상시키는 데 도움이 되는 특성을 제공한다.
?
를 명시하면 된다.fun strLen(s: String) = s.length
// 인자로 null이거나 널이 될 수 있는 인자를 넘기기 불가능
// s는 항상 String의 인스턴스여야함.
fun nullableStrLen(s: String?) = s?.length // 널, 문자열을 인자로 넘기기 가능
<aside> 💡 어떤 타입이든 타입 뒤에 물음표를 붙이면 그 타입의 변수나 프로퍼티에 null 참조를 저장할 수 있다.
Type? = Type 또는 null
String?
= String
또는 null
</aside>
val x: String? = null
var y: String = y // 불가능
strLen(x) // 불가능
if(s != null) s.length else 0
코틀린은 널이 될 수 있는 타입을 구분하면 각 타입의 값에 대해 어떤 연산이 가능할지 명확히 이해할 수 있다.
실햄 시점에 예외를 발생시킬 수도 있고, 그런 연산을 금지시킬 수 있다.
<aside> 💡 실햄 시점에 널이 될 수 있는 타입이나 널이 될 수 없는 타입의 객체는 같다. → 모든 검사는 컴파일 시점에 수행된다.
즉, 코틀린은 널이 될 수 있는 타입을 처리하는 데 별도의 실행시점 부가 비용이 들지 않는다.
</aside>