코틀린+안드로이드

9. Nullable / NonNull

으누아빠 2020. 7. 17. 13:25
반응형

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