*저도 같이 배우는 입장이기 때문에 틀린 부분이 있을 수 있습니다.
댓글로 피드백을 주시면 확인 후 수정하도록 하겠습니다.

궁금하신 점은 댓글 혹은 메일로 문의주세요.
최대한 빨리 확인 후 답변드리도록 하겠습니다.

※ 모든 예시코드는 따라 작성하시는 걸 권장드립니다!!


Null이란

프로그래밍에서는 값이 없음을 나타내는 값이 있습니다.

이상하죠?

값이 없음을 나타내는 값이 있다니?

그 정체는 바로 null입니다.

null은 공백 혹은 0이 아닌 '아무것도 없음'을 뜻합니다.

val blank = "" //null x
val zero = 0 //null x

위의 예시 둘 다 null이 아닙니다.

null을 표현하기 위해서는 변수에 null을 할당해야 하는데요.

코틀린에서는 기본적으로 변수에 null을 할당할 수 없습니다.

ex)

fun main() {
    val num: Int = null

    println("num의 값: $num")
}

결과)

이는 코틀린이 자료형에 null을 허용하지 않기 때문인데요.

모든 변수는 자료형을 가지고 있고,
해당 자료형에 맞는 데이터만 할당할 수 있습니다.

즉, 위 예시코드에서 Int 자료형은 null을 허용하지 않기 때문에
변수에 null을 할당할 수 없는거죠.

이처럼 null을 허용하지 않는 자료형을 non-null이라고 합니다.


Non-Null

코틀린의 모든 자료형non-null입니다.

null을 허용하지 않는 이유는
아주 문제가 많은 친구이기 때문이죠.

오죽하면 null의 개념을 고안해낸 토니 호어가
10억달러짜리 실수라고 했을까요.

자바는 세계에서 가장 많이 사용하는
프로그래밍 언어 중 하나인데요.

자바로 코딩을 하면서 가장 많이 접할 수 있는 오류가
바로 Null Pointer Exception입니다.

저도 자바로 안드로이드 개발을 하면서 참 많이 접했는데요.

이 문제는 많은 프로그래머들을 괴롭혀왔고,

때로는 변수의 값이 null인지 확인하는
'null 체크'는 프로그래머들의 실력을 판단하는 지표가 되기도 합니다.

때문에 코틀린에서는 이 문제를 원천적으로 해결하고자
기본적으로 자료형에 null을 허용하지 않습니다.


NPE란

그렇다면 Null Pointer Exception이란 무엇일까요.

보통 줄여서 NPE라고 하는데요.

NPE값이 null인 변수참조할때 발생하는 에러입니다.

이를 이해하기 위해선 일단 변수가 어떻게 동작하는지 알아야하는데요.

최대한 이해하기 쉽도록 간단히 설명하겠습니다.

프로그램을 실행하면 RAM에 프로그램이 저장됩니다.
(보통 올라간다고 표현합니다.)

우리는 그 과정을 '로딩'이라고 부르죠.

RAM에는 4가지 영역이 있습니다.

이미지출처: https://zangzangs.tistory.com/107

우리가 주목해야 할 부분은 heap과 stack영역입니다.

0000000000
0000000000
0000000000
0000000000
0000000000
0000000000

ㄴ heap 영역

위 표는 heap 영역을 시각화 한 표입니다.

네모 박스마다 하나의 데이터가 저장될 수 있다고 가정하겠습니다.

우리가 변수를 선언하면 네모 박스에 데이터가 저장됩니다.

val name = "코틀린"
코틀린000000000
0000000000
0000000000
0000000000
0000000000
0000000000

ㄴ heap 영역

데이터heap 영역에 저장되고 변수stack 영역에 저장됩니다.

name000000000
0000000000
0000000000
0000000000
0000000000
0000000000

ㄴ stack 영역

변수의 역할은 데이터를 저장하는 게 아닌 '참조값'을 저장하는 것입니다.

'참조값'이란 데이터가 heap 영역의 어디에 있는지 알려주는 값입니다.
(보통 변수가 데이터를 가르킨다고 표현합니다.)

변수의 함수를 호출하거나, 데이터를 불러올때
'참조값'을 '참조'하여 데이터를 불러오기 때문에 이를 '참조 변수'라고 합니다.
(코틀린의 모든 변수는 참조 변수입니다.)

조금 복잡하죠?

짧게 요약하겠습니다.

  1. 변수를 선언하면 heap 영역에 '데이터'가 저장됩니다.
  2. 변수는 stack 영역에 저장됩니다.
  3. 변수는 heap 영역에 저장된 데이터를 가르킵니다.

이때, 변수가 어떠한 데이터도 가르키지 않는다면 변수의 값은 null이 됩니다.

그 변수의 함수를 호출하거나, 데이터를 불러오려고 시도한다면
가르키는 데이터가 없기 때문에

'Null' 'Pointer' Exeption이 발생하게 되는 것입니다.
(Exception은 에러라고 생각하시면 됩니다.😏)


요약

  • null은 값이 없음을 뜻한다.
  • 변수에 값이 없음을 나타내기 위해서는 null을 할당해야 한다.
  • 코틀린은 자료형에 null을 허용하지 않는다.
  • 값이 null인 변수를 참조하면 NPE가 발생한다.

profile
코틀린 설명충

0개의 댓글