이번에 다뤄볼 주제는 Null이다.
Null이란 값이 존재하지 않음을 나타내는 특별한 상태이다. 말이 좀 어려운데 ㅋㅋㅋㅋ 사실 0아닌가 ?라는 생각이 드는데
0은 정확히 type이 정수형인 0이라는 숫자니까 또 그거는 아닌거같긴하다. 그리고 Null들의 가장 큰 특징은 사칙 연산이 불가능 하다는 점이다.
다른 언어에서는 Null이 포함된 변수를 다루는 과정에서 발생하는 오류로 인해 코드가 취약해질 수 있고, 이로 인한 버그를 방지하고 안전성을 높이기 위해 Kotlin은 Null Safety라는 방안을 도입했다고 한다. 얘가 뭔지는 슬슬 알아보자.
우선 변수는 Nullable과 Non-Nullable Type이 있는데, 말 그대로 Null이 될 수 있는 것과 없는 Type으로 나뉜다고 생각하면 된다.
-val number : Int? = null -> null이 들어오는 것이 가능
-val number : Int = null -> null 불가능
위에 [자료형] 부분에 Int? 는 Int는 당연히 받아주고! 값이 존재하지 않는 Null도 ㄱㅊ 이런 느낌
그런데 그냥 Int 이렇게만 되어있으면 그냥 단호하게 난 Int만 받겠다라고 주장하는 것.
여기서 Non nullable 변수는 항상 값이 있음을 보장해주기 때문에 ( 즉 Null이 아니라는 것을 확실히 보장해주기 때문에) 코드의 안전성을 높일 수 있다. 근디 이는 변수를 초기화하는 시점이 중요함을 의미하고, 초기화되지 않은 Non-Nullable 변수를 사용하려고 하면 컴파일 오류가 발생하게 될 수 있다. Non-Nullable 변수를 사용할 때는 초기화에 주의해야 한다.
val number1 : Int? = null
val number2 : Int = null
println(number1)
println(number2)
error: null can not be a value of a non-null type Int 다음과 같은 Error가 발생하게 되고
non null int type에 null 값을 넣어버리니 Error가 발생하게 된 것이다.
[Example Code]
val num1:Int=2+5
val num2:Int=10
val num3:Int=num1+num2
println(num3)
얘는 딱히 아무 문제가 없다, num1 num2는 확실히 int인게 보장되어 있기 때문에
num3 입장에서도 아 ~ 확실히 num1 num2는 Int니까 그냥 더하면 된다! 라고 생각할 수 있는거다
var number2 : Int? = 3+5
var number3 : Int? = 10
var number4 : Int? = number2+number3
println(number4)
반면 얘는 number2 3 은 확실히 nullable int이다. 하지만 우리는 알고 있다
number2은 8이고 numer3은 10인 것, 즉, 확실히 Integer의 값을 가지고 있다는 걸 알고 있다.
하지만 number4 입장에서는 nullable 변수를 연산하는 것은 부담이다. 얘가 null일수도 있는데? 덧셈 연산을 해도되나 ?
라는 생각에 Error를 뱉어버린다.
여기서 우리는 확실히 number2,3 이 null이 아니란걸 알고 있는데
그럼 우리가 보증을 설 수 있다. 얘내들 절~대로 Null아니니까 걱정하지 마라 라는 뜻으로
val number5 : Int? = 3+5
val number6 : Int? = 10
val number7 : Int? = number5!!+number6!!
println(number7)
바로 변수 이름 뒤에 !!를 붙여주는 것인데, number5는 nullable 이지만 뒤에 !!를 붙임으로써 non-null이 보장되는 것이다.
이 때는 정상적으로 18이 출력된다.
근데 만약에 개발자가 보장을 했는데, 까보니까 Null이라면 ??
val number5 : Int? = null
val number6 : Int? = 10
val number7 : Int? = number5!!+number6!!
println(number7)
NullPointerException이 발생하게 된다.
Null이라는 것은 값도 표현하지만 , 상태도 표현한다.
if(null==null) // == 상태끼리의 비교 연산은 가능하다.
{
println("same")
}
else{
println("not same")
}
if(null==5) // == 값과 비교 연산도 가능하다.
{
println("same")
}
else{
println("not same")
}
[Result]
same
not same
첫번째 if ~else 문을 보면 null == null이 true라는 것을 알 수 있다.
존재하지 않는 그 상태가 서로 서로 동일하다는 뜻이며, true가 되는 것이다.
그리고 null은 값과도 비교가 가능한데, 5와 비교했을 때에는 true가 아니여서 not same이라는 문구가 출력된다.
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin 뿌시기](5) 흐름제어 (0) | 2023.12.27 |
---|---|
[Kotlin 뿌시기](4) 메소드 (1) | 2023.12.27 |
[Kotlin 뿌시기](3) 연산자 (1) | 2023.12.26 |
[Kotlin 뿌시기] (1) 변수와 자료형 (2) | 2023.12.23 |