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
}
// ...
}
이번 장에서의 내용을 통해