확실하게 어떤 형태로 동작해야 하는 코드가 있다면, 예외를 활용해 제한을 걸어주는 것이 좋다.
코틀린에서는 코드의 동작에 제한을 걸 때 다음과 같은 방법을 사용할 수 있다.
require
: 아규먼트 제한check
: 상태와 관련된 동작 제한assert
: 어떤 것이 true인지 확인할 수 있고, 테스트 모드에서만 작동fun decode(encoded: ByteArray): ByteArray {
require(isBase62Encoding(encoded)) { "Input is not encoded correctly" }
val prepared = translate(encoded, lookup)
return convert(prepared, TARGET_BASE, STANDARD_BASE)
}
위와 같은 제약사항에 대한 장점?
함수를 정의할 때 타입 시스템을 활용해서 아규먼트에 제한을 거는 코드
fun factorial(n: Int): Long {
require(n >= 0) // 양의 정수 검증
return if (n <= 1) 1L else factorial(n - 1) * n
}
fun findClusters(points: List<Point>): List<Cluster> {
require(points.isNotEmpty()) // 비어 있지 않은 좌표 검증
// ...
}
fun sendEmail(user: User, message: String) {
// 이메일 주소 입력, 유효성 검증
requireNotNull(user.email)
require(isValidEmail(user.email))
}