Page 22 - 006963
P. 22
};
console.log(memoizedFactorial(10)); // 열 번 계산
console.log(memoizedFactorial(10)); // 한 번 캐싱
console.log(memoizedFactorial(11)); // 한 번 계산되고 캐싱
이 예제를 실행하면 값을 계산할 때마다 조회 테이블에 값이 추가(number 매개변수와 함께)된다
는 것을 알 수 있습니다. 첫 번째 memoizedFactorial(10) 함수 호출에서는 일을 조금 해야 하지
만, 두 번째 memoizedFactorial(10) 함수 호출에서는 lookup 테이블만 참조하면 됩니다. 세 번
째 memoizedFactorial(10) 함수 호출에서는 11을 연산해야 하는데, 이미 10 문제를 해결했기 때
문에 lookupTable에서 숫자 10까지의 결과를 가져와 11만 계산하면 됩니다.
하지만 이제 memoizedFactorial 함수는 명시적인 매개변수 이외의 다른 것에 의존합니다. 즉, 함
수가 순수성을 잃게 되었습니다. 이 상황을 어떻게 피할 수 있을까요? 다음과 같이 lookupTable
을 명시적 매개변수로 만들어야 합니다(예제 파일: factorial-2.js).
function memoizedFactorial(number, lookupTable = {}){
if(number in lookupTable){
console.log("cached");
return lookupTable[number];
}else{
console.log("calculating");
var reduceValue;
if(number < 2){
reduceValue = 1;
}else{
reduceValue =
number * (memoizedFactorial(number - 1, lookupTable))['result'];
};
lookupTable[number] = reduceValue;
return {result: reduceValue, lookupTable: lookupTable};
}
};
console.log(memoizedFactorial(10)['result']);
console.log(memoizedFactorial(10)['result']);
이 코드를 실행하면 두 번째 함수 호출에서는 캐싱되지 않음을 알 수 있습니다. 무엇을 호출
하고 있는지 살펴보면 그리 놀라운 사실은 아닙니다. 빈 객체로 구성된 기본 명시적 매개변수
lookupTable을 가지고 있지만, 실제로는 전달되지 않습니다. 즉, 캐시가 없으면 캐시를 이용할
수 없습니다.
430
리팩토링 자바스크립트(본문)최종.indd 430 2018-09-19 오전 1:31:34