반응형
Nullable / NonNull
- 출처 https://www.youtube.com/watch?v=IDVnZPjRCYg&t=8s [Code with Joyce]
- NPE: NULL pointer Exception
- 데이터 타입에 ?를 붙임으로서 null이 가능한 변수임을 명시적으로 표현
- 코틀린은 기본적으로 NonNull 타입
- ?. 연산자는 변수가 null 이 아닐때만 오른쪽 함수를 실행하고 null 이면 null을 반환
fun main(){
nullcheck()
}
fun nullcheck(){
var nullName : String = null // Null can not be a value of a non-null type String 에러발생
// ?를 사용하여 null이 가능한 변수임을 선언해야함
// nullName 이 null 이 아니면 .toUpperCase()를 실행하고 null 이면 null을 반환
var nullName : String? = null
var nullNameInUpperCase : String? = nullName?.toUpperCase()
//결과값 null
var nullName : String? = "kang"
var nullNameInUpperCase : String? = nullName?.toUpperCase()
//결과값 KANG
var name: String? = null
var nameInUpperCase : String = name.toUpperCase() // Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? 오류발생
}
- ?: 엘비스 연산자 고개를 옆으로 돌려서 보면 앞머리가 내려온 엘비스의 얼굴이....
- 변수에 값이 있을때는 해당값을 사용하고 null 경우는 default 값인 오른쪽 값을 사용
fun main(){
elvis()
}
fun elvis(){
val name: String = "EunWoo"
val firstName : String? = "Kang "
// firstName에 값이 있으면 해당 값을 이용하고 null 이면 No firstName 표기
val fullName :String = (firstName ?: "No firstName") + name
println(fullName) // Kang EunWoo
val firstName : String? = null
val fullName :String = (firstName ?: "No firstName ") + name
println(fullName) // No firstName EunWoo
}
- !! 연산자
- 해당 변수는 Null 이 절대 아니라는 뜻
- !!는 사용할때 조심해야함
fun main(){
ignoreNulls("kanginman")
}
fun ignoreNulls(str : String?) {
//파라미터 str 은 null 이 올수 없다라는 뜻
val mNotNull :String = str!!
val upper :String = mNotNull.toUpperCase()
println(upper)
}
// 결과값 KANGINMAN
- 만약 str 파라미터에 null 을 넘겨주면
fun main(){
ignoreNulls(null)
}
fun ignoreNulls(str : String?) {
//파라미터 str 은 null 이 올수 없다라는 뜻
val mNotNull :String = str!!
val upper :String = mNotNull.toUpperCase()
println(upper)
}
// 결과값 Exception in thread "main" kotlin.KotlinNullPointerException 오류 발생
- let 연산자
- not null인 경우 특정 구문을 수행
- let 함수는 자신의 receiver 객체를 람다식 내부에 전달
- 전달 받은 내용을 변수로 나타내거나 it으로 받아서 사용가능
fun main(){
let()
}
fun let() {
var email : String? = "fafd@gmail.com"
email?.let {
println("my email is ${email}") // 결과값 my email is fafd@gmail.com
}
// 넘겨받은 값을 it으로 받을 수 있음
email?.let {
println("my email is ${it}") // 결과값 my email is fafd@gmail.com
}
//만약 null 이라면 실행자체를 하지 않음
var email : String? = null
email?.let {
println("my email is ${email}")
}
// 결과값 실행되지 않음
}
'코틀린+안드로이드' 카테고리의 다른 글
11. class (0) | 2020.07.17 |
---|---|
10. for, while (0) | 2020.07.17 |
8. List, ArrayList (0) | 2020.07.16 |
7. Array (0) | 2020.07.16 |
6. 조건문 (0) | 2020.07.16 |