0Pricing
Lua Academy · 강의

클로저를 이용한 메모이제이션

클로저가 보유한 테이블에 비용이 큰 함수의 결과를 캐시합니다.

클로저를 이용한 메모이제이션은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

메모이제이션이란 무엇인가요?

메모이제이션은 비용이 큰 함수 호출의 결과를 캐시하므로, 같은 인수로 반복 호출할 때 캐시된 결과를 즉시 반환할 수 있습니다.

기본 메모이제이션 래퍼

클로저가 cache 테이블을 보유합니다. 처음 호출할 때 계산하고 저장하며, 다시 호출하면 저장된 값을 반환합니다.

local function memoize(fn)
  local cache = {}
  return function(x)
    if cache[x] == nil then
      cache[x] = fn(x)
    end
    return cache[x]
  end
end

메모이제이션된 피보나치

재귀 피보나치 함수에 메모이제이션을 적용하면 시간 복잡도가 지수 시간에서 선형 시간으로 줄어듭니다.

local fib
fib = memoize(function(n)
  if n <= 1 then return n end
  return fib(n-1) + fib(n-2)
end)
print(fib(30))  -- 832040 (fast!)

여러 인수의 메모이제이션

인수가 여러 개인 함수에서는 모든 인수로부터 캐시 키 문자열을 구성합니다.

local function memoize2(fn)
  local cache = {}
  return function(a, b)
    local key = a .. "," .. b
    if cache[key] == nil then cache[key] = fn(a, b) end
    return cache[key]
  end
end

중첩 캐시 테이블

서로 다른 유형의 인수를 처리할 때는 각 인수를 키로 사용하는 중첩 테이블을 사용하면 문자열 직렬화 없이 O(1)로 조회할 수 있습니다.

local function nestedMemo(fn)
  local cache = {}
  return function(a, b)
    cache[a] = cache[a] or {}
    if cache[a][b] == nil then cache[a][b] = fn(a, b) end
    return cache[a][b]
  end
end

캐시 무효화

메모이제이션은 순수 함수(부수 효과가 없고 같은 입력에 같은 출력을 내는 함수)를 전제로 합니다. 부수 효과가 있는 함수는 캐시를 신중하게 무효화하지 않는 한 메모이제이션해서는 안 됩니다.

TTL 기반 메모이제이션

os.time()을 사용해 캐시 항목을 만료시키는 TTL 로직을 추가합니다.

local function memoizeTTL(fn, ttl)
  local cache = {}
  return function(x)
    local entry = cache[x]
    if entry and os.time() - entry.time < ttl then
      return entry.value
    end
    cache[x] = {value = fn(x), time = os.time()}
    return cache[x].value
  end
end

약한 값 캐시

약한 값을 사용하면 메모리가 부족할 때 캐시된 결과를 가비지 컬렉션할 수 있습니다.

local function memoizeWeak(fn)
  local cache = setmetatable({}, {__mode = "v"})
  return function(x)
    if cache[x] == nil then cache[x] = fn(x) end
    return cache[x]
  end
end

재귀 메모이제이션 패턴

상호 재귀 함수에서는 재귀 본문이 사용하기 전에 메모이제이션된 래퍼를 할당해야 재귀 호출이 캐시를 사용합니다.

제한된 캐시(LRU 개요)

메모리를 제어하려면 캐시가 최대 크기를 초과할 때 가장 오래 사용되지 않은 항목을 제거하는 LRU 캐시를 구현합니다.

실제 메모이제이션 활용

일반적인 활용 사례로는 비용이 큰 수학 계산, 데이터베이스 질의 결과 캐싱, Lua 패턴 컴파일, 설정 파일 분석이 있습니다.

메모이제이션 질문

메모이제이션은 왜 순수 함수에만 적용해야 하나요?

복습: 메모이제이션

메모이제이션은 클로저가 보유한 캐시를 사용해 인수 키별로 결과를 저장하고 중복 계산을 제거합니다. 메모리 안전성을 위해 약한 테이블을 사용하고, 시간에 따라 달라지는 캐시에는 TTL을 추가하세요.

자주 묻는 질문

“클로저를 이용한 메모이제이션” 강의는 무료인가요?

네 — “클로저를 이용한 메모이제이션” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“클로저를 이용한 메모이제이션”에서 뭘 배우나요?

클로저가 보유한 테이블에 비용이 큰 함수의 결과를 캐시합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“클로저를 이용한 메모이제이션” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 업밸류란 무엇인가요?
  2. 클로저 사이의 공유 업밸류
  3. 팩토리 함수와 생성기
  4. 클로저를 이용한 메모이제이션
← Lua Academy(으)로 돌아가기