null (널)
함수의 진화B를 다루기 앞서 type(타입, 형) 검사에 대해 알아본다.
변수를 선언할 때 아래 처럼 변수명, type(형)을 콜론으로 구분하여 정의한다는 것을 알았다.
아래 코드를 입력 해 보자.
그런데 빠진것이 있다.
위 변수 nullTest는 현재 값(value)이 없는 상태다.
이 처럼 변수에 값을 정하지 않거나 없는 경우가 있을 것이다.
이렇게 ‘값이 없는 상태’를 null(널)이라고 한다.
코틀린은 변수를 사용할 때 반드시 값이 할당되어 있어야 한다.
즉, null을 허용하지 않는다.
이제 변수(nullTest)에 문자열 값을 넣어서 초기화 한다.
초기화(initialization)는 변수를 처음 선언할 때 값을 넣는 것이다.
초기화를 나중에 하는 lateinit 과 lazy 라는 것도 있다.
다음에 배울 기회가 있을 것이다.
어쨌든 위 코드의 현재 상태는 변수 nullTest에 문자열(String) “not null” 이 저장되어 있다.
NullPointerException
프로그램이 작동하다가 값이 없는 상태에 부딪히면 에러가 난다.
이 에러를 NullPointerException (널 포인터 예외) 이라고 한다.
이런 에러는 프로그램이 종료되거나 시스템이 망가지는 원인이 되기도 한다.
이런 상황은 회사의 경우 수 십억 이상의 손해를 끼칠 수도 있는 문제이므로 프로그래머들에게는 가장 골칫거리 중 하나라고 한다. 그러므로 에러가 나지 않도록 항상 주의하고 조심해야 한다.
이번에는 변수 nullTest에 null을 넣은 후 실행 해보자.
null은 값이 없는 상태를 나타내는 값으로 쓰인다.
에러 메시지가 뜬다.
에러 내용은 다음과 같다.
“Null은 null을 허용하지 않는 타입인 String의 값이 될 수 없다.”
# non-null: null을 허용하지 않는
null을 허용하려면 어떻게 할까?
null을 허용하려면 타입 String뒤에 ? 를 붙이면 된다.
null을 허용하지 않는다고 하는데 왜 굳이 허용하는 ?를 만들었나?
만일의 에러 사태에 대비하는 것이다.
null을 허용한다는 뜻은 변수의 값에 아무것도 없는 상태가 될 수도 있다는 것을 알려주는 것이다.
어쨌든 String에 null을 허용한 후 실행 해 보자.
일단 에러 메시지는 나타나지 않는다.
출력해서 확인 해보자.
'변수 값을 출력'하라는 아래 코드를 입력해서 실행 해 보자.
null값이 들어 있는데 문자열이 출력되었다.
이것은 null이 발생해도 에러를 피하기 위해 String으로 추정해서 “null”을 출력하는 것 같다.
이번에는 읽기 전용 변수(val)인 length를 이용해 본다.
length는 '문자의 길이(개수)'를 확인해서 그 결과를 Int값으로 반환한다.
호출하려면 앞에 마침표( . )를 붙이면 된다.
println(nullTest.length)
null을 큰따옴표로 감싸서 문자열로 만들고 실행해 보자.
문자열 null의 문자 개수를 Int값으로 보여준다.
이제 다시 null상태로 만들고 실행해 보자.
앞에서는 null을 허용한 후 에러를 회피하는 방법으로 해결했는데
이번에는 다른 변수를 불러온 상황이 되었다.
즉, 아무것도 없는 값(null)의 문자 길이를 반환 받아서 출력해야 하는 상황이다.
코드를 짤 때 지금과 같은 상황에서 에러가 많이 발생한다.
코드에서 length앞 점( . )에 에러가 표시된다.
실행 후 메시지는 다음과 같다.
“null 허용한 String에는 안전하게 하려면 ?를 붙이거나, 'null 아님'을 확인하려면 !!를 붙이는 2가지만 할 수 있다.
첫번째 방법에 따라 변수명 다음에 ?를 붙여서 실행 해보자.
null값의 문자 길이를 출력하려고 하니 에러가 나겠지만 안전하게 문자열을 출력하는 것 같다.
이번에는 !!붙여서 실행 해보자.
드디어 에러다운 에러가 뜬다.
에러 첫줄에 KotlinNullPointerException(코틀린 널 포인터 에러)가 선명하다.
위 코드는 null인데 null이 아니라고( !! )우기니까 널포인터에러가 난 것이다.
어쨌든 코틀린은 원칙적으로 null(값이 없는 상태)을 허용하지 않고 NullPointerException (널포인터예외) 에러를 방지하기 위한 다양한 회피 방법을 준비해 둔 것 같다.
널포인터예외 에러 방지는 다음에 알아볼 함수형 프로그래밍에서도 필수적인 개념이므로 이번글에서 간단하게 살펴보았다.
끝.
'프로그래밍 언어 > 코틀린_쌩초보를 위한 기초' 카테고리의 다른 글
쌩초보를 위한 기초_13_함수의 진화C (0) | 2020.03.13 |
---|---|
쌩초보를 위한 기초_12_함수의 진화B (0) | 2020.03.13 |
쌩초보를 위한 기초_10_함수의 진화A (0) | 2020.03.11 |
쌩초보를 위한 기초_09_범위_scope (0) | 2020.03.10 |
쌩초보를 위한 기초_08_변수형_String (0) | 2020.03.09 |