코틀린에서는 코드의 동작에 제한을 걸 때 다음과 같은 방법을 사용할 수 있다

// 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을 발생시키므로 제한을 무시할 수 없다.

상태