코틀린에서는 코드의 동작에 제한을 걸 때 다음과 같은 방법을 사용할 수 있다
require
블록: 아큐먼트 제한check
블록: 상태와 관련된 동작을 제한assert
블록: 어떤 것이 true인지 확인 가능. assert
블록은 테스트 모드에서만 작동return
또는 throw
와 함께 활용하는 Elvis
연산자// Stack<T>의 일부
fun pop(num: Int = 1): List<T> {
require(num <= size) {
"Cannot remove more elements than current size"
}
check(isOpen) { "Cannot pop from colsed stack" }
val ret = collection.take(num)
collection = collection.drop(num)
assert(ret.size == num)
return ret
}
위와 같이 제한을 걸었을 때의 장점
require
함수를 사용한다. require
함수는 제한을 확인하고, 제한을 만족하지 못할 경우 예외를 throw한다.
fun factorial(n: Int): Long {
require(n >= 0)
return if (n <= 1) 1 else factorial(n - 1) * n
}
...
위 코드와 같이 입력 유효성 검사 코드는 함수의 가장 앞 부분에 배치되므로, 쉽게 확인할 수 있다.
require
함수는 조건을 만족하지 못 할 때 무조건적으로 IlleagalArgumentException
을 발생시키므로 제한을 무시할 수 없다.