자료형 검사하고 변환하기

Seongkwon Kim·2020년 6월 25일
0

Kotlin

목록 보기
2/3
post-thumbnail

코틀린은 변수를 사용할때 반드시 값이 할당되어 있어야 한다는 원칙이 있습니다. 만약 값이 할당되지 않은 변수를 사용하면 코틀린에서 오류가 발생합니다. 한편 값이 없는 상태는 null이라고 부릅니다. 코틀린에서 null 상태인 변수를 허용하려면 물음표(?) 기호를 사용해 선언해야 합니다. 물론 null을 허용하는 변수를 사용하려면 null을 검사하고 처리하는 방법까지 고려해야 합니다. 또한 필요하면 자료형을 변환할 수도 있습니다.

변수에 null 할당하기**

var str1 : String = "Hello Kotlin"
str1 = null // 오류!! null을 허용하지 않음

//print
Error:(29, 12) Kotlin: Null can not be a value of a non-null type String

null을 허용하려면 자료형 뒤에 물음표(?) 기호를 사용해야 한다.

var str1: String? = "Hello Kotlin"
str1 = null
println(str1)

null을 허용하면 length가 실행될 수 없습니다.

var str1: String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1.length}") // null을 허용하면 length가 실행될 수 없음

Intellij를 사용할 경우 아래와 같은 경고 메세지를 볼 수 있습니다. Only safe (?).or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e5d79ccb-7cc0-4446-9eac-d99944930278/length.png

String? 형에서는 세이프콜(?.)이나 non-null 단정기호(!!.)만 허용한다는 팁을 볼 수 있습니다. 즉 null인 str1에 length에 접근하려면 이 2가지 기법중 하나를 사용해야 합니다.

var str1: String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1?.length}") // str1을 세이프 콜로 안전하게 호출
println("str1: $str1 length: ${str1!!.length}") // str1을 NPE(Null Point Exception) 발생 단 컴파일은 가능

먼저 세이프콜로 호출할 경우에는 정상적으로 실행이 가능합니다. 세이프콜의 경우 str1을 검사한 다음 null이 아니면 length에 접근해 값을 가져옵니다. (null 일경우 null 이 출력됨)

non-null 단정 기호(!!.)를 사용할 경우 변수에 할당된 값이 null이 아님을 단정하므로 컴파일러가 null 검사 없이 무시합니다. 따라서 변수에 null이 할당되어 있어도 컴파일은 잘 진행됩니다. 하지만 실행 중에 NPE를 발생시킵니다.

세이프 콜과 엘비스 연산자를 활용해 null을 허용한 변수 더 안전하게 사용하기

null을 허용한 변수를 조금 더 안전하게 사용하려면 세이프 콜?.과 엘비스(Elvis)연산자 ?:를 함께 사용하면 됩니다. 엘비스 연산자는 변수가 null인지 아닌지 검사하여 null이 아니라면 왼쪽 식을 그대로 실행하고 null이라면 오른쪽 식을 실행합니다.

var str1 : String? = "Hello Kotlin"
str1 = null
println("str1: $str1 length: ${str1?.length ?: -1}")

위의 표현은 아래와 동일하게 표현할 수 있습니다.

if (str1 != null) str1.length else -1

0개의 댓글