사용자:Jesusmas/루아 강의/1

위키백과, 우리 모두의 백과사전.

루아 문장 구조와 자료형[편집]

루아는 문법이 단순합니다. 우리가 암기해야 할 사항이 다른 언어들보다 적으며, 몇 가지 사항들만을 철저히 공부한다면 정말 쉽게 프로그래밍을 할 수 있습니다. 특히 우리가 사용하는 Scribunto 확장은 공부해야 할 요소가 정말 적습니다.

문장 구조[편집]

루아에서 문장이라고 부를 수 있는 것들은 몇 종류가 되지 않습니다. 대체로 아래와 같은 정도만 알면 됩니다.

  • 지역변수 선언
  • 배정문
  • 함수 호출
  • 제어 구조

문장의 종류라는 것이 위의 네 가지입니다. 차차 공부하면 되며, 당장 배울 것은 배정문입니다.

배정문[편집]

단순 배정문[편집]

배정문은 변수에 어떤 값을 배정해 주는 문장입니다. 특별히 설명할 것이 없이, 예시를 보겠습니다.

a=1 --이것은 배정문이며
b=2 --이것도 배정문이며
c=a+b --이것도 배정문인데, c는 3이 됩니다.

재미있는 것은 루아에서는 줄 바꿈이 아무런 기능을 하지 않는다는 점입니다. 줄을 바꾸어 쓰나 띄어 쓰나 차이가 없습니다.

a=1 b=2 c=a+b--이렇게 해도 같으며

문장 뒤에 세미콜론을 쓰든 쓰지 않든 같습니다.

a=1; b=2; c=a+b;--세미콜론을 쓸 수도 있습니다.

또는,

a
=
1
b=2 c=a+b--이렇게 해도 같습니다.

배정문에서는 등호를 기준으로 좌변에 변수를, 우변에 배정할 값이나 그 값을 계산할 식을 써 주면 됩니다. 변수는 값을 저장해 줄 수 있는 일종의 용기와 같은 것이라고 생각하시면 됩니다. 앞으로 계속 강조 하겠지만, 루아에서는 변수에는 형이 없으며, 형을 지정하는 방법도 없습니다. 값에만 형(type)이 있습니다.

물론, 다른 언어들과 마찬가지로 새로운 값을 저장해 주면 기존 값은 기억하지 않습니다.

a=1 --지금 a는 1이지만,
a="Hello" --이제는 더이상 1을 저장하고 있지 않습니다.

변수 a에 저장되어 있는 값이 수치 1에서 문자열 Hello로 변했습니다. 이렇게 변수가 저장하고 있던 값과 형이 다른 값을 새로 저장하는 것이 가능합니다. 그러나 일반적으로 한 변수에 저장하는 값들의 형을 자주 바꾸는 것은 권장되지 않습니다. 그러한 프로그래밍은 생각할 것을 많게 만들고 쓰기 복잡하게 됩니다. 왜 그렇게 되는지는 앞으로 진행하면서 설명하게 될 것입니다.

다중 배정문[편집]

루아에 있는 다중 배정문은 좌변 혹은 우변이 둘 이상의 변수 혹은 값을 가지는 특수한 배정문입니다. 이것은 다른 언어들에서 보기 드문데, 잘 사용하면 유용합니다.

a, b, c = 3, 5, 8 -- a는 3, b는 5, c는 8이 됩니다.

다중 배정문에서는 반드시 좌변의 변수의 수만큼 우변의 값이 채워집니다. 우변의 값이 모자라면 값이 없다는 의미의 nil을 채우며, 우변의 값이 남으면 남는 값들은 버려집니다.

a, b, c = 3, 5 -- a는 3, b는 5, c는 nil이 됩니다. nil은 유용한 값이 없다는 뜻입니다.
a, b, c = 3, 5, 8, 13, 21 -- a는 3, b는 5, c는 8이 되며, 13과 21은 버려집니다.

다중 배정문의 용도는 대개 두 가지입니다. 첫번째의 경우는 값을 맞바꾸는 것입니다.

a=2
b=3
a, b = b, a --이러한 맞교환이 가능합니다.

위와 같이 하면 값을 맞바꾸는 것이 가능합니다. 별 것 아니라고 생각하실지도 모르나 대부분의 언어에서는 값을 맞바꾸기 위해서는 어떤 절차를 거쳐야 하는데 그것이 생략되었습니다.

다른 하나는 함수의 값을 받을 때입니다.

a, b = f(1) -- f가 함수이고 둘 이상의 값을 리턴하면 첫째 값이 a, 둘째 값이 b에 저장되며 그 이후의 값은 버려집니다.

나중에 설명하겠지만 루아의 함수는 둘 이상의 값을 리턴할 수 있습니다. 심지어는 함수가 몇 개의 값을 리턴해야 하는지 미리 정할 필요도 없으며, 어떠한 형의 값을 리턴할지도 미리 정해둘 필요가 없습니다.

자료형[편집]

소개에서 설명했지만 루아에서 자료형은 8 종류입니다. 그 중에서 위키백과에서 사용 가능한 것은 6 종류이며 아래와 같습니다.

  • nil
  • boolean
  • number
  • string
  • table
  • function

이 중에서 여기에서 설명할 것은 nil, boolean, number입니다.

nil[편집]

nil은 무(無)의 값을 가지는 자료형입니다. nil 형에는 오로지 nil이라는 값밖에 존재하지 않으며, 그 표시는 nil로 합니다. nil은 유용한 값이 없다는 의미입니다. 예시를 보겠습니다.

a=1 -- a는 1의 값을 가지고 있었지만, 
a=nil --[[이제는 nil의 값을 가집니다.
        다시 말하면, 아무런 유용한 값을 가지지 않습니다.
        더 쉽게 이야기하면, 있으나 마나한 값을 가집니다.]]

