0Pricing
Lua Academy · 강의

부분 적용

함수 인수를 미리 채워 보세요.

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

부분 적용이란 무엇인가요

부분 적용은 함수의 일부 인수를 지금 고정하고 나머지 인수는 나중에 제공하는 것입니다. 그러면 더 적은 수의 인수를 필요로 하는 새 함수를 얻습니다.

이미 알고 있는 값을 고정해 일반적인 함수를 특수한 함수로 바꿀 수 있습니다.

수동으로 만드는 예

add 함수가 있다고 가정해 보겠습니다. 5를 캡처하고 두 번째 숫자를 기다리는 클로저를 작성해 addFive를 만들 수 있습니다.

캡처한 값은 반환된 함수 안에 유지되므로, 호출할 때마다 남은 인수만 전달하면 됩니다.

local function add(a, b)
  return a + b
end

local function addFive(b)
  return add(5, b)
end

print(addFive(10))
print(addFive(2))

첫 번째 인수 고정하기

이 패턴을 일반화할 수 있습니다. bind1 도우미는 함수와 고정할 첫 번째 인수를 받아 두 번째 인수를 기다리는 새 함수를 반환합니다.

클로저는 f와 고정된 값을 모두 캡처한 다음, 호출되었을 때 모든 값을 전달합니다.

local function bind1(f, a)
  return function(b)
    return f(a, b)
  end
end

local function mul(x, y) return x * y end
local double = bind1(mul, 2)
print(double(7))
print(double(50))

가변 인수 사용하기

원하는 개수만큼 앞쪽 인수를 고정하려면 Lua의 가변 인수 구문 ...을 사용합니다. 고정할 인수를 캡처한 다음 호출 시점에 나중에 전달할 인수를 추가합니다.

table.pack과 table.unpack 함수는 인수 목록을 저장하고 펼치는 데 도움이 됩니다.

local function partial(f, ...)
  local fixed = table.pack(...)
  return function(...)
    local rest = table.pack(...)
    local args = {}
    for i = 1, fixed.n do args[i] = fixed[i] end
    for i = 1, rest.n do args[fixed.n + i] = rest[i] end
    return f(table.unpack(args, 1, fixed.n + rest.n))
  end
end

local function add3(a, b, c) return a + b + c end
local add10 = partial(add3, 10)
print(add10(2, 3))

여러 인수 고정하기

partial은 가변 인수를 받으므로 한 번에 둘 이상의 인수를 고정할 수 있습니다. 그러면 반환된 함수에는 나머지 인수만 전달하면 됩니다.

여기서는 세 인수 중 두 인수를 미리 채워 하나의 인수만 받는 함수가 됩니다.

local function partial(f, ...)
  local fixed = table.pack(...)
  return function(...)
    local rest = table.pack(...)
    local args = {}
    for i = 1, fixed.n do args[i] = fixed[i] end
    for i = 1, rest.n do args[fixed.n + i] = rest[i] end
    return f(table.unpack(args, 1, fixed.n + rest.n))
  end
end

local function label(prefix, sep, value) return prefix .. sep .. value end
local tag = partial(label, "id", ":")
print(tag(42))

실용적인 활용

부분 적용은 범용 유틸리티 함수와 함께 사용할 때 특히 유용합니다. 구성을 한 번만 설정한 다음 특화된 함수를 여러 번 재사용할 수 있습니다.

아래에서는 일반적인 greet가 언어가 고정된 인사 함수로 바뀌며, 이름만 전달하면 됩니다.

local function greet(lang, name)
  if lang == "tr" then return "Merhaba, " .. name end
  return "Hello, " .. name
end

local function bind1(f, a) return function(b) return f(a, b) end end
local greetTr = bind1(greet, "tr")
print(greetTr("Ada"))
print(greetTr("Lin"))

부분 적용과 커링 비교

커링은 여러 인수를 받는 함수를 각각 다음 함수를 반환하는, 한 번에 하나의 인수만 받는 함수 체인으로 바꿉니다. 부분 적용은 일부 인수만 고정하고 나머지는 일반적인 호출 방식으로 남겨 둡니다.

둘은 서로 관련 있지만 다릅니다. 커링은 한 번에 하나씩 처리하고, 부분 적용은 일부 인수를 지금 고정합니다.

local function curryAdd(a)
  return function(b)
    return function(c)
      return a + b + c
    end
  end
end

print(curryAdd(1)(2)(3))

두 인수 함수 커링하기

간단한 도우미를 사용하면 어떤 두 인수 함수든 자동으로 커링할 수 있습니다. 이 도우미는 첫 번째 인수를 받는 함수를 반환하고, 그 함수는 두 번째 인수를 받는 함수를 반환합니다.

이렇게 하면 재사용 가능한 단일 인수 생성기를 만들 수 있으며, 파이프라인 안에서도 읽기 좋습니다.

local function curry2(f)
  return function(a)
    return function(b)
      return f(a, b)
    end
  end
end

local function pow(base, exp) return base ^ exp end
local cpow = curry2(pow)
print(cpow(2)(10))

클로저가 작동하게 합니다

모든 부분 적용 함수와 커링된 함수는 클로저에 의존합니다. 고정된 인수는 반환된 함수가 기억하는 캡처된 지역 변수입니다.

각 반환 함수가 고유한 캡처 값을 가지므로 특화된 변형을 여러 개 안전하게 만들 수 있습니다.

local function bind1(f, a) return function(b) return f(a, b) end end
local function sub(x, y) return x - y end

local from100 = bind1(sub, 100)
local from10 = bind1(sub, 10)
print(from100(40))
print(from10(3))

언제 사용할까요

같은 앞부분 인수를 반복해서 전달하며 함수를 호출할 때, 부분 적용을 사용하면 반복을 줄일 수 있습니다.

또한 인수를 더 적게 받는 인터페이스에 함수를 맞추는 데도 도움이 됩니다. 예를 들어 콜백이 값 하나만 전달하는 경우가 그렇습니다.

설정된 콜백

부분 적용은 map 및 filter와 잘 어울립니다. 구성 인수를 미리 채우면 콜백에는 목록 요소만 전달됩니다.

이렇게 하면 동작을 계속 조정하면서도 파이프라인을 깔끔하게 유지할 수 있습니다.

local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function bind1(f, a) return function(b) return f(a, b) end end
local function scale(factor, x) return factor * x end

local r = map({1,2,3,4}, bind1(scale, 10))
print(table.concat(r, ", "))

빠른 확인

서로 관련된 두 개념의 차이를 떠올려 보세요.

복습

부분 적용은 일부 인수를 고정하고, 고정된 값을 캡처한 클로저를 사용해 나머지 인수를 기다리는 새 함수를 반환합니다.

가변 인수를 기반으로 한 partial 도우미는 이를 일반화하고, 커링은 단일 인수 함수들을 연결합니다. 두 방식 모두 반복을 줄이고 함수를 콜백에 맞게 조정합니다.

자주 묻는 질문

“부분 적용” 강의는 무료인가요?

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

“부분 적용”에서 뭘 배우나요?

함수 인수를 미리 채워 보세요. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“부분 적용” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 값으로서의 함수
  2. map, filter, reduce
  3. 부분 적용
  4. 함수 조합하기
← Lua Academy(으)로 돌아가기