1. 코틀린 Null이 허용된 변수 선언하기
보통 null이 허용된 변수라면 해당 변수에 아무것도 할당하지 않거나 null을 할당하고 사용할 경우 NullPointerException 일명, NPE가 발생하게 됩니다. 코틀린은 기본적으로 null을 허용하지 않고 null 허용 변수를 따로 만드는 방법으로 이 문제를 방지하고자 합니다. 😃
1.1. null 을 허용하지 않는 코틀린
아래 코드는 변수에 null을 할당하는 코드입니다. 코틀린에서는 이러한 방식은 에러입니다. 실제로 IDE 상에서 아래 코드를 입력해보면 빨간줄이 뜨는 것을 볼 수 있습니다.
fun main() {
var str1 : String = "Hello Kotlin"
str1 = null // Error!
println("str1: $str1")
//코드 밑에 이어서...
1.2. null 허용 변수 사용
그렇기 때문에 코틀린에서 변수에 null을 사용하고 싶다면 변수 타입 옆에 물음표(?)를 붙여서 null을 사용하겠다고 명시를 해주어야합니다. 아래 코드를 입력하면 정상적으로 실행가능한 것을 확인할 수 있습니다. 직접 해보세요.
var str2 : String? = "Hello Kotlin"
str2 = null
println("str2: $str2")
2. 세이프 콜 및 non-null 단정기호 사용하기
다음으로는 null이 허용된 변수 사용시 null 체크 방법에 관련된 방식 두 가지에 대한 예시입니다.
먼저 세이프 콜은 "?."을 사용하며 아래 코드는 str2가 null이 아닐 경우에만 멤버 length에 접근하는 예제입니다. 만약 stgr2가 null일 경우는 그대로 null이 반환됩니다.
두 번째 단정기호는 "!!."을 사용하며 null이 아님을 단정하고 컴파일을 강제할 수 있습니다. 하지만 실행 시 해당 단정기호를 사용하는 변수가 null일 경우에 NPE가 발생하게됩니다.
// 세이프 콜(?.), non-null(!!.) 단정 기호 사용
//println("str2 length: ${str2.length}") // 불가능
println("str2 length: ${str2?.length}") // null이 아니면 length 멤버에 접근 , null 이면 null
// println("str2 length: ${str2!!.length}") // null 아님을 단정. null 이어도 컴파일은 됨. but, 실행 중 NPE 발생
2.1. 조건문을 활용한 null 검사
다음은 조건문을 활용하여 null을 검사하는 코드입니다. 원래 null 검사를 하지 않는 경우 컴파일이 되지 않았지만, 조건문을 통해 null 검사를 해준 경우에 정상적으로 컴파일되는 것을 확인할 수 있습니다.
// 조건문 활용 null 허용 변수 검사
val len = if(str2 != null) str2.length else -1 // 조건문을 통해 null 검사 한 경우 컴파일 가능
println("str2: $str2, length: ${len}")
3. 엘비스(?:) 연산자 활용
다음은 세이프 콜과 엘비스 연산자를 함께 사용하여 null 허용 변수를 사용하는 코드입니다.😀
엘비스 연산자는 아래 코드에서 str2?.length 가 null 일 경우 -1을 사용(반환)하게 되며, null이 아닐 경우에는 str2?.length 값을 사용(반환)하게 됩니다. 즉, 원래 str2?.length 만 사용할 경우에는 str2가 null인 경우 null이 그대로 반환되지만, 엘비스 연산자를 추가하여 null인 경우 추가 처리를 하여 -1이 반환되도록 해줄 수 있는 것이죠.
// 세이프 콜, 엘비스(?:) 연산자 함께 활용
println("str2: $str2, length: ${str2?.length ?: -1}") // null 이면 -1 반환, null 아니면 str2?.length 반환
}
3.1. 전체 코드
아래 전체 코드와 출력 예시를 확인하시기 바랍니다.
package chap02.section3
fun main() {
var str1 : String = "Hello Kotlin"
// str1 = null // Error!
println("str1: $str1")
var str2 : String? = "Hello Kotlin"
str2 = null
println("str2: $str2")
// 세이프 콜(?.), non-null(!!.) 단정 기호 사용
//println("str2 length: ${str2.length}") // 불가능
println("str2 length: ${str2?.length}") // null이 아니면 length 멤버에 접근 , null 이면 null
// println("str2 length: ${str2!!.length}") // null 아님을 단정. null 이어도 컴파일은 됨. but, 실행 중 NPE 발생
// 조건문 활용 null 허용 변수 검사
val len = if(str2 != null) str2.length else -1 // 조건문을 통해 null 검사 한 경우 컴파일 가능
println("str2: $str2, length: ${len}")
// 세이프 콜, 엘비스(?:) 연산자 함께 활용
println("str2: $str2, length: ${str2?.length ?: -1}") // null 이면 -1 반환, null 아니면 str2?.length 반환
}
출력
str1: Hello Kotlin
str2: null
str2 length: null
str2: null, length: -1
str2: null, length: -1
Process finished with exit code 0
'Android > Kotlin' 카테고리의 다른 글
[Android] 코틀린(Kotlin) 코루틴(Coroutine) 한 번에 끝내기 (12) | 2021.06.22 |
---|---|
[Android] Room 사용하여 로컬 데이터베이스에 데이터 저장하기 (0) | 2021.05.05 |
[Kotlin] 코틀린 프로젝트 IntelliJ IDE 에서 GitHub 연동하기 (1) | 2021.04.14 |
[Kotlin] 인텔리제이(IntelliJ) new package, class 없는 경우 해결 (4) | 2021.04.14 |
[Kotlin] 코틀린 프로그래밍 환경 구성하기 (기초지식, JDK 및 IDE 설치) (0) | 2021.04.08 |