메모리제이션 패턴
'memorize'란 표현을 사전에서 찾아보면, '계산 결과를 저장해 놓아 이후 다시 계산할 필요 없이 사용할 수 있게 한다는 컴퓨터 용어라고 나와 았다. 메모이제이션 패턴은 바로 이러한 기능 자바스크립트에서 구현한 패턴이다. 기본적으로 계산된 결과를 함수 프로퍼티 값으로 담아 놓고 나중에 사용한다.
function Calculate(key, input, func) {
Calculate.data = Calculate.data || {}
if (!Calculate.data[key]) {
var result
result = func(input)
Calculate.data[key] = result
}
return Calculate.data[key]
}
var result = Calculate(1, 5, function (input) {
return input * input
})
console.log(result)
result = Calculate(2, 5, function (input) {
return (input * input) / 4
})
console.log(result)
console.log(Calculate(1))
console.log(Calculate(2))
위 예제에서 보는 바와 같이 함수 Calculate() 프로퍼티에 data 프로퍼티를 만들어 객체를 할당하였다. 이곳에 사용자는 자신의 원하는 값을 원하는 키로 저장해 놓을 수 있다ㅣ 일단 한번 계산된 값이 들어가면 그 이후에는 해당 키로 저장해 놓은 값을 받아서 사용할 수 있다.
팩토리얼에 적용해보자
var fact = (function () {
var cache = { 0: 1 }
var func = function (n) {
var result = 0
if (typeof cache[n] === 'number') {
result = cache[n]
} else {
result = cache[n] = n * func(n - 1)
}
return result
}
return func
})()
console.log(fact(10))
console.log(fact(20))