부분 적용
함수 인수를 미리 채워 보세요.
부분 적용은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.