int strLen(String s) {
return s.Length();
}
코틀린 함수 작성 시 최우선 고려 사항 → “이 함수가 Null을 인자로 받을 수 있는가?”
// null을 인자로 받을 필요 없는 경우
fun strLen(s: String) = s.Length
Null이 될 수 있는 타입은 그 값에 대해 수행할 수 있는 연산의 종류가 제한됨
타입값의 메서드를 직접 호출할 수 없음
fun strLenSafe(s: String?) = s.Length()
// ERROR: only safe (?.) or non_null asserted (!!.) calls are allowed
// on a nullable receiver of type kotlin.String?
Null이 될 수 있는 값을 Null이 될 수 없는 값에 대입할 수 없음
fun main() {
val x: String? = null
val y: String = x
}
// ERROR: Type mismatch:
// inferred type is String? but String was expected
Null이 될 수 있는 타입의 값을 Null이 아닌 타입의 파라미터를 받는 함수에 전달할 수 없음
fun main() {
val x: String? = null
strLen(x)
}
// ERROR: Type mismatch:
// inferred type is String? but String was expected
fun strLenSafe(s: String?): Int =
if (s != null) s.Length else 0
fun main() {
val x: String? = null
println(strLenSafe(x))
// 0
println(strLenSafe("abc"))
// 3
}
null 가능성을 다룰 수 있는 도구가 if만 있다면 코드가 번잡해질 것임
코틀린은 이와 관련해 유용한 도구들을 제공함 (이후 다룰 예정)
📌 자바에서 Null을 다루는 도구
1. 어노테이션 (@Nullable, @NotNull)
2. Null값 대신 Null을 감싸는 Wrapper 타입 활용