Backend 언어/Kotlin

코틀린에서의 Null Safe 처리

민초부 2020. 10. 17. 17:17
반응형

 - 다른 글에서도 계속 말하지만 코틀린은 Null을 기본적으로 허용하지 않는다.
   모든 변수, 속성에 대해 default로 Nonnullable로 되어 있으며 ?를 통해 nullable 선언을 따로 해주어야 한다.

var nullableVariable: String? = "dlwlrma"
var nonNullableVariable: String = "dlwlrma"

nullablevariable = null 

nonNullableVariable = null // 컴파일 에러

 

-  nullableVariable 과 같은 nullable instance 안의 property나 function을 사용하려고 하면 
    if(nullableVariable != null) 로 확실하게 잡아주고 사용해야 컴파일에러가 나지 않는다.  
    진짜 null이 발생할 일이 없는데 매번 이렇게 if로 잡아주면 코드가 너무 길어진다 그래서 아래의 방법들이 있다 

  • ?.   : null safe operator (Ex. nullableVariable?.upperCase() )
    • 이렇게 하면 nullableVariable이 진짜 null이면 그냥 패스해버린다
  • ?:    : elvis operator (Ex. nullableVariable?:"defaultText")
    • nullableVariable이 null이면 defaultText로 대체된다. 
  • !!.   : non-null assertion operator (Ex. nullableVariable?.upperCase())
    • 컴파일 할 때만 null체크를 하지 않는 방식. 이러면 nullableVariable이 Null이면 upperCase()에서 NPE가 떨어진다.
    • 이래서 !!는 최대한 지양하라고 하는듯 
  • 응용

- safe_cast

val StringVariable: Any = "dlwlrma"
val safeString: String? = string as? String
val safeInt: Int? = string as? Int

println(safeString) // dlwlrma 
println(safeInt) // null

> as? 는 safe cast로 형변환할 때 Type이 맞지 않는 경우 null을 return함 이 때 as?를 쓰면 nullable이 되기 때문에 좌항의 type에도 ?를 넣어줘 둘다 nullable로 만들어 준다. 

 

 - collection null 제거 : collection에 있는 null 요소들을  미리 제거하는 함수도 제공하고 있음 

val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()

 

 

 

  • 최대한 NPE를 피하는 방법 (음.. 단순 참고용 이건)
    • 최대한 String 값으로 비교를 해라 (String comparison with literals)
    • Avoid returning null from yout methods 
    • keep checking on arguments of methods 
      • Param, Return Type 선언할 때 체크를 잘 해줄 것 (이게 제일 내가 약하다)
    • Use String.valueOf() rather than toString()
      • 이건 자바에서 equals를 통해 비교할 때 변수를 뒤에 넣어주는 그런 개념인듯
    • Avoid chained method calls 
반응형

'Backend 언어 > Kotlin' 카테고리의 다른 글

객체에 관하여  (0) 2020.10.17
변수에 관하여  (0) 2020.10.17
Class에 관하여  (0) 2020.10.11
고차 함수  (0) 2020.10.11
접근 범위와 접근 제한  (0) 2020.10.11