Front
[자바스크립트] 메모이제이션(Memoization) 패턴
Kool Jay
2017. 6. 28. 17:17
[Javascript] 메모이제이션은 무엇인가?!
피보나치 수열은 또 뭐여... 토끼랑 번식?!
저급 개발로 페이지를 뚝딱뚝딱 찍어내며 공장의 부속품처럼 일할 때에는 반복문과 조건문만 알면 다 되는구나 굉장히 이상한 생각을 한적이 있었다. 지금 누군가 그런말을 한다면 생각을 바꾸라는 말부터 하겠다.
아무튼 오늘은 메모이제이션에 관하여 알아보려 한다.
메모이제이션(memoization)은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술이다. 동적 계획법의 핵심이 되는 기술이다. 메모아이제이션이라고도 한다.
위는 위키에 정의된 메모이제이션에 관한 글이다. 함께 나온 예제를 보며 이해를 하려고 피보나치 수열을 보다보면 어느새 토끼와 번식에 관하여 읽고있는 자신을 보게 될 것이다. 그래서 나같은 위인들을 위하여 초등학생들도 쉽게 접근할 수 있는 다른 예제를 만들어 보았다.
1부터 입력한 인덱스까지의 수를 순차적으로 반복하여 누적된 값을 출력해주는 간단한 계산 프로그램을 만든다고 가정하자. 계산을 하다보면 이미 계산했던 값들을 다시 반복해서 사용할 일이 있다. 메모이제이션 패턴은 이런 계산된 값들을 저장하고 필요할 때 저장된 값을 가져오는 방식을 말한다. 물론 아래의 코드는 메모이제이션의 가장 저수준 레벨을 구현한 것이다. 피보나치 수열을 recursive하게 구하는 대신 이해하기 쉬운 코드로 설명을 하기 위함이지 이러한 코딩 자체를 메모이제이션이라고 부르기에는 무리가 있을 수 있다. 정말 고수준의 메모이제이션을 보면 반복문 혹은 재귀함수를 사용하면서 그 안에서 이미 계산되거나 호출된 함수의 리턴값을 저장해서 사용하는 것을 볼 수 있을것이다.
자 지루한 설명은 끝내고 아래의 코드를 보면서 개념 파악을 해보자.
상단의 assert 함수는 테스트를 위한 것이라 무시해도 된다. (이전 포스팅에서 간단한 테스트 스위트를 가져왔다.) Result 탭을 확인하면 1에서부터 입력한 값까지의 연속된 수의 누적된 합을 반환해주는 계산기가 보일것이다. default 값은 10으로 우선 버튼을 클릭해보자. 그러면 1부터 10까지의 수를 합한 55가 출력될 것이다. (가우스가 풀이했던 방식을 이용하면 더 쉬울 수 있지만 이건 예제를 위한거니까...) 자 다시 10을 입력한 상태에서 버튼을 눌러보자. 그러면 자바스크립트 코드의 반복문이 아닌 캐쉬에서 해당 값을 반환해주는 것을 알 수 있다.
이렇게 쉽다. 하지만 이건 기본개념이자 말그대로 저수준의 코딩이다. 이걸로 메모이제이션을 파악했다라고 느끼고 있는 분들에게 단호하게 말하고 싶다. 다른 블로그 참고해라. 이건 말그대로 메모이제이션을 가장 초딩적인 시각에서 개념 설명을 하기위한 예제이다.
날이 좋다... 퇴사하기 좋은 날이다... 아... 집에 가고만 싶다...