nil이 가지는 특성으로는,

  • 논리에 관한 판별이나 연산을 할 때 nil은 거짓인 것으로 봅니다.
  • 전역 변수에 nil의 값이 배정되면 그 전역 변수는 버려집니다.
  • 테이블의 키(key)에, nil의 값(value)이 배정되면 그 키는 버려집니다.
  • 테이블의 키(key)가 nil이 될 수는 없습니다.

아직까지 전역 변수나 테이블에 대해 배우지 않았기 때문에 완전히 이해할 필요는 없습니다. 예를 들면,

a=nil

if a then --거짓이므로
        str = "I have many friends."
else
        str = "I have few friends." --이쪽이 실행됩니다.
end

또한 논리 연산에서 아래와 같이 됩니다.

a = nil or 20 -- 20
b = 20 or nil -- 20
c = nil and 30 -- nil
d = 30 and nil -- nil
e = nil and false -- nil
f = false and nil -- false
g = nil or false -- false
h = false or nil -- nil
i = not nil -- true
j = not not nil -- false

boolean[편집]

boolean은 우리가 흔히 알고 있는 논리학의 참과 거짓의 값을 가지는 형입니다. 부울형이라고도 부릅니다. boolean에는 두 개의 값이 존재하는데 truefalse입니다. 우리가 알고 있는 참, 거짓과 다를 것이 없기 때문에 크게 설명할 내용은 없습니다. 다른 언어들과 달리 수치로 자동으로 변환되지도 않으며, 형변환을 하는 방법 또한 제공하고 있지 않습니다.

a = true or false -- true
b = true + false --이러한 식은 에러를 냅니다.
c = tonumber(true) --[[tonumber는 수치로 변환해 주는 기본 함수인데,
        이 경우에는 유효하게 수치로 변환해 줄 수 없다는 의미에서 nil을 돌려 줍니다.]]

따라서 다른 언어에서처럼 수치로 변환을 굳이 하고 싶다면 필요한 함수를 직접 만들어 주어야 합니다. 그러나 굳이 수치로 변환해 주는 방식을 만들어야 하는지는 의문입니다.

number[편집]

number는 배정도수치형입니다. 루아에서는 정수이든, 실수이든 모두 배정도의 수로 나타냅니다. 따라서 정수를 나타내는 별도의 형은 있지 않으며, 특별히 정수나 실수를 선언하는 방법도 없습니다. 따라서 수치 계산에서 특별히 고려해야 할 것이 따로 없습니다.

a = 4 --이것은 수치이며, 루아에서는 이렇게 표현해도 배정도입니다.
b = 23.0 -- 23이나 23.0이나 같습니다.
c = 2.3e-1 -- 0.23, 이렇게 표현하는 것을 E표기법이라고 합니다.
d = 2.3E5 -- 230000, 대문자를 쓸 수도 있습니다.
무한대와 NaN[편집]

루아에서 특별한 수치가 셋 있습니다. 그것들은 양의 무한대, 음의 무한대, 그리고 NaN(수 아님, Not a Number)입니다. 셋 모두 특별히 지칭하는 예약어가 없으며, 표현하는 방법을 별도로 제공합니다. 양의 무한대math.huge로 나타낼 수 있습니다. 음의 무한대는 -math.huge입니다. NaN은 수치로 표현할 수 없는 값들을 나태냅니다. 대표적인 것으로 0으로 나누기를 들 수 있습니다. 0/0 또는 1/0과 같은 식으로, NaN을 표현할 수 있습니다. 아래와 같은 주의사항은 기억해 두어야 합니다.

  • 테이블의 키(key)로 nil과 NaN을 사용할 수 없습니다.

type 함수[편집]

어떤 자료의 형을 알고 싶거나 구별하려면, type 함수를 이용할 수 있습니다. type 함수는 한 개의 항(argument)를 받아서, 그 형을 "nil", "number", "string", "boolean", "table", "function"이라는 문자열들 중 하나로 돌려 줍니다. 설명보다는 예시를 들면 이해가 쉬울 것입니다.

a=nil; b=3; c=true;
type(a) -- "nil"
type(b) -- "number"
type(c) -- "boolean"

type(type(a)) -- "string", type("nil")이므로
type(type(b)) -- "string", type("number")이므로
type(type(c)) --[["string", type("boolean")이므로
        무엇이든 type 함수를 두 번 이상 통과하면 문자열이 됩니다.
]]

c=22
type(c) --[["number", 루아에서 변수의 형은 고정되어 있지 않습니다.
        어떠한 값을 담고 있는가에 따라 형이 얼마든지 달라질 수 있습니다.]]

아직 함수는 배우지 않았지만, 함수인지를 확인한 이후에 실행하는 구문은 자주 이용합니다. 다른 언어와 달리 루아에서는 어떤 변수에 특정한 형이 배정되는 것이 아니고, 따라서 어떤 변수가 현재 함수를 담고 있는지 아닌지도 보장해 주지 않습니다.

type(f)=="function" and f(1) --[[f가 함수이면, f(1).
        f가 함수가 아니면 f(1)을 실행하지 않으므로, 오류는 발생하지 않습니다.]]
g=0 -- g에 수치가 들어 있는데,
g(1) --함수가 아닌 것을 호출하려는 시도는 오류입니다.

아직 테이블을 배우지 않았지만, 테이블에서도 같습니다.

type(t)=="table" and t[1] --[[t가 테이블이면, t[1].
        t가 테이블이 아니면 t[1]을 실행하지 않으므로, 오류는 발생하지 않습니다.]]
s=0 -- s에 수치가 들어 있는데,
s[1] --테이블이 아닌 것에 접근하려는 시도 역시 오류입니다.