0Pricing
Lua Academy · 강의

함수 조합하기

변환을 연결해 보세요.

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

함수 합성이란

함수 합성은 두 함수를 하나로 결합합니다. 합성된 함수는 입력을 첫 번째 함수에 전달한 다음 그 결과를 두 번째 함수에 넘깁니다.

수학에서는 이를 f(g(x))로 나타냅니다. 함수 합성을 사용하면 작고 집중된 함수들로 큰 변환을 만들 수 있습니다.

두 함수 합성하기

compose 도우미는 두 함수를 받아 새로운 함수를 반환합니다. 이를 호출하면 먼저 g를 실행한 다음 그 결과를 f에 전달합니다.

순서가 중요합니다. 내부 함수가 먼저 실행되고, 외부 함수는 그 출력에 대해 실행됩니다.

local function compose(f, g)
  return function(x)
    return f(g(x))
  end
end

local function inc(n) return n + 1 end
local function dbl(n) return n * 2 end

local incThenDouble = compose(dbl, inc)
print(incThenDouble(3))

순서가 중요합니다

인수의 순서를 바꾸면 결과가 달라집니다. compose(f, g)는 먼저 g를 적용한 다음 f를 적용한다는 뜻입니다.

아래 예제에서는 두 배로 만든 다음 증가시키는 결과가, 증가시킨 다음 두 배로 만드는 결과와 다르다는 것을 보여 줍니다.

local function compose(f, g) return function(x) return f(g(x)) end end
local function inc(n) return n + 1 end
local function dbl(n) return n * 2 end

print(compose(dbl, inc)(3))
print(compose(inc, dbl)(3))

문자열 함수 합성하기

함수 합성은 문자열 변환을 포함해 모든 단일 인수 함수에서 작동합니다. 다듬기, 대소문자 변환 또는 뒤집기를 하나의 재사용 가능한 단계로 연결할 수 있습니다.

여기서는 reverse가 먼저 실행되고 upper가 다음에 실행되어, 대문자로 변환된 뒤집힌 문자열을 만듭니다.

local function compose(f, g) return function(x) return f(g(x)) end end

local shout = compose(string.upper, string.reverse)
print(shout("lua"))

여러 함수 합성하기

두 개보다 많은 함수를 연결하려면 가변 인수를 받는 composeAll을 작성합니다. 중첩 호출과 마찬가지로 오른쪽에서 왼쪽 순서로 함수를 적용합니다.

반복문은 함수 목록을 뒤에서부터 순회하며 각 함수를 통해 값을 차례로 전달합니다.

local function composeAll(...)
  local fns = {...}
  return function(x)
    for i = #fns, 1, -1 do
      x = fns[i](x)
    end
    return x
  end
end

local f = composeAll(function(n) return n + 1 end,
  function(n) return n * 2 end,
  function(n) return n - 3 end)
print(f(10))

오른쪽에서 왼쪽으로

composeAll(a, b, c)에서는 가장 오른쪽 함수인 c가 먼저 실행되고, 그다음 b, a가 실행됩니다. 이는 중첩 형태인 a(b(c(x)))와 같습니다.

순서를 읽기가 어려울 수 있으므로, 어떤 사람들은 대신 왼쪽에서 오른쪽으로 읽는 파이프를 선호합니다.

왼쪽에서 오른쪽으로 연결하기

pipe는 읽는 순서를 반대로 합니다. 함수가 작성된 순서대로 왼쪽에서 오른쪽으로 실행됩니다. 많은 사람이 데이터 파이프라인에서는 이 방식이 더 따라가기 쉽다고 생각합니다.

반복문은 앞에서부터 순회하며 현재 값에 각 함수를 적용합니다.

local function pipe(...)
  local fns = {...}
  return function(x)
    for i = 1, #fns do
      x = fns[i](x)
    end
    return x
  end
end

local process = pipe(function(n) return n + 1 end,
  function(n) return n * 2 end)
print(process(5))

가독성을 위한 파이프

pipe를 사용하면 단계가 실행 순서대로 위에서 아래로 읽힙니다. 따라서 여러 단계의 변환 과정을 코드만 보고도 이해할 수 있습니다.

여기서는 문자열에서 접두사 부분을 잘라 내고, 소문자로 변환한 다음, 뒤집습니다. 각 단계가 실행되는 순서대로 나열되어 있습니다.

local function pipe(...) local fns={...} return function(x) for i=1,#fns do x=fns[i](x) end return x end end

local transform = pipe(string.lower, string.reverse,
  function(s) return "[" .. s .. "]" end)
print(transform("LUA"))

클로저를 활용한 함수 합성

부분 적용이나 클로저로 만든 함수도 합성할 수 있습니다. 작고 특화된 함수를 만든 다음 서로 연결해 보세요.

이렇게 하면 각 부분을 테스트할 수 있고, 합성을 통해 전체 흐름을 표현할 수 있습니다.

local function pipe(...) local fns={...} return function(x) for i=1,#fns do x=fns[i](x) end return x end end
local function adder(n) return function(x) return x + n end end
local function muller(n) return function(x) return x * n end end

local calc = pipe(adder(3), muller(10))
print(calc(2))

함수 합성과 파이프라인

함수 합성은 데이터 파이프라인을 연결하는 역할을 합니다. 호출을 깊게 중첩하는 대신 합성된 함수에 한 번 이름을 붙이고 여러 입력에 적용할 수 있습니다.

이는 map과 함께 사용할 때 특히 효과적입니다. 합성된 함수를 각 항목에 적용할 변환 함수로 전달하면 됩니다.

local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function compose(f, g) return function(x) return f(g(x)) end end

local step = compose(function(n) return n + 1 end, function(n) return n * n end)
local r = map({1, 2, 3, 4}, step)
print(table.concat(r, ", "))

함수를 작게 유지하기

함수 합성은 작고 단일 목적을 가진 함수에 적합합니다. 각 함수가 한 가지 작업만 수행하므로, 로직을 다시 작성하지 않고도 여러 함수를 결합해 복잡한 동작을 만들 수 있습니다.

이것이 함수형 설계의 핵심입니다. 작은 함수들로 어휘를 구성한 다음 합성하여 더 큰 개념을 표현합니다.

빠른 확인

답하기 전에 실행 순서를 주의 깊게 따라가 보세요.

복습

함수 합성은 한 함수의 출력이 다음 함수의 입력으로 전달되도록 함수들을 결합합니다. compose(f, g)는 오른쪽에서 왼쪽으로 g를 실행한 다음 f를 실행하고, pipe는 가독성을 위해 왼쪽에서 오른쪽으로 실행합니다.

composeAll과 pipe를 사용하면 작은 함수들을 여러 개 연결해 명확한 파이프라인을 만들 수 있으며, map과 함께 사용하면 특히 강력합니다.

자주 묻는 질문

“함수 조합하기” 강의는 무료인가요?

네 — “함수 조합하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 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. map, filter, reduce
  3. 부분 적용
  4. 함수 조합하기
← Lua Academy(으)로 돌아가기