💻 Dev

처음부터 만드는 Memoize — 함수 결과 캐싱으로 중복 계산 제거하기

함수를 호출할 때마다 같은 결과를 반복해서 계산하는 건 낭비입니다. Memoization은 함수의 인자와 결과를 메모리에 저장했다가, 같은 인자로 다시 호출될 때 저장된 결과를 즉시 반환하는 최적화 기법입니다.

11줄 구현


```javascript
function memoize(fn) {
const cache = new Map();
return function (...args) {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = fn(...args);
cache.set(key, result);
return result;
};
}
```

실전 예제


```javascript
const fibonacci = memoize((n) => {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
});
console.time('first');
console.log(fibonacci(50));
console.timeEnd('first'); // ~500ms
console.time('second');
console.log(fibonacci(50));
console.timeEnd('second'); // <1ms
```
첫 호출 때는 복잡한 계산을 수행하지만, 두 번째 호출에서는 캐시에서 즉시 반환됩니다.

주의: 순환 참조


위의 `JSON.stringify` 방식은 순환 참조가 있는 객체에서 실패합니다. 프로덕션에서는 커스텀 키 생성기를 사용하세요:
```javascript
function memoize(fn, keyGenerator = (...args) => JSON.stringify(args)) {
const cache = new Map();
return function (...args) {
const key = keyGenerator(...args);
if (cache.has(key)) return cache.get(key);
const result = fn(...args);
cache.set(key, result);
return result;
};
}
```
참고: [MDN Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map), [JavaScript.info Decorator Pattern](https://javascript.info/call-apply-decorators)
💬 0
👁 0 views

Comments (0)

💬

No comments yet.

Be the first to comment!