본문 바로가기

IT

Kotlin 유용한 함수 - 최댓값, 최솟값 강제(coerceAtLeast, coerceAtMost, coerceIn)

반응형

코틀린 구현을 보면서 숫자형, Comparable 구현체에 대한 최댓값, 최솟값을 강제할 수 있는 함수가 있어 소개합니다.

아래 소스는 _Ranges.kt 소스 코드에서 일부 발췌하였습니다.

public fun <T : Comparable<T>> T.coerceAtLeast(minimumValue: T): T {
    return if (this < minimumValue) minimumValue else this
}

public fun Int.coerceAtLeast(minimumValue: Int): Int {
    return if (this < minimumValue) minimumValue else this
}

...

public fun <T : Comparable<T>> T.coerceAtMost(maximumValue: T): T {
    return if (this > maximumValue) maximumValue else this
}

public fun Int.coerceAtMost(maximumValue: Int): Int {
    return if (this > maximumValue) maximumValue else this
}

...

public fun <T : Comparable<T>> T.coerceIn(minimumValue: T?, maximumValue: T?): T {
    if (minimumValue !== null && maximumValue !== null) {
        if (minimumValue > maximumValue) throw IllegalArgumentException("Cannot coerce value to an empty range: maximum $maximumValue is less than minimum $minimumValue.")
        if (this < minimumValue) return minimumValue
        if (this > maximumValue) return maximumValue
    }
    else {
        if (minimumValue !== null && this < minimumValue) return minimumValue
        if (maximumValue !== null && this > maximumValue) return maximumValue
    }
    return this
}

public fun Int.coerceIn(minimumValue: Int, maximumValue: Int): Int {
    if (minimumValue > maximumValue) throw IllegalArgumentException("Cannot coerce value to an empty range: maximum $maximumValue is less than minimum $minimumValue.")
    if (this < minimumValue) return minimumValue
    if (this > maximumValue) return maximumValue
    return this
}

...

 

확장 함수(extension function)이므로 아래와 같이 if 문을 사용했던 구문을 쉽게 치환할 수 있습니다. 또한 메소드 체이닝(method chaining) 하기도 쉽겠죠?

// 최솟값 강제
val num: Int = ......
val num2: Int = if (num < 0) 0 else num

val num: Int = ......
val num2: Int = num.coerceAtLeast(0)

// 최댓값 강제
val num: Int = ......
val num2: Int = if (num > 1_000) 1_000 else num

val num: Int = ......
val num2: Int = num.coerceAtMost(1_000)
반응형