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 |