require: 아큐먼트를 제한check: 상태와 관련된 동작을 제한assert: 어떤 것이 true인지 확인할 수 있다. 테스트 모드에서만 작동return 또는 throw와 함께 활용하는 Elvis 연산자fun pop(num: Int = 1): List<T> {
require(num <= size) {
"Cannot remove more element than current size"
}
// ...
}
throw 하여 예상치 못한 코드 동작을 제한한다.require 함수를 사용하는데 적절한 예외를 발생시킨다.fun factorial(n: Int): Long {
require(n >= 0)
return if (n <= 1) 1 else factorial(n - 1) * n
}
check 함수를 사용한다.fun speak(text: String) {
check(isInitialized)
// ...
}
require와 check 블록으로 어떤 조건이 true가 나왔다면 그 이후로도 true로 가정한다.fun changeDress(person: Person) {
require(person.outfit is Dress)
val dress: Dress = person.outfit
}
null 여부 검사에 굉장히 유용하다.class Person(val email: String?)
fun sendEmail(person: Person, message: String) {
require(person.email != null)
val email: String = person.email
// ...
}
null 확인의 경우 requireNotNull, checkNotNull이라는 특수 함수를 사용해도 괜찮다.
fun sendEmail(person: Person, message: String) {
val email: String = requireNotNull(person.email)
// ...
}
null 검사 시, 오른쪽에 throw 또는 return을 두고 Elvis 연산자를 활용하는 경우가 많다.fun sendEmail(person: Person, message: String) {
val email: String = person.email ?: return
// ...
}
run 블록을 활용해 함수가 중지된 이유를 로그로 출력할 수도 있다.fun sendEmail(person: Person, message: String) {
val email: String = person.email ?: run {
log("Email not sent, no email address")
return
}
// ...
}
이번 장에서의 내용을 통해