Kotlin null, nullable 타입
Notepad96
·2020. 9. 23. 23:02
1. nullable 타입 ?
Java에서는 참조 타입의 null을 넣을 수 있었다.
하지만 코틀린은 Int, Double, String 처럼 기본 타입도 참조 타입이지만, 모두 기본적으로 non-nullable 타입으로서 null을 가리킬 수 없다.
null을 사용할 수 있게하기 위해서는 nullable 타입으로 정의해야하며 타입 뒤에 '?'를 붙인다.
//var a:Int = null
var a:Int? = null
println(a)
2. 안전한 호출 연산자(Safe call operator) ?.
만약 변수를 nullable하도록 만드면 변수는 null을 갖을 수 있게 된다.
그렇다면 의도치 않게 클래스 참조 변수가 null을 갖고 있는 상태에서 프로퍼티나 멤버 함수의 접근하고자 시도할 수도 있다.
참조 변수는 null을 갖고 있지만 이러할 경우 에러가 발생하게 된다.
이러한 경우 사용하는 것이 Safe call operator으로서 참조 변수가 null을 갖고 있는 경우 프로퍼티나 멤버 함수의 접근하고자 하면 null을 건네준다.
class Book(var name:String, var price:Int) {
fun print() = println("$name = $price")
}
var book: Book? = null
println(book?.name)
book?.print()
println("===============")
book = Book("cool", 12_000)
println(book.name)
book.print()
book?.print()
book은 생성자로 초기화하기 전에는 null을 갖으며 '.'을 사용하여 프로퍼티나 멤버 함수의 접근하고자하면 에러가 발생한다.
초기화한 이후에는 '.'을 사용하여 접근하여도 '?.'을 사용하여 접근할 수 있다.
따라서 nullable한 참조 변수를 사용할 경우 의도치않게 null을 갖게되어 에러가 발생하는 것을 방지하기 위하여 Safe call operator(?.)을 사용하여 프로퍼티나 멤버 함수의 접근하여야 한다.
3. 엘비스 연산자(Elvis operator) ?:
엘비스 연산자(Elvis operator)는 null값에 유무의 따라 다른 값을 지정할 때 유용하게 사용할 수 있는 연산자이다.
ㄴ 참조 변수 ?: null일 경우 대체하는 값
var a:Int? = null
//var a:Int? = 20
println(a ?: 10)
if(a == null) println(10)
else println(a)
만약 a가 null일 경우 대체하는 값을, null이 아닐경우 a값을 건네준다.
if~else문의 결과는 동일하며 연산자를 사용함으로써 코드를 더욱 간결하게 할 수 있다.
4. Not-null 단언 연산자(Not-null assertion operation) !!
Not-null 단언 연산자는 nullable 타입을 non-nullable 타입으로 변환하기 위하여 사용한다.
var a: String? = "26"
//var a: String? = null
if(26 == a!!.toInt()) println("같다")
else println("다르다")
만약 a가 null을 갖는 경우 a는 null이 아니라고 단언했으므로 NullPointerException이 발생한다.
Safe call operator(?.)와 비교하자면
Safe call operator(?.)는 null이 아니면 해당 값을, null일 경우 null을 주지만
Not-null assertion operator(!!)는 null일 경우 에러가 발생한다.
따라서 nullable 변수를 사용하는 경우 반드시 null이 아닌 값을 얻어야할 때 사용하면 된다.
5. 참 조
'Kotlin > Syntax' 카테고리의 다른 글
Kotlin Singleton pattern - object (0) | 2020.10.02 |
---|---|
Kotlin 접근 지정자(= 가시성 지정자, Visibility Modifiers) (0) | 2020.10.01 |
Kotlin 예외(Exception) 처리 (0) | 2020.09.21 |
코틀린(Kotlin) 클래스 (0) | 2020.09.18 |
코틀린(Kotlin) 제어문(for, if, when, while) (0) | 2020.09.17 |