수색…
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
)으로 반환합니다. 오른쪽면 표현식은 왼쪽면이 널인 경우에만 평가됩니다.