값으로서의 함수
함수를 저장하고 전달해 보세요.
값으로서의 함수은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
함수는 일급 값입니다
Lua에서 함수는 일급 값입니다. 즉, 함수도 일반적인 데이터처럼 취급됩니다. 함수를 변수에 저장하고, 다른 함수에 전달하고, 반환하거나, 테이블에 보관할 수 있습니다.
이 하나의 개념이 모든 함수형 프로그래밍의 기반이 됩니다. 함수를 숫자나 문자열처럼 다루면 유연하고 재사용 가능한 도구를 만들 수 있습니다.
변수에 함수 저장하기
함수에 지정하는 이름은 실제로 함수 값을 담고 있는 변수일 뿐입니다. 해당 값을 다른 변수에 자유롭게 할당할 수 있습니다.
아래의 두 이름은 같은 함수를 가리키므로 어느 이름으로 호출하든 같은 코드가 실행됩니다.
local function greet(name)
return "Hello, " .. name
end
local hi = greet
print(greet("Ada"))
print(hi("Lin"))이름 없는 함수
함수를 만들 때 이름이 반드시 필요한 것은 아닙니다. 이름 없는 함수는 function ... end 구문으로 작성하며, 값으로 직접 사용할 수 있습니다.
이 함수를 지역 변수에 할당하는 것은 일반적인 함수 정의와 같지만, 함수를 해당 위치에 직접 작성한다는 차이가 있습니다.
local square = function(x)
return x * x
end
print(square(5))
print(square(9))인수로 사용하는 함수
함수도 값이므로 다른 함수에 전달할 수 있습니다. 다른 함수를 인수로 받는 함수를 고차 함수라고 합니다.
여기서 apply는 실행할 함수를 전달받기 전까지 어떤 작업을 수행할지 알지 못합니다.
local function apply(f, x)
return f(x)
end
local function double(n) return n * 2 end
print(apply(double, 10))
print(apply(function(n) return n + 1 end, 10))함수 반환하기
함수는 다른 함수를 반환할 수 있습니다. 이를 통해 전달한 인수로 설정된 함수를 필요할 때마다 만들 수 있습니다.
아래에서 multiplier는 호출될 때마다 새 함수를 만들고, 전달받은 배수를 기억합니다.
local function multiplier(factor)
return function(x)
return x * factor
end
end
local triple = multiplier(3)
print(triple(4))
print(multiplier(10)(5))클로저가 변수를 캡처합니다
반환된 함수가 이를 감싼 함수의 지역 변수를 사용하면 해당 변수를 캡처합니다. 함수와 캡처한 변수의 묶음을 클로저라고 합니다.
캡처된 factor는 바깥 함수의 호출이 끝난 뒤에도 클로저가 존재하는 동안 계속 유지됩니다.
local function counter()
local n = 0
return function()
n = n + 1
return n
end
end
local next = counter()
print(next())
print(next())
print(next())테이블에 함수 저장하기
테이블에는 다른 값과 마찬가지로 함수를 저장할 수 있습니다. Lua가 모듈과 객체를 만드는 방식도 이와 같습니다. 테이블이 이름과 함수 값을 연결합니다.
키로 함수를 찾아 호출하거나, 연산 테이블을 순회할 수도 있습니다.
local ops = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end
}
print(ops.add(2, 3))
print(ops["sub"](9, 4))전략 테이블
테이블에 함수를 저장하면 실행 중에 키를 사용해 동작을 선택할 수 있습니다. 이 방법은 긴 if-else 연쇄를 깔끔한 조회로 바꿉니다.
이름으로 연산을 선택하면 호출하는 코드가 짧아지고 새 키를 추가해 확장하기도 쉽습니다.
local dispatch = {
upper = string.upper,
lower = string.lower,
rev = string.reverse
}
local function run(name, s)
return dispatch[name](s)
end
print(run("upper", "lua"))
print(run("rev", "lua"))콜백
콜백은 나중에 호출되도록 전달하는 함수입니다. Lua의 표준 라이브러리도 이 패턴을 사용합니다. 예를 들어 table.sort는 비교 함수를 받습니다.
콜백이 규칙을 결정하고, 라이브러리가 반복과 재배열을 처리합니다.
local nums = {5, 2, 9, 1}
table.sort(nums, function(a, b)
return a > b
end)
print(table.concat(nums, ", "))함수에는 고유성이 있습니다
모든 함수 값은 서로 구별되는 객체입니다. 서로 다른 함수 리터럴 두 개는 같은 코드를 포함하더라도 절대 같지 않습니다.
하지만 하나의 함수를 두 변수에 저장하면 두 이름이 같은 값을 가리키므로 서로 같다고 비교됩니다.
local f = function() return 1 end
local g = function() return 1 end
local h = f
print(f == g)
print(f == h)이것이 중요한 이유
함수를 값으로 다루면 범용 도구를 한 번만 작성하고, 전달하는 함수로 동작을 사용자 지정할 수 있습니다. 매핑, 필터링, 부분 적용, 함수 합성이 모두 이 원리를 활용합니다.
이 과정의 나머지 부분에서는 일급 함수와 클로저를 바탕으로 실용적인 패턴을 만들어 봅니다.
빠른 확인
Lua의 일급 함수에 대한 이해도를 확인해 보세요.
복습
Lua의 함수는 일급 값입니다. 함수를 변수와 테이블에 저장하고, 인수로 전달하며, 다른 함수에서 반환할 수 있습니다.
감싸고 있는 함수의 지역 변수를 캡처하는 함수를 반환하면 클로저가 만들어집니다. 이러한 개념은 앞으로 살펴볼 모든 함수형 패턴의 기반입니다.
자주 묻는 질문
“값으로서의 함수” 강의는 무료인가요?
네 — “값으로서의 함수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“값으로서의 함수”에서 뭘 배우나요?
함수를 저장하고 전달해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“값으로서의 함수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 값으로서의 함수
- map, filter, reduce
- 부분 적용
- 함수 조합하기