확실하게 어떤 형태로 동작해야 하는 코드가 있다면, 예외를 활용해 제한을 걸어주는 것이 좋다.

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

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)
}

위와 같은 제약사항에 대한 장점?

아규먼트 (require)

함수를 정의할 때 타입 시스템을 활용해서 아규먼트에 제한을 거는 코드

image.png

image.png

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))
}