0Pricing
Lua Academy · 강의

map, filter, reduce

고차 함수를 위한 도우미를 만들어 보세요.

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

세 가지 핵심 도구

매핑, 필터링, 리듀스는 함수형 목록 처리의 핵심 도구입니다. 각각 목록과 함수를 받아, 반복문을 직접 작성하지 않고 결과를 반환합니다.

Lua에는 이 기능들이 기본 제공되지 않지만, 짧게 작성할 수 있으며 고차 함수가 어떻게 작동하는지 잘 보여 줍니다.

매핑: 각 항목 변환하기

매핑은 모든 요소에 함수를 적용하고 그 결과를 새 목록에 모읍니다. 원래 목록은 변경되지 않습니다.

전달하는 함수가 변환 방식을 결정하므로 하나의 map으로 각 항목을 두 배로 만들거나 제곱하거나 그 밖의 변환을 수행할 수 있습니다.

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

local r = map({1, 2, 3}, function(x) return x * x end)
print(table.concat(r, ", "))

매핑은 길이를 유지합니다

매핑은 항상 입력과 같은 개수의 요소를 가진 목록을 반환합니다. 모든 항목은 정확히 하나의 출력 항목으로 매핑됩니다.

항목을 제거해야 한다면 매핑이 아니라 필터링을 사용해야 합니다.

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

local names = {"ada", "lin", "sam"}
local caps = map(names, string.upper)
print(table.concat(caps, " "))
print(#caps)

필터링: 일부 항목만 유지하기

필터링은 술어가 참을 반환하는 요소만 유지합니다. 술어는 불리언 값을 반환하는 함수입니다.

결과는 원래 목록보다 짧을 수 있지만 더 길어질 수는 없는 새 목록입니다.

local function filter(t, pred)
  local out = {}
  for _, v in ipairs(t) do
    if pred(v) then out[#out + 1] = v end
  end
  return out
end

local evens = filter({1,2,3,4,5,6}, function(x) return x % 2 == 0 end)
print(table.concat(evens, ", "))

필터링은 순서를 유지합니다

필터링은 목록을 순서대로 순회하며 유지할 각 항목을 추가하므로, 남은 요소는 원래 순서를 유지합니다.

#out + 1을 인덱스로 사용하면 결과가 중간에 빈자리가 없는 배열이 되며, Lua는 이를 올바른 순서열로 취급합니다.

local function filter(t, pred)
  local out = {}
  for _, v in ipairs(t) do
    if pred(v) then out[#out + 1] = v end
  end
  return out
end

local long = filter({"hi", "hello", "yo", "howdy"},
  function(s) return #s > 2 end)
print(table.concat(long, ", "))

리듀스: 하나로 결합하기

리듀스는 폴드라고도 하며, 목록을 하나의 값으로 축약합니다. 누산기를 유지하면서 사용자가 지정한 함수로 누산기와 각 요소를 결합합니다.

시작 값과 결합 함수를 지정하면 리듀스가 모든 항목을 거치며 누산기를 전달합니다.

local function reduce(t, f, acc)
  for _, v in ipairs(t) do
    acc = f(acc, v)
  end
  return acc
end

local sum = reduce({1,2,3,4}, function(a, x) return a + x end, 0)
print(sum)

리듀스로 최댓값 구하기

리듀스는 산술 연산에만 사용할 수 있는 것이 아닙니다. 결합 함수가 값을 비교하고 각 단계에서 더 큰 값을 유지하도록 만들 수도 있습니다.

누산기를 첫 번째 요소 또는 매우 작은 값으로 시작하면 리듀스로 최댓값을 깔끔하게 구할 수 있습니다.

local function reduce(t, f, acc)
  for _, v in ipairs(t) do acc = f(acc, v) end
  return acc
end

local product = reduce({1,2,3,4,5}, function(a, x) return a * x end, 1)
print(product)

함께 연결하기

세 가지 도구를 연결하면 진정한 강력함이 나타납니다. 필터링은 데이터를 좁히고, 매핑은 데이터를 변환하며, 리듀스는 데이터를 요약합니다.

각 단계는 작고 명확한 작업이며, 이들을 함께 사용하면 복잡하게 얽힌 수동 반복문을 대신할 수 있습니다.

local function reduce(t, f, acc)
  for _, v in ipairs(t) do acc = f(acc, v) end
  return acc
end

local max = reduce({3, 8, 2, 11, 6},
  function(a, x) if x > a then return x else return a end end, -math.huge)
print(max)

원본은 안전하게 유지됩니다

매핑과 필터링은 항상 새 테이블을 만들며 입력을 변경하지 않습니다. 따라서 데이터 처리 흐름을 예측하기 쉽고, 각 단계가 끝난 뒤에도 이전 데이터를 사용할 수 있습니다.

리듀스 역시 목록을 변경하지 않고 결합된 결과만 반환합니다.

local function filter(t, p) local o={} for _,v in ipairs(t) do if p(v) then o[#o+1]=v end end return o end
local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function reduce(t, f, a) for _,v in ipairs(t) do a=f(a,v) end return a end

local nums = {1,2,3,4,5,6}
local r = reduce(map(filter(nums, function(x) return x%2==0 end),
  function(x) return x*x end), function(a,x) return a+x end, 0)
print(r)

모든 목록에 적용할 수 있습니다

함수가 매개변수이므로 이러한 도구는 어떤 데이터에도 사용할 수 있습니다. 같은 map으로 문자열을 대문자로 바꾸고, 가격을 조정하고, 레코드 형식을 지정할 수 있습니다.

반복문은 한 번만 작성하고 다른 함수를 전달하는 것이 일급 함수가 유용한 정확한 이유입니다.

빠른 확인

이 연산들이 목록의 길이에 어떤 영향을 주는지 생각해 보세요.

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

local prices = {10, 20, 30}
local withTax = map(prices, function(p) return p * 1.18 end)
print(table.concat(withTax, ", "))

복습

매핑은 각 항목을 변환하면서 길이를 유지하고, 필터링은 술어를 통과한 항목을 유지하며, 리듀스는 누산기를 사용해 목록을 하나의 값으로 축약합니다.

필터링, 매핑, 리듀스를 연결하면 수동 반복문 없이 명확한 데이터 처리 흐름을 만들 수 있고, 원래 테이블도 변경되지 않습니다.

복습

매핑은 각 항목을 변환하면서 길이를 유지하고, 필터링은 조건식을 통과하는 항목을 유지하며, 리듀스는 누산기를 사용해 목록을 하나의 값으로 축약합니다.

필터링, 매핑, 리듀스를 연결하면 수동으로 반복문을 작성하지 않고도 명확한 데이터 처리 흐름을 구성할 수 있으며, 원래 표는 변경되지 않습니다.

자주 묻는 질문

“map, filter, reduce” 강의는 무료인가요?

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

“map, filter, reduce”에서 뭘 배우나요?

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

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

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

“map, filter, reduce” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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