상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - 자바스크립트에서 함수의 메모이제이션을 구현하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
메모이제이션(Memoization)은 함수의 결과를 캐싱하여 동일한 입력에 대해 반복적으로 계산하는 것을 방지하는 최적화 기법입니다. <a href='https://sangseek.com/sangseeks/자바/ko'>자바</a>스크립트에서 메모이제이션을 구현하는 방법은 여러 가지가 있지만, 기본적인 원리는 함수의 결과를 저장하고, 동일한 입력이 주어졌을 때 저장된 결과를 반환하는 것입니다. 이를 통해 성능을 크게 향상시킬 수 있습니다. 메모이제이션 구현 방법 1. 기본 메모이제이션 함수 구현 : 가장 간단한 메모이제이션 구현은 객체를 사용하여 함수의 입력과 출력을 저장하는 것입니다. 아래는 기본적인 메모이제이션을 구현한 예제입니다. ```javascript function memoize(fn) { const cache = {}; return function(...args) { const key = JSON.stringify(args); // 인자를 <a href='https://sangseek.com/sangseeks/문자열/ko'>문자열</a>로 변환하여 키로 사용 if (cache[key]) { return cache[key]; // 캐시에서 <a href='https://sangseek.com/sangseeks/결과 반환/ko'>결과 반환</a> } const result = fn(...args); // 결과 계산 cache[key] = result; // 캐시에 결과 저장 return result; }; } // 예시로 사용할 재귀적 피보나치 함수 function fibonacci(n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } const memoizedFibonacci = memoize(fibonacci); console.log(memoizedFibonacci(10)); // 55 console.log(memoizedFibonacci(10)); // 캐시된 결과 사용 ``` 위의 코드에서 `memoize` 함수는 입력 함수 `fn`을 받아서 캐시를 관리하는 새로운 함수를 반환합니다. 이 새로운 함수는 인자를 문자열로 변환하여 캐시에서 결과를 찾고, 없을 경우 원래 함수를 호출하여 결과를 계산한 후 캐시에 저장합니다. 2. 다양한 인자 처리 : 위의 예제는 단순한 인자에 대해서는 잘 작동하지만, 배열이나 객체와 같은 복잡한 데이터 구조를 사용할 경우, `JSON.stringify`를 사용한 키 생성이 충돌을 일으킬 수 있습니다. 이 경우, 더 정교한 방법으로 키를 생성해야 합니다. ```javascript function memoize(fn) { const cache = new Map(); return function(...args) { const key = args.map(arg => (typeof arg === 'object' ? JSON.stringify(arg) : arg)).join('|'); if (cache.has(key)) { return cache.get(key); } const result = fn(...args); cache.set(key, result); return result; }; } ``` 여기서는 `Map`을 사용하여 키-값 쌍을 저장하고, 객체나 배열을 문자열로 변환하여 키를 생성합니다. 3. 메모이제이션의 한계 : 메모이제이션은 모든 경우에 유용하지 않습니다. 예를 들어, 입력이 매우 다양하거나, 함수의 결과가 입력에 따라 매번 달라지는 경우(<a href='https://sangseek.com/sangseeks/부수/ko'>부수</a> 효과가 있는 경우)에는 메모이제이션이 적합하지 않을 수 있습니다. 또한, 메모리 사용량이 증가할 수 있으므로, 캐시를 적절히 관리하는 것이 중요합니다. 4. 캐시 크기 제한 : 메모이제이션을 사용할 때는 캐시의 크기를 제한하는 것이 좋습니다. 이를 위해 LRU(<a href='https://sangseek.com/sangseeks/Least/ko'>Least</a> Recently Used) 캐시 알고리즘을 구현할 수 있습니다. LRU 캐시는 가장 오래된 항목을 <a href='https://sangseek.com/sangseeks/제거/ko'>제거</a>하여 새로운 항목을 추가하는 방식으로 작동합니다. ```javascript class <a href='https://sangseek.com/sangseeks/LRUCache/ko'>LRUCache</a> { constructor(limit) { this.cache = new Map(); this.limit = limit; } get(key) { if (!this.cache.has(key)) return null; const value = this.cache.get(key); this.cache.delete(key); // 최근 사용으로 업데이트 this.cache.set(key, value); return value; } set(key, value) { if (this.cache.has(key)) { this.cache.delete(key); // 기존 항목 삭제 } else if (this.cache.size === this.limit) { this.cache.delete(this.cache.keys().next().value); // 가장 오래된 항목 삭제 } this.cache.set(key, value); } } function memoize(fn) { const cache = new LRUCache(100); // 캐시 크기 100으로 설정 return function(...args) { const key = JSON.stringify(args); const cachedResult = cache.get(key); if (cachedResult !== null) { return cachedResult; } const result = fn(...args); cache.set(key, result); return result; }; } ``` 결론 메모이제이션은 성능 최적화에 매우 유용한 기법입니다. <a href='https://sangseek.com/sangseeks/자바스크립트/ko'>자바스크립트</a>에서 메모이제이션을 구현하는 방법은 다양하며, 함수의 특성과 사용 사례에 따라 적절한 방법을 선택해야 합니다. 캐시의 크기를 관리하고, 입력 <a href='https://sangseek.com/sangseeks/데이터의 특성/ko'>데이터의 특성</a>을 고려하여 메모이제이션을 적용하면, 애플리케이션의 성능을 크게 향상시킬 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기