Null 안전성
NullPointerException 예외가 발생하는 상황을 대폭 줄이기 위해, 기본 코틀린의 변수에는 null을 지정할 수 없게 되어있습니다. 만약 변수가 null이 될 수도 있게 하려면, 타입의 끝에 ?표시를 붙여 두어야만 합니다.
fun main() {
//sampleStart
var neverNull: String = "이 변수는 null이 될 수 없습니다" // 1
neverNull = null // 2
var nullable: String? = "이 변수는 null이 될 수 있습니다" // 3
nullable = null // 4
var inferredNonNull = "컴파일러 타입추론은 null-불가로 봅니다" // 5
inferredNonNull = null // 6
fun strLength(notNull: String): Int { // 7
return notNull.length
}
strLength(neverNull) // 8
strLength(nullable) // 9
//sampleEnd
}
- null-불가 문자열 변수를 선언했습니다.
- null-불가 변수에
null을 대입하려고 하면, 컴파일 에러가 납니다. - null-가능 문자열 변수를 선언했습니다.
- null-가능 변수에
null을 지정했습니다. 이건 문제없습니다. - 컴파일러가 변수 타입을 추론할 때는 null-불가 타입이라고 가정합니다.
- 컴파일러가 추론한 타입의 변수에
null을 대입하려면, 컴파일 에러가 납니다. - null-불가 문자열 파라미터를 받는 함수를 선언했습니다.
- null이 될 수 없는
String파라미터를 전달해 함수를 호출했습니다. 잘 됩니다. - 같은 함수를
String?타입의 파라미터로 호출하려고 하면, 컴파일 에러가 납니다.
Null을 다루는 방법
물론, 코틀린 프로그램에서 null을 써야 할 경우도 있습니다. 자바 코드와 소통해야 할 때나, 값이 없는 경우를 표현하려고 할 때 null을 쓰기도 합니다. 코틀린에는 그럴 때 우아하게 대처할 수 있는 기능이 있습니다.
//sampleStart
fun describeString(maybeString: String?): String { // 1
if (maybeString != null && maybeString.length > 0) { // 2
return "문자열 길이: ${maybeString.length}"
} else {
return "빈 문자열이거나 null입니다" // 3
}
}
//sampleEnd
fun main() {
println(describeString(null))
}
- null-가능 문자열 파라미터를 받아서, 길이를 설명하는 문자열을 반환하는 함수입니다.
- 주어진 문자열이
null이 아니고 빈 문자열도 아니라면, 그 문자열의 길이를 포함한 설명을 반환합니다. - 그 외에는, 주어진 문자열이 비었거나 null이라고 알려줍니다.