[kotlin] 코틀린에서 함수와 메서드의 메모이제이션
메모이제이션은 함수 또는 메서드가 한 번 계산된 결과를 저장하여 동일한 입력값에 대한 재계산을 피하는 최적화 기술입니다. 코틀린에서는 이를 구현하려면 memoization
패턴을 사용할 수 있습니다.
메모이제이션 구현하기
아래는 정수를 입력으로 받아 피보나치 수열을 계산하는 함수의 메모이제이션을 구현한 예제 코드입니다.
val fibonacci: (Int) -> Long = { n ->
if (n <= 1) n.toLong()
else fibonacci(n - 1) + fibonacci(n - 2)
}.memoized()
위 예제에서 memoized
는 확장 함수로, 이미 계산된 값을 저장하고 새로운 값이 요청될 때 이를 반환합니다. 이를 사용하기 위해서는 아래와 같이 해당 함수를 선언해야 합니다.
fun <T, R> ((T) -> R).memoized(): (T) -> R {
val map = mutableMapOf<T, R>()
return { input: T ->
map.getOrPut(input) {
this(input)
}
}
}
메서드의 메모이제이션
메모이제이션을 적용하려는 메서드가 있는 경우, 해당 메서드를 함수로 변환한 다음 메모이제이션을 적용할 수 있습니다.
class MemoizedFibonacci {
fun calculate(n: Int): Long {
if (n <= 1) return n.toLong()
return (calculate(n - 1) + calculate(n - 2))
}
}
val memoizedFibonacci = ::MemoizedFibonacci.calculate.memoized()
위의 예제에서 calculate
메서드를 함수로 변환하고, 이후에 메모이제이션을 적용하여 동일한 입력값에 대한 계산을 한 번만 수행하도록 합니다.
이처럼 코틀린에서 함수와 메서드의 메모이제이션을 구현할 수 있으며, 이를 통해 성능을 향상시킬 수 있습니다.
결론
코틀린에서는 함수와 메서드의 메모이제이션을 간단하게 구현할 수 있습니다. 이를 통해 계산 비용이 높은 함수의 성능을 향상시킬 수 있으며, 코드의 가독성도 증가할 수 있습니다.
참고 문헌: