Language/Kotlin

[Kotlin] Null Safety

moguogu 2022. 9. 13. 14:49

Nullable types and non-null types

코틀린은 null 참조 위험에 대비한다

예를 들어, Java언어의 경우에는 null 참조가 NullPointerException(NPE)를 불러일으킨다 

 

1. Regular variable 

기본적인 변수 선언 방식 

var a : String = "abc" //non-null 하게 초기화 된 변수 
a = null //이러한 경우 컴파일 에러가 발생함 

//////////

var b: String ? = "abc" // it can be set to null
b= null //ok
print(b)
//null이 출력됨 

//////////
val l = a.length //a는 non-null하므로 가능
val l = b.length //b는 null 하므로 컴파일 에러 발생

2. Safe Calls

?. 연산자를 사용하여 null인지를 확인할 수 있다 

/////////////
val a = "Kotlin"
val b: String? = null
println(b?.length)
println(a?.length)//불필요한 safe call -> a는 nullable하지 않기 때문에 ?.를 사용할 필요가 없음

////////////
person?.department?.head = managersPool.getManager()
//person또는 person.department가 null이면 해당 함수는 호출되지 않음

3. Elvis operator

nullable 한 참조를 해야하는 경우 -> b가 null일 때와 그렇지 않을때를 나눠서 정할 수 있음 

///////
//원래 작성하던 방식 
val l : Int = if(b!=null) b.length else -1

//elvis operator
val l = b?. length ?: -1
//b가 null인 경우 오른쪽 연산을(l= -1) not null인 경우 왼쪽연산 진행(l=b.length)

/////////
//함수 예시
fun foo(node: Node) : String ?{
	val parent = node.getParent() ?: return null
    val name= node.getName() ?: throw IllegalArgumentException("name expected")
}

4. The !! operator

!! 연산자를 사용해서 해당 값이 null인 경우 exception 발생 

val l = b!!.length
//b가 null인 경우 exception을 throw함

5. Safe casts

regular cast를 하는 경우 ClassCastException을 발생시키는 경우가 있기 때문에 safe cast를 사용하여 cast를 실패할 경우 null을 반환하게 함 

val aInt: Int?=a as? Int

6. Collections of a nullable type

val nullableList : List<Int?> = listOf(1,2,null,4)//null이 가능한 리스트
val intList : List<Int> = nullableList.filterNotNull()//nullableList에서 null만 빼고 받음

 

참조

https://kotlinlang.org/docs/null-safety.html#safe-casts

'Language > Kotlin' 카테고리의 다른 글

[Kotlin 기초]  (0) 2022.09.04