시리즈:쉽게 배우는 프로그래밍 입문/Lua

Utolee90 (토론 | 기여)님의 2020년 10월 23일 (금) 02:02 판 (틀 내용 수정)

이 문서에서는 스크립트 언어로 사용하는 Lua(루아)에 대한 간단해 배워봅시다.

Lua는 어떤 언어인가?

Lua는 독립적으로 사용하기보다는 C언어 기반 프로그램에서 별도로 스크립트를 실행시키기 위한 목적으로 만든 언어입니다. 상당히 가볍지만 파이썬처럼 라이브러리가 풍부하지는 않아 범용성이 좋은 프로그래밍 언어로 평가받지는 않습니다.

여기 리브레 위키를 비롯한 미디어위키 기반의 위키들도 이 Lua라는 언어를 사용하고 있는데, 바로 Scribunto 확장기능의 모듈을 돌릴 때 이 언어로 작성된 프로그램을 이용합니다. Lua가 흔히 웹 개발에 활용되는 JavaScript보다 더 가볍기에 신속하게 페이지를 띄워야 하는 위키에 적합한 셈이죠.

특징

  • 대소문자 구별하며, 예약어는 모두 소문자로 시작합니다. 웬만하면 소문자로만 프로그램을 짜는 것을 권장합니다.
  • null에 해당되는 예약어는 nil입니다. 그리고 false와 nil 이외에 0 같은 숫자를 boolean 기준으로 참으로 처리합니다.
  • 자료 타입은 nil, boolean, number, string, function, table, userdata, thread가 있습니다.
    • boolean - 참/거짓을 가리키는 자료형입니다. true, false 값이 있습니다.
    • number - 숫자 타입입니다. Lua는 정수형과 실수형을 구별하지 않았기 때문에 모든 수치형을 내부적으로 부동소숫점 숫자로 처리했습니다. 다만 5.3버전부터는 정수형을 지원하기 시작했습니다.
    • string - 문자열 타입입니다. 작은따옴표로 묶거나 아님 여러 줄 문자열은 대괄호 2개를 써서 (문자열)로 표현가능합니다.
    • function - 함수 타입입니다. 특이하게도 Lua는 함수형 자체를 변수로 쓸 수 있습니다.
    • table - 테이블 타입입니다. 파이썬의 Dictionary나 PHP의 연관배열(Associative Array), 또는 자바스크립트의 오브젝트(Object)와 유사한 개념입니다. 중괄호를 사용하며, 키=값 형식으로 사용합니다. 예를 들면 {1='리브라', 2='리디버그'} 이런 식으로 테이블을 정의 가능합니다. 특징 하나는 키 값을 따로 지정하지 않으면 키값이 정수 1부터 차례대로 배열됩니다. 즉 거의 대다수의 C-family 언어와는 달리 인덱스가 1부터 시작합니다.
    • userdata - 사용자 정의 자료형입니다.

사용 방법

  1. 온라인 인터프리터를 사용해봅시다. Lua 공식 홈페이지 데모.
  2. 다운로드 링크에서 다운로드 받은 뒤 C 프로그램에 헤더 형식으로 호출해서 사용할 수 있습니다.
  3. LuaDist 프로그램을 다운로드한 뒤 bin/lua.exe를 실행시키면 됩니다. 다만 버전이 5.1 기반이라 최신 가반인 5.4에서 지원하는 정수형 등을 지원하지 않는 단점이 있습니다.

기초 문법

모든 프로그래밍 언어가 그렇듯 기초를 배우는 것이 중요합니다. 여기서는 Lua 공식 홈페이지 데모를 활용하겠습니다. 또한 여기서는 LuaDist나 Scribunto 확장기능을 사용하는 사람들을 배려해서 5.3 이상에서만 호환되는 정수형 문법 등은 사용하지 않으려고 합니다.

Hello World 출력

-- Hello World 출력
print('Hello World!')

주석

Lua는 한 줄짜리 주석은 문장 앞에 -- 표시를 한 뒤 한 칸 띄워서 표시합니다. 또한 여러 줄 주석은 -- [[...]]를 사용하면 됩니다.

