수색…
Null 가능 및 Null 불가능 유형
String 과 같은 일반 유형은 Null을 허용하지 않습니다. Null 값을 유지할 수있게하려면 ? 그들 뒤에 : String?
var string : String = "Hello World!" var nullableString: String? = null string = nullableString // Compiler error: Can't assign nullable to non-nullable type. nullableString = string // This will work however!
안전한 호출 연산자
nullable 형식의 함수 및 속성에 액세스하려면 특수 연산자를 사용해야합니다.
첫 번째, ?. , 액세스하려는 속성 또는 함수를 제공하거나 객체가 null 인 경우 null을 제공합니다.
val string: String? = "Hello World!" print(string.length) // Compile error: Can't directly access property of nullable type. print(string?.length) // Will print the string's length, or "null" if the string is null.
Idiom : 같은 null-checked 객체에서 여러 메소드 호출하기
null-checked 객체의 여러 메소드를 호출하는 우아한 방법은 Kotlin의 apply 과 같이 사용하는 것입니다.
obj?.apply {
foo()
bar()
}
이 호출 foo 과 bar 에서 obj (인 this 에 apply 경우에만 블록) obj , 그렇지 않으면 전체 블록을 건너 뛰는, 비 null입니다.
함수 및 속성 호출의 암시 적 수신자가 아니더라도 nullable 변수를 nullable이 아닌 참조로 범위로 가져 오려면 apply 대신 let 을 사용할 let apply .
nullable?.let { notnull ->
notnull.foo()
notnull.bar()
}
notnull 은 아무 것도 지명되거나 암시 적 lambda 매개 변수를 통해 사용되지 않을 it 있습니다.
스마트 캐스트
컴파일러가 특정 지점에서 객체가 null이 될 수 없다고 추측 할 수 있다면 더 이상 특수 연산자를 사용할 필요가 없습니다.
var string: String? = "Hello!"
print(string.length) // Compile error
if(string != null) {
// The compiler now knows that string can't be null
print(string.length) // It works now!
}
참고 : 컴파일러는 null 체크와 의도 된 사용 사이에서 잠재적으로 수정 될 수있는 변경 가능한 변수를 똑똑하게 캐스트 할 수 없습니다.
변수가 현재 블록의 범위 밖에서 액세스 할 수있는 경우 (예 : 비 로컬 객체의 멤버이기 때문에), 스마트 캐스트하고 사용할 수있는 새 로컬 참조를 만들어야합니다.
반복 가능 및 배열에서 null을 제거하십시오.
때로는 형식을 Collection<T?> 에서 Collections<T> 로 변경해야합니다. 이 경우 filterNotNull 이 우리의 솔루션입니다.
val a: List<Int?> = listOf(1, 2, 3, null)
val b: List<Int> = a.filterNotNull()
Null Coalescing / Elvis Operator
가끔 null 허용 식을 if-else 형식으로 평가하는 것이 바람직합니다. elvis 연산자 인 ?: 는 이러한 상황에 대해 Kotlin에서 사용할 수 있습니다.
예를 들면 :
val value: String = data?.first() ?: "Nothing here."
data?.first() 또는 data 자체가 null 값을 생성하면 위의 식은 "Nothing here" 반환하고 그렇지 않은 경우 data?.first() 의 결과는 data?.first() 입니다.
동일한 구문을 사용하여 예외를 throw하여 코드 실행을 중단 할 수도 있습니다.
val value: String = data?.second()
?: throw IllegalArgumentException("Value can't be null!")
주의 사항 : 단언 연산자 (예 :
data!!.second()!!)를 사용하여 NullPointerExceptions을 던져 넣을 수 있습니다data!!.second()!!
역설
!! 접미사는 null 허용을 무시하고 해당 유형의 null이 아닌 버전을 반환합니다. 오브젝트가 null 경우는 KotlinNullPointerException 가 Throw됩니다.
val message: String? = null
println(message!!) //KotlinNullPointerException thrown, app crashes
엘비스 운영자 (? :)
Kotlin에서 null reference 보유 할 수있는 변수를 선언 할 수 있습니다. 우리가 nullable 참조 a 가지고 있다고 가정하자. " a 가 널이 아니거나 사용한다면, 그렇지 않으면 널이 아닌 값 x 사용한다"라고 말할 수있다.
var a: String? = "Nullable String Value"
이제 a 는 null 일 수 있습니다. 우리의 가치에 액세스 할 필요가있을 때 그래서 a , 우리는이 값을 포함 여부, 안전 검사를 수행해야합니다. 이 안전 점검은 일반적인 if...else 문으로 수행 할 수 있습니다.
val b: Int = if (a != null) a.length else -1
하지만 여기에 사전 운영자 Elvis (연산자 엘비스 : ?: Elvis 가 온다. 위의 if...else 는 Elvis 연산자로 다음과 같이 표현할 수 있습니다.
val b = a?.length ?: -1
?: (여기서 : a?.length )의 왼쪽에있는 표현식이 null이 아닌 경우 elvis 연산자가이를 반환하고 그렇지 않으면 표현식을 오른쪽 (여기서는 -1 )으로 반환합니다. 오른쪽면 표현식은 왼쪽면이 널인 경우에만 평가됩니다.