코틀린 에서는 null 처리를 명확 하게 해야 합니다.
null이 올수 있는 곳엔 type에 ?을 붙임으로서 null이 가능함 변수임을 명시적으로 표현합니다.
fun printAllCaps(s: String?){
val allCaps: String? = s?.toUpperCase()
println(allCaps)
}
?. 연산자를 사용하면 앞의 변수가 null이 아닐때만 오른쪽 함수가 수행되고 null이면 null을 반환 합니다.
property 접근시에도 ? 연산자 사용이 가능하다.
class Employee(val name: String, val manager: Employee?)
fun managerName(employee: Employee): String? = employee.manager?.name
fun main(args: Array) {
val ceo = Employee("Da Boss", null)
val developer = Employee("Bob Smith", ceo)
println(managerName(developer))
println(managerName(ceo))
}
null 일 경우 default 값을 주고 싶은 경우 는 ?: 사용
fun getName(str :String?){
val name = str ?: "default값"
}
!! 이표시를 property나 변수에 붙이면 강제로 null이 아님을 선언하게 된다.
not null로 인식되어 처리 됩니다.
이렇게 해놓고 Null을 넣으면 에러가 발생
fun ignoreNulls(s: String?) {
val sNotNull: String = s!!
println(sNotNull.length)
}
not null 일때만 구문을 실행해 주는 let 함수를 제공 한다.
let 함수를 사용하면 자신의 receiver 객체를 람다식 내부로 넘겨준다.
fun sendEmailTo(email: String) {
println("Sending email to $email")
}
fun main(args: Array) {
var email: String? = "yole@example.com"
email?.let { sendEmailTo(it) }
email = null
email?.let { sendEmailTo(it) }
}
let 함수 내부에서 receiver객체를 it 으로 받아서 표현
따라서 email?.let{email -> sendEmailTo(email)}로 사용해도 됩니다.
?.를 사용하여 let 함수를 호출 했으므로 람다 내부에서 it은 null이 아닙니다.
또한 null이라면 let 람다 구문은 수행조차 안됩니다.