본문 바로가기
Android/안드로이드 스터디(Kotlin)

Kotlin] 19. Nullable?

by 김마리님 2020. 12. 9.
import `object`.Person

fun main(args: Array<String>): Unit {
    println("start")
    var person : Person ? = Person("K", 30)
    
    var num : Int? = null
    num = 10
}

 

(아니 나 진짜 코틀린 너무 어려워 ㅠ 자바랑 똑같이 생긴줄 알았는데 아님)

 

 

자바는 기본적으로 nullable이다. 그런데 코틀린은 non - nullable이다(이런거 보면 자바보다 규칙이 빡빡한거 같은데)

함수가 다른 곳에서 값을 받아올 때, 우리는 이 함수 내부의 값이 null인지 null이 아닌지 알 수 없다.

코틀린에서 nullable이 아닌 변수에 값을 넣으면 컴파일 에러가 난다.

 

그러나 선언하는 타입 뒤에 ? 를 붙여주면 그 객체는 nullable이 된다

 

 


 

nullable 함수 속의 값들에 안전하게 접근하려면 참조변수에 ?를 붙여야 한다.

 

(점 사이의 컴파일 오류가 보이나?)

호출 처리를 붙이지 않으면 컴파일 에러가 난다. 오류를 보면

null을 수용할 수 있는 Person 타입은 안전하게 가거나 null이 아니라고 주장해야만 호출할 수 있다고 한다.

그럼 null을 수용할 수 있는 방법은 두 가지가 있는데

 

1. nullable이 되는 법

참조 변수 앞에도 ?를 붙여주는 방법이다.

(컴파일 오류가 사라진다)

2. not-null이라고 주장하는 법

!!를 붙여준다.

(여기도 컴파일 오류가 없다)

 두 가지의 차이점은 여기서 드러난다.

 

 

person이 null이라 선언된 상태에서 null을 수용가능한 ?. 연산자는 오류가 뜨지 않지만 단정 연산자인 !!. 은 오류를 발생시킨다.

 


 

그럼 내가 널인지 아닌지 어떻게 알아.. 이걸 해결하기 위해 ?: (앨비스 연산자) 가 있다.

fun main(args: Array<String>): Unit {
    val number : Int? = null
    println(number ?: "널이지롱")

    val number2 : Int? = 15
    println(number2 ?: 0)
}

 

만약 널이면 연산자 뒤의 값이 되고, 널이 아니라면 연산자 앞의 값을 리턴한다.

 

결과 :

 

널이지롱
15

 


 

특정 조건이 있으면 컴파일러는 변수를 자동 캐스팅 한다. 이걸 스마트 캐스팅이라고 한다.

예시를 보자.

 

package smartCasting

fun main() {
    val number: Int? = null
    val number2: Int? = 1225

    checkNull(number)
    checkNull(number2)

}

fun checkNull(any: Any?) {
    if(any == null){
        println("널이당")
        return
    }

    println(any.toString())
}

 

checkNull은 nullable 값을 받아 null일때와 아닐때의 값을 if로 판단해 각기 다른 함수를 만든다.

잘 보면 if로 null일 가능성을 완전히 배제한다. 그렇기 때문에 null이 아닐때 println 되는 값이 any?.toString일 필요가 없는 것이다. 절대 null이 들어올릴이 없으니 non-nullable 형태가 된다.

 

결과 : 

 

널이당
1225

 

반응형

'Android > 안드로이드 스터디(Kotlin)' 카테고리의 다른 글

Kotlin] 21. 다운캐스팅  (0) 2020.12.09
Kotlin] 20. is  (0) 2020.12.09
Kotlin] 18. Nothing  (0) 2020.12.09
Kotlin] 17. 오버라이딩  (0) 2020.12.09
Kotlin] 16. 상속  (0) 2020.12.09