[javascript] 메모제이션(memoization) 패턴 본문

Web/Javascript

[javascript] 메모제이션(memoization) 패턴

미니모아 2016. 8. 25. 12:31
반응형


// 본 내용은 '인사이드 자바스크립트' 책을 참고하였음


메모제이션 패턴은 계산결과를 저장해놓아 다시 계산할 필요 없이 사용할 수 있게 한 'memorize' 기능을 자바스크립트에서 구현한 패턴이다.  

function Calculate(key,input,func){
Caculate.data = Calculate.data || {};

if(!Calculate.data[key]){
var result;
result = func(input);
Calculate.data[key] = result;
}

return Calculate.data[key];
}

함수 Caculate() 프로퍼티에 data 프로퍼티를 만들어 객체를 할당하였다. 사용자는 원하는 값을 원하는 키로 저장해 놓을 수 있다. 일종의 캐시 역할을 한다. 


범용적으로 사용하기 위해서는 Function.prototype에 함수를 추가한다.

Function.prototype.memoization = function(key){
var arg = Array.prototype.slice.call(arguments,1);
this.data = this.data || {};

return this.data[key] !== undefined?
this.data[key] : this.data[key] = this.apply(this.arg);
};

function cal(input){
return input + input;
}

cal.memoization(1,5);  //index 번호, 계산할 인자 

console.log(cal.memoization(1)); // equals cal.data[1]

Function.prototype에 메서드를 정의해놓으면 한번 값이 들어간 경우 계속 유지되므로 이를 초기화하는 방법도 제공 되어야한다. 


이런 패턴은 연산 함수를 사용할 때 보다 나은 성능의 함수를 구현할 수 있다.

//초기 캐시값과 사용자 정의 함수를 받음
var cacher = function(cache,func){
var calculate = function(n){
if(typeof(cache[n]) === 'number'){
result = cache[n];
}else{
result = cache[n] = func(calculate,n);
}
return result;
}
return calculate;
};

//피보나치수열
var fibo = cacher({'0':0,'1':1},function(func,n){
return func(n-1)+func(n-2);
});

//팩토리얼
var fact = cacher({'0':1},function(func,n){
return n*func(n-1);
});

console.log(fibo(10));
console.log(fact(10));





반응형

'Web > Javascript' 카테고리의 다른 글

디바운스와 쓰로틀  (0) 2022.05.26
[함수형프로그래밍] reduce 함수  (0) 2016.10.31
Comments