🛠️ 처음부터 만드는 Memoize — 함수 결과를 캐싱하기
비용이 큰 계산을 반복하면 성능이 떨어집니다. Memoize는 함수 결과를 메모리에 저장했다가 같은 입력이 들어오면 캐시된 결과를 바로 반환합니다.
```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;
};
}
// 사용 예: 팩토리얼 (재귀적 계산)
const factorial = memoize((n) => {
if (n <= 1) return 1;
return n * factorial(n - 1);
});
console.log(factorial(5)); // 120 (계산)
console.log(factorial(5)); // 120 (캐시)
```
```typescript
function memoize any>(fn: T): T {
const cache = new Map();
return ((...args: any[]) => {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = fn(...args);
cache.set(key, result);
return result;
}) as T;
}
```
객체 참조: `JSON.stringify`는 객체 필드 순서가 다르면 다른 키로 봅니다. 필요하면 커스텀 key 함수 전달
메모리 누수: 캐시가 계속 쌓이므로 크기 제한 필요 (LRU Cache 활용)
부수 효과: 함수가 순수해야만 안전합니다
재귀, API 응답 캐싱, 복잡한 계산 등에서 성능을 크게 개선할 수 있습니다.
기본 구현
```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;
};
}
// 사용 예: 팩토리얼 (재귀적 계산)
const factorial = memoize((n) => {
if (n <= 1) return 1;
return n * factorial(n - 1);
});
console.log(factorial(5)); // 120 (계산)
console.log(factorial(5)); // 120 (캐시)
```
TypeScript 버전
```typescript
function memoize
const cache = new Map
return ((...args: any[]) => {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = fn(...args);
cache.set(key, result);
return result;
}) as T;
}
```
주의점
재귀, API 응답 캐싱, 복잡한 계산 등에서 성능을 크게 개선할 수 있습니다.
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!