본문 바로가기

개발/Kotlin & Java

코틀린 Kotlin 다루기 (3) - Nullable, Non-Null

반응형

Nullable, Non-Null

저번 시간에서는 자료형에 대해 알아보았습니다.

자료형에는 빈 값이 들어갈 수가 있으며 이를 null이라고 칭합니다.

Java에서는 null이 들어가면서 발생하는 오류(예외)를 NullPointerException이라고 합니다. 반면 Kotlin에서는 따로 정해진 null 예외처리가 없으며 기본적으로 변수에는 null 값이 들어갈 수 없습니다.

Nullable

그럼 Kotlin에서 변수에 Null 값을 넣으려면 어떤 방법을 써야 하는지 알아봅시다.

시작하기 앞써 NullSafety 이름을 가진 Kotlin 파일을 만들어주고 진행하겠습니다.

fun main() {
    var text: String = "문자열"
    text = null
}

지난 시간에 잠깐 나온 String 자료형을 써보았습니다.  (자료형은 생략이 가능합니다. 여기서는 강좌 진행을 위해 사용하였습니다.)

 

Char은 'A', 'B'와 같이 글자 한 개를 담을 수 있다면, String은 위 코드와 같이 여러 글자를 담을 수 있습니다.

위 코드를 실행하면 오류가 뜨거나 IDE에서 오류가 표시되는 모습을 볼 수 있습니다.

 

Null can not be a value of a non-null type String

Kotlin은 기본 적으로 변수에 null 값을 넣을 수 없기 때문에 나오는 오류입니다.

 

변수에 null을 넣기 위해 ?(물음표) 문자를 사용해보겠습니다.

위에서 작성한 오류나는 코드에서 자료형 부분을 고쳐보겠습니다.

fun main() {
    var text: String? = "문자열"
    text = null
}

String 뒤에 ?(물음표)를 붙이니 오류가 없어집니다.

? 는 변수에 null을 넣을 수 있다(Nullable)라는 것을 의미합니다.

 

앞으로는 변수에 null을 넣을 수 있다는 의미로 Nullable이라는 단어를 사용하겠습니다.

안전하게 Null 사용하기

위에서 사용한 코드를 확장해서 아래와 같이 써봅시다.

fun main() {
    var text: String? = "문자열"
    text = null
    
    val text2: String = "Null이 아님"

    print("${text.length}\n")
    print("${text2.length}\n")
}
변수이름(String자료형).length는 문자열에 길이를 나타냅니다.
위 코드에서 text2 문자열은 띄어쓰기 포함 8글자이므로 text2.length 는 8을(를) 나타냅니다.

해당 상태에서 실행을 하게 되면 text.length 부분에서 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? 이러한 오류를 볼 수 있습니다.

 

변수를 Nullable 상태로 만들어줬기 때문에 해당 변수를 사용하는 코드 또한 null 값이 올 수 있음을 알려줘야 합니다.

fun main() {
    var text: String? = "문자열"
    text = null

    val text2: String = "Null이 아님"

    print("${text?.length}\n")
    print("${text2.length}\n")
}

// 실행결과
// null
// 8

null 값이 올 수 있음을 알려주기 위해서는 변수에 사용해줬던 것처럼?(물음표)를 사용해주면 됩니다.

위 코드를 실행하면 정상적으로 작동하는 것을 볼 수 있습니다.

Null이 들어간 변수를 출력하면 항상 Null만 나올까?

이번에는 변수명? 사용 시 null일 경우 다른 문자가 출력되게 해봅시다.

var l = text?.length ?: "Null입니다!"
print("$l\n")

// 실행결과
// Null입니다!

코드 뒤에 ?: <null 상태일 시 출력하는 문구>를 사용해주면 됩니다.

<> 안에는 문자(열), 숫자, 논리형 모두 가능합니다.

값이 Null이라면 오류(예외)를 나오게 하자

변수가 null이라면 null를 출력하는 것이 아닌 오류를 발생하여 프로그래머에게 알려줄 수도 있습니다.

이 역시 간단하게 사용할 수 있습니다.

fun main() {
    var text: String? = "문자열"
    text = null

    val text2: String = "Null이 아님"

    print("${text!!.length}\n")
    print("${text2.length}\n")
}

// 실행결과
// Exception in thread "main" kotlin.KotlinNullPointerException

?(물음표)가 아닌 !!(느낌표 두 개)를 사용해주면 됩니다.

!!를 사용해주면 변수가 null일 시 KotlinNullPointerException 오류(예외)를 발생시킵니다.

Non-Null

변수에는 기본으로 null이 들어올 수 없으니 따로 만져주지 않는다면 해당 변수는 Non-Null입니다.

 

마무리

이번 강좌에서는 Null에 관하여 알아보았습니다.

오타 발견 또는 피드백은 댓글로 남겨주세요.

감사합니다 :)

반응형