앱 개발/Kotlin

Nullable & NonNull

태기 2023. 2. 24. 13:54

<< git 소스코드 >>

1. Nullable

코틀린의 가장 큰 장점이라 할 수 있다.

자바로 코딩하다보면 빌드 할 때 NPE(Null Pointer Exception) 오류를 자주 접하게 된다.

오류가 나면 어디서 나는지도 찾아야하고 예외처리를 다 해줘야한다.

코틀린은 컴파일 단계에서 오류를 나타내주기 때문에 빌드할 때 NPE 오류를 접할 일이 없고, null 처리가 간편하다.

 

? (Nullable Type)

fun nullcheck() {
    var name = "taeki"
    var nameInUpperCase = name.uppercase()
    
    var nullName: String? = null
    var nullNameInUpperCase = nullName?.uppercase() 
}

변수를 선언할 때 null을 넣고 싶으면 ? 연산자를 써주면 된다.

 

위 두 줄은 평소에 쓰던데로 쓰는 방식이고 아래는 nullName이라는 변수에 초기화할 값이 없어서 null을 넣을 때 ? 를 선언해줬다.

 

nullNameInUpperCase는 nullName이 null이 아니면 uppercase 메서드를 적용하고, null이면 이 자체를 null로 반환한다.

 

?: (엘비스 연산자)

val lastName: String? = null
val fullName = name + " " + (lastName?: "NO lastName")
println(fullName)

 

만약 lastName이 null 이라면 "NO lastName"으로 대신 사용하라는 의미이다.

 

2. NonNull

!! (NonNull)

fun ignoreNulls(str: String?){
    val mNotNull: String = str!!
    val upper = mNotNull.uppercase()
    println("upper : ${upper}")
}

ignoreNulls 메서드는 Nullable 타입인 str을 파라미터로 받는다.

 

mNotNull 변수에 받은 str을 넣는데, 메서드를 호출할 때 str이 절대로 null일리가 없다고 하면 !!을 붙여서 사용한다. 말 그대로 null일 리가 없으니까 그냥 하면 돼! 라고 알려준다.

 

!! 연산자를 사용해서 upper 변수에서 mNotNull 뒤에 ?(Nullable) 연산자를 안 써도 된다.

 

 

+ let function

val email: String?= "taekiheoXXXX@nana.vom"
email?.let{
    println("my email is ${email}") // email 대신에 it 넣어도 가능
}

리시버 객체를 람다식 내부로 옮겨서 실행하는 구문이다.

 

Nullable인 email 변수를 선언했다.

 

email이 null이 아니면 let 함수 내부를 실행한다.