본문 바로가기

3.구현/Lua

4. Lua의 조건문 반복문

4. Lua의 조건문 반복문

ospace114@empal.com (작성일: 080121)

Lua에서 조건문과 반복문 종류는 총 4가지로 단순하다. 조건문은 if문이 있으며 반복문으로 while, repeat와 for문이 있다. 가장 많이 사용하는 명령어로만 단순화 시켰다.
물론 상황에 따라서 코딩을 최적화시켜서 깔끔한 코딩 스타일이 안될 수도 있지만 반면에 단순함에서 오는 장점도 있다.

IF 조건문

if문은 비교 조건에 따라서 참과 거짓으로 구분되어서 실행되는 명령문이다. 비교 조건은 앞에서 다룬 연산자중에서 비교연산자 부분을 참조하면 된다.

내용은 어렵지 않기 때문에 다음의 간단한 예를 보고 넘어 가겠다. 혹시나 해서 말하지만 if-else 구문에서 if 조건문이 참인 경우는 then이하의 명령을 실행하고 else나 혹은 end를 만나면 if문을 끝마친다. 그리고 조건문이 거짓이면 else문 이하 명령어가 실행된다.

i = 0 -- 변수 초기화
if i == 0 then -- i값이 0이면 다음 실행
  print("It's Zero.")
end

i = 1 --변수 초기화

if i == 0 then -- i가 0이면 then이하 실행 0이아닌 거짓이면 else이하 실행
  print("It's Zero.")
else
  print("It is't Zero.")
end

if i==0 then
  print("It's Zero.")
elseif i==1 then -- if문 안에 또 다른 if문이 있다.
  print("It's One.")
else
  print("Unknown")
end
apple  
apple 100  
100  
It's Zero.  
It is't Zero.  
It's One.  

While과 Repeat 반복문

반복문은 일련의 명령문을 일정한 회수동안 계속적으로 반복해서 실행하는 명령문이다.

while과 repeat의 차이는 while인 경우는 비교조건이 실행할 명령문 이전에 나오며 repeat인 경우는 먼저 실행할 명령문을 먼저 실행한 후에 비교조건이 나온다.
주의 할 것은 while은 비교 조건이 참인 경우는 계속 반복되지만 repeat은 비교 조건이 거짓인 경우에만 명령어를 반복 실행한다.

while

_비교 조건_

do  
  -- 명령어들  
end  

repeat  
  -- 명령어들  
until

_비교 조건_
a = 0 -- 변수 초기화
sum = 0

while a ~= 10 do -- ~=은 서로 값이 다른 경우 참이고 같으면 거짓
  sum = a + sum
  a = a + 1
end                   -- while 끝
print(sum) b = 0

sum = 0

repeat                -- repeat 시작
  sum = b + sum
  b = b + 1
until b == 10         -- b가 10이 되면 repeat 수행 종료
print(sum)

결과

45  
45  

아래 예제는 while문 중간에 return문을 이용해서 함수값을 반환하면서 while문도 종료되는 모습을 보여주고 있다.

function sum(a1, a2)
  local s = 0
  while a1 ~= -1 do
       s = a1 + s
       a1 = a1 + 1

       if a1 == a2 then
           return s
       end
  end
end 
print(sum(1, 10))
print(sum(1, 100))

결과

45  
4950  

For 반복문

for은 가장 많이 사용되는 반복으로 원하는 횟수만큼 명령어를 반복 수행할때 유용하다.

숫자형 For문

for 변수=초기화값,비교값 [,증가값] do  
     -- 명령어들  
end

for문 실행 처음에 단 한번만 초기화값에 의해 변수에 값이 저장되고 해당 변수로 비교값과 비교하여 같거나 작으면 참이 되며 for문에 있는 명령어를 실행하고, 다시 for 시작줄로 와서 변수를 증감값만큼에 의해서 값이 증가하고 그 결과 변수 값을 다시 비교값과 비교되어 참이면 명령어를 반복 수행하게 된다.

만약 증감갓이 없으면 기본 증가치인 1로 간주된다.

주의할 것은 for문 안에서 변수가 초기화되고 연산이 되는데 해당 변수 값은 for문 안에서만 유효하며 for문이 종료되면 유효한 값이 안된다.

for i=1,4 do -- 기본 증가치는 1이 된다
  print(i)