위키 모듈을 만들어보자

위키 모듈의 장점은 바로 분기문으로 처리해야 하는 내용을 처리할 수 있기 때문입니다.

BananaArgs 예제

모듈:BananaArgs를 이용해서 위키에서 Lua 모듈이 어떻게 동작하는지 파악해봅시다.

1. 우선 미디어위키 루아 모듈은 local 키워드를 이용해서 내부적으로 사용할 빈 테이블을 정의합니다. 이 테이블에서 루아 모듈을 정의할 겁니다.

local p ={}

2. 각 모듈에서 출력하고 싶은 내용은 테이블 p 안의 함수로 정의합니다. 예를 들면 입력값 하나도 없이 출력하는 함수를 정의하고 싶으면 다음과 같이 입력하시면 됩니다.

-- 출력시에는 이런 식으로 씀: {{#invoke:BananasArgs|hello_world}}
function p.hello_world()
    return "Hello, world!"
end

3. 매개변수가 있는 경우에는 다음과 같이 함수를 정의하시면 됩니다.

-- 한개의 매개변수
-- 이런 식으로 씀: {{#invoke:BananasArgs|hello|민준}}
function p.hello(frame)
    local name = frame.args[1]
    return "안녕하세요, " .. name .. "님!"
end

4. 매개변수가 2개 이상 있을 때에는 다음과 같이 함수를 정의하시면 됩니다. 중요한 것은 함수에서 입력값을 여러 개 입력하는 방식이 아닌 frame이라는 테이블 하나를 입력값으로 받는다는 점입니다.

-- 두개의 매개변수
-- 이런 식으로 씀: {{#invoke:BananasArgs|add|5|3}}
function p.add(frame) -- 입력 변수를 테이블 하나로 처리.
    local num1 = tonumber(frame.args[1]) 
    local num2 = tonumber(frame.args[2])
    return num1 + num2
end

5. 매개변수에 이름을 부여하고 싶을 때는 다음과 같이 테이블에 키값을 지정하면 됩니다. 참고로 매개변수에 이름을 부여하는 방식과 숫자만 사용하는 방식을 섞어서 사용할 수 있습니다.

-- 이름을 가진 매개변수
-- 이런 식으로 씀: {{#invoke:BananasArgs|count_fruit|바나나=5|사과=3}}
function p.count_fruit(frame)
    local num_bananas = frame.args['바나나']
    local num_apples = frame.args['사과']
    return '저는 바나나 ' .. num_bananas .. '개와 사과 ' .. num_apples .. '개를 가지고 있습니다.'
end

6. Lua 모듈의 매우 좋은 점은 for문과 frame.args 조합을 통해 매개변수 자체도 호출이 가능하다는 겁니다. 다시 말해 매개변수명을 제한된 형태가 아닌 임의의 형태로도 호출할 수 있다는 것이지요.

-- 매개변수를 반복해서 읽기
-- 이런 식으로 씀: {{#invoke:BananasArgs|custom_fruit|파인애플=10|키위=5}}
function p.custom_fruit(frame)
    local result = '저는'
    for name, value in pairs(frame.args) do
        result = result .. ' ' .. name .. ' ' .. value .. '개'
    end
	result = result .. '를 가지고 있습니다.'
    return result
end

7. 마지막으로 중요한 것! 바로 return p라는 명령어를 입력해서 모듈은 값을 반환해주어야 합니다. 그래야 Lua 모듈을 사용할 수 있습니다.

모듈 사용할 때는 호출, 또는 invoke 태그를 사용합니다. {{#호출:BananaArgs|(함수명)|(변수명)}} 같은 형식을 사용합니다. 예를 들면 아래와 같이 입력해봅시다.

{{#호출:BananaArgs|hello|{{사용자}}}}

그럼 결과는 다음과 같이 출력됩니다 : 스크립트 오류: "BananaArgs" 모듈이 없습니다.

참조

틀:쉽게 배우는 프로그래밍 입문