Menu
CoddyTech

가변 인자 함수 (...)

Coddy Lua 여정의 논리와 흐름 제어 섹션에 포함된 레슨. 54개 중 11번째.

때로는 개수에 상관없이 인수를 처리할 수 있는 함수가 필요합니다. 두 개든, 세 개든, 열 개든 각 경우마다 별도의 함수를 작성하지 않고 합계를 계산하고 싶을 수도 있습니다. Lua는 이를 위한 특별한 구문인 점 세 개 ...를 제공합니다.

함수의 매개변수 목록에 ...를 넣으면, 임의의 개수의 인수를 받는 가변 인수 함수가 됩니다:

function sum(...)
    -- 함수 본문
end

함수 안에서 ...를 다시 사용하여 이러한 인수에 접근할 수 있습니다. 더 쉽게 다루려면 중괄호를 사용해 인수들을 테이블에 담을 수 있습니다:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- 출력: 30
print(sum(1, 2, 3, 4, 5))  -- 출력: 15

표현식 {...}은 함수에 전달된 모든 인수를 포함하는 목록형 테이블을 만듭니다. 그런 다음 길이 연산자 #나 ipairs()를 사용해 다른 테이블과 마찬가지로 이 테이블을 반복 순회할 수 있습니다.

인수가 nil이 아닌 한 이 방식은 작동합니다. nil은 테이블에 빈자리를 만들며, 빈자리가 있는 테이블에서는 #을 신뢰할 수 없습니다. select("#", ...)는 nil인 인수도 포함해 항상 인수의 개수를 반환합니다.

function countArgs(...)
    return select("#", ...)
end

print(countArgs(10, 20, 30))        -- 출력: 3
print(countArgs(10, nil, 30, nil))  -- 출력: 4
challenge icon

챌린지

쉬움

임의 개수의 숫자 인수를 받아 평균을 반환하는 함수 calculateAverage를 작성하세요.

가변 인수 구문 ...을 사용해 유연한 개수의 인수를 받고, 이를 테이블에 담아 합계를 계산한 다음 인수의 개수로 나누세요.

참고: 시작 코드는 ("Don't touch this code"라고 표시됨) 입력에서 숫자를 읽고, 각 값을 tonumber()를 사용해 텍스트에서 숫자로 변환한 다음 numbers라는 테이블에 저장합니다. 마지막에는 unpack(numbers)를 사용해 함수를 호출합니다. 이 함수는 테이블의 값을 각각의 인수로 전달하므로, 함수는 이를 ...로 받습니다. 이 코드를 수정하거나 자세히 이해할 필요는 없습니다. calculateAverage를 작성하는 데만 집중하세요.

논리:

  • {...}를 사용해 모든 인수를 테이블에 담기
  • 테이블을 순회하며 모든 숫자의 합계 계산하기
  • 평균을 구하기 위해 합계를 인수의 개수로 나누기
  • 평균을 숫자로 반환하기

매개변수:

  • ... (숫자): 개수가 정해지지 않은 숫자 인수

반환값: 제공된 모든 숫자의 평균 (숫자)

직접 해보기

-- 이 코드를 수정하지 마세요 --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- 여기에 코드를 작성하세요
end
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

논리와 흐름 제어의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러