null을 꼭 사용해야 하나요?
아직 코틀린이나 자바를 배운지 얼마 안된 개발자들은 Null이란 개념이 생소한 개념일 것입니다.
null이 항상 사용되는 것이 아니고 특정 상황에서 유용하기 때문에 사용합니다.
null을 사용하면 변수나 객체의 값이 없음을 나타낼 수 있습니다. 이는 어떤 값이 존재하지 않을 수 있는 상황을 더 유연하게 다룰 수 있게 해줍니다.
객체나 변수가 초기화되지 않았을 때, 그 값이 null이라면 이를 나타낼 수 있습니다.
값이 존재하지 않을 수 있는 상황에서는 nullable 타입을 사용하여 해당 값을 명시적으로 표현할 수 있습니다.
위의 내용만으로는 null을 알기 힘드니 자세히 알아보겠습니다.
null이 될 수 있는 type
null이 될 수 있는 type을 명시해주어야 합니다.
val str : String? = null
평범한 코드인 것처럼 보일 수 있지만 String 뒤에 ?가 붙어있는 것을 볼 수 있습니다.
위의 코드처럼 코틀린에서는 간단하게 null type을 명시할 수 있습니다.
그럼 ?을 붙임으로 null이 가능한 변수임을 선언하면 끝인가요?
nullable type의 처리
null을 처리하는 방법을 알아보겠습니다.
- Safe Call
null을 안전하게 처리하기 위해 코틀린은 ?. 연산자를 지원합니다.
fun printAllCaps(s: String?) {
val allCaps: String? = s?.toUpperCase()
println(allCaps)
}
위의 코드와 같이 nullable 타입을 처리하기 위해서는 null일 수도 있다는 표시를 해주어야 합니다.
때문에 위에서 설명했다시피 ?.을 사용해야 합니다.
코드로 ?.을 나타내면 다음과 같습니다.
if (s != null) s.toUpperCase() else null
해석하자면 S가 null이 아니라면 toUpperCase()라는 함수를 실행한다고 해석할 수 있습니다.
또한 여기서 왼쪽항이 null이면 바로 null을 반환합니다.
2.Elvis Operator
만약 null인 경우 default 값을 주고 싶은경우가 있습니다.이때 ?: 를 사용할 수 있습니다.
val l = b?.length ?: -1
위의 ?.는 코드로 다음과 같은 뜻을 가지고 있습니다.
val l: Int = if (b != null) b.length else -1
Elvis Operator는 우항으로 return이나 throw도 넣을 수 있습니다.
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ...
}
throw를 통해 강제로 exception을 발생시킬 수도 있습니다.
3.not null 처리
코딩을 하다보면 null이 절대 들어가지 않는 경우가 있습니다.
val l = b!!.length
!!을 사용해 null이 절대 들어갈 수 없다고 알렸으니 당연히 null이 절대!! 들어가면 안됩니다.
null이 들어갈 경우 NPE(Null Pointer Exception)이 발생합니다.
때문에 확실한 경우가 아니라면 !!사용은 권장되지 않습니다.
4.Safe Casts
as? 는 casting을 시도하고, casting이 불가능 하면 null을 반환합니다.
val aInt: Int? = a as? Int
as를 바로 사용하여 casting 할때 type이 맞지 않으면 ClassCastException이 발생합니다.
[Kotlin] 코틀린 null 처리 - ? ?. ?: !!, let, lateinit, 제너릭, 플랫폼 타입