Kotlin 기초 - 널 가능성

안녕하세요 이번 시간에는 널 가능성에 관련해서 개꿀떡 해보겠습니다.


1. 널이 될 수 있는 타입

- 코틀린에서는 널 값을 포함하는 타입과 그렇지 않은 타입을 구분해야한다.

- 널이 될 수도 있는 값을 받는 함수는 물음표("?")를 붙여 지정

 

① vs Java

- Java에서는 모든 참조 타입은 널이 될 수 있는 타입이지만 코틀린에서는 널이 될 수없는 타입이다.

(Java에서는 null 전달이 가능하지만 NPE에러가 나옴)

 

 

② 예시

< 코드 >

package com.example.kotlinbase.Nullable

// 널 가능 파라미터 사용한 함수 예시
fun isOdd(iNumber: Int?): Boolean {
    // 반드시 null 값 처리
    if(iNumber == null) return false
    else return iNumber % 2 != 0

}

fun main() {
    val iNum1: Int = 11
    val iNum2: Int = 32
//    val iNum3: Int = null // ?가 없으면 널 불가
    val iNum3: Int? = null // ? 붙여 널 가능

    println(isOdd(iNum1))
    println(isOdd(iNum2))
    println(isOdd(iNum3)) // 파라미터가 널 가능이므로 사용 가능
}

 

< 결과 >

 

 

2. 널 가능성과 스마트 캐스트

- 널이 될 수 있는 값을 처리하는 가장 직접적인 방법은 조건문을 사용해 null과 비교하는 것이다.

- null에 대한 검사 로직을 추가하면 코틀린 기능인 "스마트 캐스트"로 인해 컴파일이 된다.

- 스마트 캐스트는 when이나 루프 같으 조건 검사가 들어가는 다른문이나 식에도 작동 한다.

- 널 검사로직과 사용 지점 사이에 값이 변경되면 스마트 캐스트가 작동하지 않는다.

 

예시

< 코드 >

package com.example.kotlinbase.Nullable

// 스마트캐스트 예시
fun sizeNumber(iNumber: Int?) = when (iNumber) {
    null               -> "NULL"
    in 0..10     -> "Small"
    in 11 .. 100 -> "Large"
    else               -> "Out of range"
}

fun main() {
    println(sizeNumber(null))
    println(sizeNumber(32))
    
    // 널 검사 이후에 널 검사한 변수가 변경 되었으므로 오류 발생 예시
    var sString = readLine()
    if(sString != null) {
        sString = readLine()
        // println(sString.length)
    }
}

 

< 결과 >

 

3.  널 아님 단언 연산자

- 널이 아닐 경우 "!!" 연산자를 사용하고 널이 될 수없다.

 

예시

< 코드 >

package com.example.kotlinbase.Nullable

// 널 아님 단언 예시
fun main() {
    var sName = readLine()!!.toString()
    println("내이름은 $sName 입니다.")
}

 

< 결과 >

 

4. 안전한 호출 연산자

- 널이 아닌 경우에는 동작을하고, 널인 경우에는 널을 반환하는 연산자는 "?." 이다.

 

 

예시

< 코드 >

package com.example.kotlinbase.Nullable

// 널 아님 단언 예시
fun main() {
    var sName = readLine()?.toString()
    println("내이름은 $sName 입니다.")

    // 위 ?. 연산자를 풀어 쓸경우 아래와 같은 식이 된다.
    var sName2 = readLine()
    if(sName2 != null) sName2.toString()
    else null

    println("내이름은 $sName 입니다.")
}

 

< 결과 >

 

5. 엘비스 연산자

- 널이 될 수 있는 값을 다룰 떄 유용한 연산자이고 "?:"을 사용한다.

- 왼쪽 피연산자의 결과가 널이 아닐경우 왼쪽 값이고 널일 경우 오른쪽 값을 의미한다.

- return, throw문 사용이 가능 하다.

- 연산 우선순위는 중위연산자와 비슷하고, 비교/동등 연산자 보다 우선순위가 높다.

 

예시

< 코드 >

package com.example.kotlinbase.Nullable

fun sayHello(name: String?) {
    // 엘비스 연산자 사용 예시
    println("Hello, ${(name ?: "이름모름")}")
}

fun main() {
    sayHello("개꿀떡")
    sayHello(null)
}

 

< 결과 >


이번 시간에는 코틀린에서는 Null과 관련되서 어떻게 타입을 처리하는지에 관해 개꿀떡 해보았습니다. 자바보다 코틀린을 사용하는 이유중하나인 NPE(NullPointException)을 피하기위해 사용하기 유용하다고 생각합니다. 감사합니다 :)

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유