end

for i=1,4,2 do
  print(i)
end

print(i) -- i값은 for문에서만 유효하다

실행

1  
2  
3  
4  
1  
3  
nil  

제너릭 For문

for문 실행 처음에 단 한번만 초기화값에 의해 변수에 값이 저장되고 해당 변수로 비교값과 비교하여 참이면 for문에 있는 명령어를 실행하고, 다시 for 시작줄로 와서 변수를 증감연산에 의해서 값이 증가 혹은 감소 연산을 수행하고 그 결과 변수 값을 다시 비교 조건에 의해서 비교되어 참이면 명령어를 반복 수행하게 된다.

for 변수1 [, 변수2] in 반복함수 do  
  -- 명령어들  
end  

위의 반복함수는 for문이 실행식 한번씩 실행되며 그 결과 값은 차례로 변수1, 변수2에 저장된다.
반복함수 종류로는 5가지 종류가 있으며 사용자가 정의할 수도 있다.

  • pairs(table)
  • ipairs(table)
  • next()
  • io.lines()
  • file:lines()
  • Custom iterators

pairs(table)

이는 키-값의 쌍으로 이뤄진 반복함수로서 아래 for문에서 보듯이 앞에 변수에 키가 오며 다음 변수에는 키에 해당하는 값이 저장된다.

for key [, value] in pairs(테이블) do  
  -- 명령어들  
end  
v = { "a", "b", "c", pi = 3.14} 

-- paris(table)
for key,value in pairs(v) do
  print(key, value)
end

결과

1 a  
2 b  
3 c  
pi 3.14

결과에 보듯이 숫자와 문자로된 모든 키가 나열되고 있고 해당 값이 표시되었다. iparis은 pairs와 다른 것은 키가 아닌 인덱스를 사용하는게 틀리다.

iparis(table)

이는 인덱스-값 쌍으로 이뤄진 반복함수로 아래 for문 처럼 index라는 변수에 인덱스가 저장되며 value변수에 해당 인덱스의 값이 저장된다.

for index[, value] in ipairs(테이블) do  
  -- 명령어들  
end  
v = { "a", "b", "c", pi = 3.14} 

--ipairs(talbe)
for index,value in ipairs(v) do
  print(index, value)
end

결과

1 a  
2 b  
3 c  

결과를 보변 키 중에서 숫자로된 즉 인덱스만 나열되어 출력된다. 숫자가 아닌 키는 모두 생략된다.

추가로....

next(table[, index])  

next은 도우미 함수(helper function)으로 pairs에서 사용되는 함수이다. 간단히 설명하면 입력된 테이블(table)에서 현재 인덱스(지정안되면 1로 간주)에서 다음에 오는 키와 값 쌍을 반환한다.

아래와 같이 for문을 호출 하면 반복함수를 next로 사용하고 입력되는 테이블은 테이블변수가 되며 시작 위치로 nil(기본 값으로 1에서 시작)로 하고 종료는 next가 nil을 반환하면 끝낸다.

for key [, value] in next, 테이블변수, nil do  
  -- 명령어들  
end  
v = { "a", "b", "c", pi = 3.14} -- next
for key,value in next, v, nil do
  print(key, value)
end

결과

1 a  
2 b  
3 c  
pi 3.14  

io.lines()

io.output(io.open("my.txt","w"))
io.write("This is\nsome sample text\nfor Lua.")
io.close()
for line in io.lines("my.txt") do print(line) end

files:lines()

file = assert(io.open("my.txt", "r"))
for line in file:lines() do print(line) end
file:close()

Note: Explicitely, you have to open and close the file.

Custom iterator

사용자 정의 반복 함수를 생성하는 것으로서 관심이 있다면 다른 튜토리얼[3]을 참조하길 바란다.

참조

[1]http://www.lua.org
[2]http://lua-users.org/wiki/ForTutorial
[3]http://lua-users.org/wiki/IteratorsTutorial

반응형

'3.구현 > Lua' 카테고리의 다른 글

5. Lua 메타테이블(metatable)  (0) 2008.02.28
Lua 5.x와 Lua 4.0 호환성  (0) 2008.01.21
3. Lua의 각종 연산자들  (0) 2007.07.23
2. Lua 함수에 대해서  (0) 2007.07.20
루아의 BNF  (0) 2007.07.19