우리는 ìžëª…종 ì†Œë¦¬ì— ì˜í•´ì„œê°€ ì•„ë‹ˆë¼ ìƒˆë²½ì—ì˜ ë¬´í•œí•œ 기대ê°ìœ¼ë¡œ 깨어나는 ë²•ì„ ìµí˜€ì•¼ í•˜ê³ ë˜í•œ 스스로 늘 깨어 있어야만 한다. ―헨리 ë°ì´ë¹„드 ë„로(美 작가)

Contents
- 1 루아(lua)란?
- 2 ë°ì´íƒ€ 타입
- 3 변수
- 3.1 숫ìž
- 3.1.1 ìˆ«ìž -> 문ìžì—´ 변환
- 3.2 문ìžì—´
- 3.2.1 문ìžì—´ ì œì–´ 함수들
- 3.2.1.1 string.byte (s, [, i])
- 3.2.1.2 string.char (i1, i2, ...)
- 3.2.1.3 string.find (s, pattern [, init [, plain]])
- 3.2.1.4 string.len (s)
- 3.2.1.5 string.lower(s)
- 3.2.1.6 string.rep (s, n)
- 3.2.1.7 string.sub (s, i [, j])
- 3.2.1.8 string.upper(s)
- 3.2.1.9 string.format(formatstring, e1, e2, ...)
- 3.2.1.10 string.gfind (s, pat)
- 3.2.1.11 string.gsub (s, pat, repl [, n])
- 4 í…Œì´ë¸”
- 5 함수
- 5.1 í…Œì´ë¸” ì•ˆì— í•¨ìˆ˜ 내장하기 : 메소드
- 6 ì œì–´ë¬¸
- 7 기타 추가 함수들
1 루아(lua)란? #
ì›ëž˜ëŠ” C/C++ í”„ë¡œê·¸ëž¨ì— ë‚´ìž¥ë˜ì–´ì„œ 실행ë˜ëŠ” "기ìƒì ì¸" 스í¬ë¦½íЏ 엔진입니다만, 현재 pixels 팀ì—서 ê°œë°œì¤‘ì¸ PAGE(Pixelz Accessible Game Engine) 엔진ì—서는 마치 ë””ë ‰í„°ì˜ ë§ê³ 언어와 ê°™ì´ ê²Œìž„ ë‚´ë¶€ ë¡œì§ ë° íë¦„ì„ ê¸°ìˆ í•˜ëŠ” 스í¬ë¦½íЏ 언어로서 사용ë˜ê³ 있습니다. íŠ¹ì§•ì€ ë‹¤ìŒê³¼ 같습니다.
- C/C++ì˜ ì½”ë“œë¥¼ ì´ì‹í•˜ê¸° 쉽다. ì´ê²ƒì€ 엔진작업/스í¬ë¦½íЏ(ê²Œìž„ì œìž‘)ìž‘ì—…ì˜ ë¶„ì—…í™”ë¥¼ 가능하게 í•´ì¤ë‹ˆë‹¤. (ë¬¼ë¡ , 반대로 루아 코드를 C/C++ìƒì—서 실행하는 ê²ƒë„ ê°€ëŠ¥í•˜ë‹¤.)
- ë™ì¢… 스í¬ë¦½íЏ 언어 중ì—서는 ìµœê°•ì˜ ì†ë„와 íš¨ìœ¨ì„ ìžëž‘한다.
- tableì´ë¼ëŠ” ê°•ë ¥í•œ ì—°ê´€ë°°ì—´ì„ ì§€ì›í•©ë‹ˆë‹¤. ì´ê²ƒì€ 스í¬ë¦½íЏ ì œìž‘ì‹œ ìžë£Œì˜ ì •ë¦¬ë¥¼ ìƒë‹¹ížˆ ìš©ì´í•˜ê²Œ í•´ì¤ë‹ˆë‹¤.
- ë¬¸ë²•ì´ ê°„ë‹¨í•©ë‹ˆë‹¤. ë°ì´íƒ€ íƒ€ìž…ì´ ì¡´ìž¬í•˜ì§€ë§Œ 사용시ì—는 숫ìž, 문ìžì—´ ì •ë„ë§Œ 구분하면 ë˜ë©° ì™ ë§Œí•œ 경우는 ìžë™ìœ¼ë¡œ ë³€í™˜ì„ ìˆ˜í–‰í•œë‹¤.
- 스í¬ë¦½íЏ 언어ë¼ë©´ 모ë‘ê°€ ê°€ì§€ê³ ìžˆëŠ” 개비지 ì½œë ‰ì…˜ì´ ì¡´ìž¬í•©ë‹ˆë‹¤. 즉, 사용ë˜ì§€ 않는 메모리는 ì¼ì •ì •ë„ ì°¨ê²Œ ë˜ë©´ ìžë™ìœ¼ë¡œ í•´ì œí•´ë²„ë¦½ë‹ˆë‹¤. (ì´ê²ƒì€ ì„±ëŠ¥ì €í•˜, ì§ì ‘ì ì¸ ë©”ëª¨ë¦¬ ê´€ë¦¬ì˜ ì–´ë ¤ì›€ë“±ì˜ ë‹¨ì ì„ ë§Œë“니다) 다행히, 루아 5.0ì´í›„ë²„ì ¼ì—서는 ì´ ê°œë¹„ì§€ ì»¬ë ‰ì…˜ ì²˜ë¦¬ì˜ í•œë„를 ì¡°ì •í• ìˆ˜ 있어 ì´ í˜„ìƒì„ ì¼ì–´ë‚˜ì§€ 않ë„ë¡ ë§Œë“¤ 수 있습니다.
- PAGEì—서는 가급ì ëŒ€ìš©ëŸ‰ì˜ ë©”ëª¨ë¦¬ë¥¼ 사용하는 경우(예를 들면, 비트맵 ë°ì´íƒ€ 로딩)는 ëª¨ë‘ C/C++ 쪽으로 ë¹¼ë²„ë ¸ìŠµë‹ˆë‹¤. 즉, 메모리 사용한ë„는 루아ìƒì—서 ì„ ì–¸í•œ 변수들만 ê³ ë ¤í•˜ë©´ ë©ë‹ˆë‹¤. (메모리 관리 참조)
- ê°„ë‹¨í•˜ê³ ì‹¬í”Œí•œ ëŒ€ì‹ , ì§€ì›ë˜ëŠ” 함수가 ì •ë§ë¡œ 기본ì ì¸ ê²ƒë°–ì— ì—†ìŠµë‹ˆë‹¤.
2 ë°ì´íƒ€ 타입 #
- 루아는 다ìŒê³¼ ê°™ì€ 6가지 ë°ì´íƒ€ íƒ€ìž…ì´ ìžˆìŠµë‹ˆë‹¤.
- nil : ì•„ë¬´ê²ƒë„ ì•„ë‹Œ 텅빈 ê°’ì„ ì˜ë¯¸í•©ë‹ˆë‹¤. ì¼ë°˜ì 으로 변수를 ì´ˆê¸°í™”í• ë•Œ 사용합니다.
- number : 0, 3.1415927 ê³¼ ê°™ì€ ì‚¬ì¹™ì—°ì‚°ì´ ê°€ëŠ¥í•œ ëª¨ë“ ìˆ«ìžê°’ì„ ì˜ë¯¸í•©ë‹ˆë‹¤.
- string : ë§ê·¸ëŒ€ë¡œ 문ìžì—´ìž…니다. ë£¨ì•„ì˜ ê¸°ë³¸íƒ€ìž…ì´ë©°, 스í¬ë¦½íЏìƒì—서는 " 문ìžë¡œ 둘러싸 ì§€ì •í•©ë‹ˆë‹¤. (예: "1234", "redpixel1111")
- userdata : C/C++ê³¼ì˜ êµë¥˜ë¥¼ 위해 존재하는 타입입니다. PAGEë‚´ì—서는 핸들ì´ë¼ê³ ì§€ì •í•˜ëŠ” ê²ƒë“¤ì´ ë°”ë¡œ ì´ íƒ€ìž…ìž…ë‹ˆë‹¤. 스í¬ë¦½íŠ¸ë¥¼ ìž‘ì„±í• ë•Œ ì§ì ‘ ê°’ì„ ì œì–´í• ê²½ìš°ëŠ” ë“œë¬¼ê³ ë³´í†µ 엔진ì—서 ì œê³µë˜ëŠ” 함수를 통해서 ì„¤ì •í•˜ê³ ë³€ê²½, í•´ì œí•˜ê²Œ ë©ë‹ˆë‹¤.
- function : 루아ì—서는 í•¨ìˆ˜ë„ í•˜ë‚˜ì˜ ê°’ìœ¼ë¡œ 취급합니다. 즉, function으로 ì„ ì–¸ë˜ë©´ ì‹¤í–‰ë„ ë˜ì§€ë§Œ function íƒ€ìž…ì˜ ë³€ìˆ˜ì— ëŒ€ìž…ë„ ê°€ëŠ¥í•©ë‹ˆë‹¤. (tableê³¼ 연합하여 사용하면 매우 ê°•ë ¥í•´ì§‘ë‹ˆë‹¤)
- table : 루아ì—서 ì œê³µí•˜ëŠ” ìµœê°•ì˜ ë²”ìš© ìžë£Œêµ¬ì¡° 타입입니다. 다른 타입으로 ë³€í™˜ì´ ë¶ˆê°€ëŠ¥í•˜ë©°, 조금 ì‚¬ìš©ë²•ì´ ë³µìž¡í•©ë‹ˆë‹¤. (차후 설명)
3 변수 #
- 루아ì—서 변수란 "ì–´ë–¤ ê°’ì„ ë‹´ê³ ìžˆëŠ” ê²ƒì˜ ëª…ì¹"으로 ì •ì˜í•©ë‹ˆë‹¤. 즉, 앞서 설명한 ë°ì´íƒ€ íƒ€ìž…ì˜ ê°’ì€ ëª¨ë‘ ë³€ìˆ˜ì— ì €ìž¥ë©ë‹ˆë‹¤.
- 루아ì—서는 다중 ëŒ€ìž…ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.
x = y = 10 -- x와 yì— ë™ì‹œì— 10ì„ ëŒ€ìž… z = 20 x, z = z, x -- x와 zì˜ ê°’ì„ êµí™˜. 즉, x는 20, z는 10ì´ ë‹´ê¸°ê²Œ ë¨. y, z = 5, 7 -- y = 5; z = 7ê³¼ ë™ì¼
3.1 ìˆ«ìž #
- ë‹¤ìŒ ì˜ˆì œì™€ ê°™ì€ ì—°ì‚°ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.
a = 10 + 4 -- ë§ì…ˆ b = 5 * 5 -- 곱셈 c = 10 - 40.4 -- 뺄셈 d = 55 / 5.3 -- 나눗셈 e = 10 ^ 3 -- ê±°ë“ì œê³±. 결과는 1000.
- ì°¸ê³ : 나머지는 math ê°ì²´ì˜ mod() 함수를 사용해서 êµ¬í• ìˆ˜ 있습니다. (math ë¼ì´ë¸ŒëŸ¬ë¦¬ 참조)
3.2 문ìžì—´ #
- 루아ì—ì„œì˜ ë¬¸ìžì—´ë‚´ì—서 글ìžì— 대한 ì¸ë±ì‹±ì€ 1부터 시작합니다. (C언어와 ê°™ì´ 0ì´ ì•„ë‹ˆë‹¤. 헛갈리지 ë§ ê²ƒ.)
- ìŒìˆ˜ ì¸ë±ì‹±ë„ 허용하는ë°, ì´ë•Œì—는 문ìžì—´ì˜ 맨 ëì—서부터 ì—으로 ì¸ë±ì‹±ì„ 하게 ë©ë‹ˆë‹¤. (예를 들면, -1ì€ ë¬¸ìžì—´ì˜ 맨 마지막 문ìžë¥¼ 나타냅니다.)
- ë‘ê°œì˜ ë¬¸ìžì—´ì˜ ë³‘í•©ì€ ".." ì—°ì‚°ìžë¥¼ 사용합니다. 다ìŒì€ ë‘ê°œì˜ ë¬¸ìžì—´ì„ í•©ì³ ì¶œë ¥í•˜ëŠ” 예입니다.
a = "whitepixel" b = "바보" c = a..b print(c) -- "whitepixel바보"ê°€ ì¶œë ¥ëœë‹¤
3.2.1 문ìžì—´ ì œì–´ 함수들 #
- ì´ ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 문ìžì—´ê´€ë¦¬ë¥¼ 위한 검색, 부분 문ìžì—´ì˜ 추출, 패턴 ëŒ€ìž…ë“±ë“±ì„ ì§€ì›í•˜ëŠ” ì¼ë°˜ í•¨ìˆ˜ë“¤ì„ ì œê³µí•œë‹¤.
- 문ìžì—´ ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ ëª¨ë“ í•¨ìˆ˜ëŠ” í…Œì´ë¸” stringë‚´ì— ëª¨ë‘ ë‹´ê²¨ìžˆë‹¤.
3.2.1.1 string.byte (s, [, i]) #
- 문ìžì—´ sì˜ i번째 문ìžì˜ ë‚´ë¶€ 숫ìžë¡œ 표현ëœ(예를 들면, 아스키 코드) 코드를 반환한다. ë§Œì¼ i를 ì§€ì •í•˜ì§€ 않으면 1로 간주ëœë‹¤. i는 ë¬¼ë¡ ìŒìˆ˜ë¡œ ì§€ì •ë 수 있다.
3.2.1.2 string.char (i1, i2, ...) #
- 0 ì´ìƒì˜ ì •ìˆ˜ë§Œì„ ì¸ìžë¡œ 받는다. ê°ê°ì˜ 숫ìžê°€ 나타내는 ì½”ë“œì— í•´ë‹¹ë˜ëŠ” 문ìžë¥¼ 반환한다.
3.2.1.3 string.find (s, pattern [, init [, plain]]) #
- 문ìžì—´ së‚´ì—서 patternì— ê°€ìž¥ 첫번째로 맞는 ë¶€ë¶„ì„ ì°¾ì•„ 반환한다. 만약 한개를 찾았다면 find()함수는 ì¼ì¹˜ì ì˜ ì‹œìž‘ê³¼ ëì„ ë‚˜íƒ€ë‚´ëŠ” sì˜ ì¸ë±ìŠ¤ë“¤ë¥¼ 반환한다. 찾지 못하면 nilì„ ë°˜í™˜í•œë‹¤.
- 만약 pattern 문ìžì—´ë‚´ì— "캡ì³"ì˜µì…˜ì´ ì§€ì •ë˜ì–´ 있다면(string.gsub 참조), 캡ì³ëœ 문ìžì—´ë“¤ë„ ë°˜í™˜ê°’ì— í¬í•¨ë˜ì–´ 반환ëœë‹¤.
- init ì¸ìžëŠ” 어디서부터 ê²€ìƒ‰ì„ ì‹œìž‘í• ê²ƒì¸ì§€ì— 대한 s 문ìžì—´ë‚´ì˜ ì¸ë±ìŠ¤ë¥¼ ì§€ì •í•œë‹¤. ì§€ì •í•˜ì§€ 않으면 1로 간주ë˜ë©°, ìŒìˆ˜ì§€ì •ë„ ê°€ëŠ¥í•˜ë‹¤.
- plain ì¸ìžì˜ ê°’ì„ true로 놓으면 패턴 ë§¤ì¹ ê¸°ëŠ¥ì„ ë„는 효과가 있다. ì´ê²ƒì€ 아주 í‰ë²”한(plain) 부분 문ìžì—´ì„ 검색하는 ëª…ë ¹ì´ ë˜ë©°, pattern ì¸ìžë‚´ì— 들어있는 ê°’ë“¤ì€ ë¬´ì‹œëœë‹¤. ë§Œì¼ plain ì¸ìžë¥¼ true로 ì§€ì •í•˜ë©´ initë„ ë°˜ë“œì‹œ ì§€ì •í•´ì•¼ 한다는 ì ì— ì£¼ì˜í•´ë¼. plainì€ ì§€ì •í•˜ì§€ 않으면 당연히 false로 간주ëœë‹¤.
3.2.1.4 string.len (s) #
- 문ìžì—´ì˜ 길ì´ë¥¼ 반환한다. ""(빈 문ìžì—´)ì€ 0ì„ ë°˜í™˜í•œë‹¤. ì²¨ë¶€ëœ 0ê°’ë„ ê°¯ìˆ˜ì— í¬í•¨ëœë‹¤. 그러므로 예를 들면 "a\000b\000c"ì˜ ê¸¸ì´ëŠ” 5ê°€ ëœë‹¤.
3.2.1.5 string.lower(s) #
- 주어진 문ìžì—´ì„ ëª¨ë‘ ì†Œë¬¸ìžë¡œ ë°”ê¾¸ê³ ê·¸ ê²°ê³¼ 문ìžì—´ì˜ ë³µì‚¬ë³¸ì„ ë°˜í™˜í•œë‹¤. (ì›ë³¸ì€ 바뀌지 않는다.) 대소문ìžì— 대한 êµ¬ë¶„ì€ í˜„ìž¬ ë¡œì¼€ì¼ ì„¤ì •ì„ ë”°ë¥¸ë‹¤.
3.2.1.7 string.sub (s, i [, j]) #
- 문ìžì—´ së‚´ì—서 iì—서 ì‹œìž‘í•˜ê³ jì—서 ë나는 ë¶€ë¶„ì— ëŒ€í•œ 부분 문ìžì—´ì„ 반환한다. i와 j는 ìŒìˆ˜ ì§€ì •ì´ ê°€ëŠ¥í•˜ë‹¤. j를 ì§€ì •í•˜ì§€ 않으면, -1로 간주ëœë‹¤. (즉, iì—서 ëê¹Œì§€ì˜ ì˜ì—ì„ ë‚˜íƒ€ë‚´ê²Œ ëœë‹¤.) 여러가지 ì§€ì •ì„ ì˜ˆë¥¼ 들면, ë§Œì¼ ë¬¸ìžì—´ sì˜ ê¸¸ì´ j ë§Œí¼ì˜ ì ‘ë‘어를 ë•Œì–´ë‚´ë ¤ë©´, string.sub(s, 1, j)ë¼ê³ ì§€ì •í•˜ë©´ ë˜ë©°, string.sub(s, -i)는 문ìžì—´ sì—서 iê¸¸ì´ ë§Œí¼ì˜ ì ‘ë¯¸ì–´ë¥¼ 때내는 효과가 있다.
3.2.1.8 string.upper(s) #
- 문ìžì—´ ë‚´ì˜ ëª¨ë“ ì†Œë¬¸ìžë“¤ì„ 대문ìžë¡œ 바꾼 결과를 반환한다. 대소문ìžì— 대한 êµ¬ë¶„ì€ í˜„ìž¬ ë¡œì¼€ì¼ ì„¤ì •ì„ ë”°ë¥¸ë‹¤.
3.2.1.9 string.format(formatstring, e1, e2, ...) #
- 첫번째 ì¸ìž(반드시 문ìžì—´ì´ì–´ì•¼ 함)로 주어지는 ì •ì˜ë¥¼ ë”°ë¼ì„œ 다양한 ìˆ˜ì˜ ì¸ìžë“¤ì„ 잘 í¬ë§·í•œ ê²°ê³¼ë¬¼ì„ ë°˜í™˜í•œë‹¤. C 언어ì—서 printf() 함수를 ìƒê°í•˜ë©´ ëœë‹¤. ë‚´ë¶€ í¬ë§·ë£°ë„ 같지만, 다ìŒê³¼ ê°™ì€ ì°¨ì´ê°€ 있다.
- *, l, L, n, p, h는 ì§€ì›ë˜ì§€ 않는다.
- q ì˜µì…˜ì´ ì œê³µëœë‹¤. the q option formats a string in a form suitable to be safety read back by the Lua interpreter : The string is written between double quotes, and all double quotes, returns, and backslashs in the string are correctly escaped when written. For instance, the call
string.format('%q', 'a string with "quotes" and \n new line')will produce the string:
"a string with \"quotes\" and \ newline"
- c, d, E, e, f, g, G, i, o, u, X, x와 ê°™ì€ ëª¨ë“ ì˜µì…˜ì€ ìˆ«ìžë¥¼ ì 용하여 사용하며, q와 së§Œ 문ìžì—´ì„ ì 용하여 사용ëœë‹¤. the * modifier can be simulated by building th appropriate format string. For example, "%*g" can be simulated with "%"..width.."g".
ì£¼ì˜ : %s로 í¬ë§·ë˜ëŠ” 문ìžì—´ ê°’ì€ 'ë‚´ìž¥ëœ 0' ê°’ì„ í¬í•¨í• 수 없다.
4 í…Œì´ë¸” #
다ìŒì˜ ì˜ˆë¬¸ì€ "temp" ë¼ëŠ” tableì— ì°¨ë¡€ë¡œ "a","b","c"ë¼ëŠ” ê°’ì„ ì„¤ì •í•˜ëŠ” 것입니다.
temp = {"a","b","c"}
ìœ„ì˜ ì˜ˆë¬¸ì˜ í…Œì´ë¸”ì—서 ê°’ì„ ê°€ì ¸ì˜¤ë ¤ë©´. []를 사용하시면 ë©ë‹ˆë‹¤.
다ìŒì˜ ì˜ˆë¬¸ì€ ìœ„ì—서 작성한 "temp"ì—서 첫번째 ê°’ì„ ê°€ì ¸ì˜¤ëŠ”ê²ë‹ˆë‹¤.
print(temp[1]) ê²°ê³¼: a
4.1.1 table.foreach(í…Œì´ë¸”, 함수) #
- ì§€ì •í•œ 'í…Œì´ë¸”'ì˜ ê° ê°’ì— ëŒ€í•´ ê°ê° '함수'를 실행합니다. (ìƒë‹¹ížˆ ìœ ìš©í•œ 함수!)
- 순서는 ì¸ë±ìŠ¤ê°’ì˜ ìˆœì„œëŒ€ë¡œ 실행ë©ë‹ˆë‹¤.
- '함수'ê°€ 매번 실행ë 때마다 "ì¸ë±ìФ, ê°’"으로 í•œë²ˆì— 2개씩 ì¸ìžë¥¼ 넘ê¹ë‹ˆë‹¤.
- 다ìŒì€ t1 í…Œì´ë¸”ì˜ ê° ìš”ì†Œë¥¼ í™”ë©´ì— ì¶œë ¥í•˜ëŠ” ì˜ˆì œìž…ë‹ˆë‹¤. (print 다ìŒì— ()ê°€ 없다는 ê²ƒì— ì£¼ëª©!)
table.foreach(t1, print)
- 다ìŒì„ 콘솔ì—ì„œì˜ ì‹¤í–‰ ì˜ˆì œìž…ë‹ˆë‹¤.
> t1 = {}
> t1.redpixel = 10
> t1.whitepixel = 30
> t1.raktavisa = 20
> t1.hong = 40
> table.foreach(t1, print)
raktavisa 20
hong 40
redpixel 10
whitepixel 30
4.1.2 table.foreachi(í…Œì´ë¸”, 함수) #
- ì§€ì •í•œ 'í…Œì´ë¸”'ì˜ ê° ê°’ì— ëŒ€í•´ ì¸ë±ìŠ¤ì˜ ìˆœì„œëŒ€ë¡œ ê°ê° '함수'를 실행합니다.
- 즉, í…Œì´ë¸”ì˜ ì¸ë±ìŠ¤ëŠ” 반드시 숫ìžë¡œ ì§€ì •ë˜ì–´ìžˆì–´ì•¼í•˜ê³ 1ì—서 n까지 숫ìžì˜ ê±´ë„ˆëœ€ì—†ì´ ì§€ì •ë˜ì–´ 있어야 합니다!
- foreach()를 ìˆ«ìž ì¸ë±ìŠ¤ì— ì˜í•´ 마치 for문처럼 ì‹¤í–‰í•˜ê³ ìž í• ë•Œ 사용합니다.
- 다ìŒì€ foreach(), foreachi()ì˜ ë¹„êµë¥¼ 위해 콘솔ì—ì„œì˜ ì‹¤í–‰ì„ ìº¡ì³í•œ 것입니다.
> t1 = {}
> t1[1] = 10
> t1[3] = 30
> t1[2] = 20
> t1[4] = 40
> t1[9] = 90
> t1[6] = 60
> table.foreach(t1, print)
1 10
2 20
3 30
4 40
6 60
9 90
> table.foreachi(t1, print)
1 10
2 20
3 30
4 40
5 함수 #
- 함수는 ì¼ì •한 실행단위를 ì–´ëŠ ìˆœê°„ì— í•œêº¼ë²ˆì— ì‹¤í–‰í•˜ê¸° 위해 í•˜ë‚˜ì˜ ê°’ìœ¼ë¡œ ì„ ì–¸í•´ë†“ì€ ê²ƒìž…ë‹ˆë‹¤. 즉, í•¨ìˆ˜ê°’ì„ ê°€ì§€ëŠ” 변수는 ê·¸ ìžì²´ë¡œ ì‹¤í–‰ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.
- 루아는 ê°’ì„ ì—¬ëŸ¬ê°œ returní• ìˆ˜ 있습니다. (예를 들면, a, b, c = func(d) ì´ëŸ° ê²ƒì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.)
- 기본 ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다. ([] 표시는 안ì ì–´ë„ ë¬¸ë²•ì— ë§žë‹¤ëŠ” ì˜ë¯¸ìž…니다. 즉, ì¸ìž1, ì¸ìž2...는 í•¨ìˆ˜ì„±ê²©ì— ë”°ë¼ ì ì–´ë„ë˜ê³ 안ì ì–´ë„ ë©ë‹ˆë‹¤.)
function 함수명 ([ì¸ìž1, ì¸ìž2, ...]) ... end
- 다ìŒì€ ì¸ìžë¡œ ë„˜ê²¨ë°›ì€ ë¬¸ìžì—´ì„ "바보"를 ëì— ë¶™ì—¬ì„œ ì¶œë ¥í•˜ëŠ” 함수입니다.
function foolprint (i) local tmp = i.."바보" print(tmp) end
- 함수를 사용하는 ê²ƒì€ ë‹¤ìŒê³¼ ê°™ì´ í•©ë‹ˆë‹¤.
foolprint("redpixel") -- "redpixel바보"ë¼ê³ ì¶œë ¥ë©ë‹ˆë‹¤
- 함수는 ë°˜í™˜ê°’ì„ ê°€ì§ˆ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. ì´ë•Œì—는 í•¨ìˆ˜ë‚´ì— returnì´ë¼ê³ 하는 키워드를 사용합니다. ë¬¼ë¡ , 루아 íŠ¹ì„±ìƒ ì—¬ëŸ¬ê°œì˜ ê°’ì„ ë°˜í™˜í• ìˆ˜ 있습니다.
- 다ìŒì€ ë‘ê°œì˜ ì¸ìžë¥¼ 받아서 ë”한 결과와 곱한 결과를 ê°ê° 반환하는 í•¨ìˆ˜ì˜ ì˜ˆìž…ë‹ˆë‹¤.
function calc1(x, y) local a = x + y local m = x * y return a, m end
- 위 함수는 다ìŒê³¼ ê°™ì´ ì‚¬ìš©ë 수 ìžˆê² ì£ .
a, b = calc1(10, 10) print(a, b) -- "20 100"ì´ë¼ê³ ì¶œë ¥ë©ë‹ˆë‹¤.
6.1 조건문과 true/false #
ì¡°ê±´ë¬¸ì€ ë¬¸ìž¥ì˜ ê²°ê³¼ë¡œì„œ ì°¸/거짓중 í•˜ë‚˜ì˜ ê°’ë§Œì„ ì˜ë¯¸í•˜ëŠ” ë¬¸ìž¥ì„ ì˜ë¯¸í•©ë‹ˆë‹¤. 여기ì—는 몇가지 ì—°ì‚°ìžê°€ 비êµìˆ˜ë‹¨ìœ¼ë¡œ 사용ë©ë‹ˆë‹¤.
- == : ë™ì¼ë¹„êµ.
- ~= : 다름비êµ. (위와 반대)
- >=, <=, >, < : í¬ê¸°ë¹„êµ.
- not : ë¶€ì •. true는 false로, false는 true로.
- and : "ê·¸ë¦¬ê³ "ì˜ ì˜ë¯¸. ë‘ê°œì˜ ì¡°ê±´ë¬¸ì´ ëª¨ë‘ true여야 true로 처리.
- or : "ë˜ëŠ”"ì˜ ì˜ë¯¸. ë‘ê°œì˜ ì¡°ê±´ë¬¸ì´ ëª¨ë‘ false여야 false로 처리.
- true : í•ìƒ ì°¸.
- false : í•ìƒ ê±°ì§“.
6.2 if 문 #
- 기본 ifë¬¸ì€ ë‹¤ìŒê³¼ 같다.
if i ~= 0 then
print("0ì´ ì•„ë‹ˆìžë‚˜!")
end
- ë¬¼ë¡ , ì•„ë‹ ê²½ìš°ë„ ì²¨ë¶€í• ìˆ˜ 있다. ì´ë•Œì—는 else를 사용한다. (elseìœ„ì— end를 ì“°ì§€ 않는 ê²ƒì— ì£¼ì˜í•œë‹¤. end는 맨 ë§ˆì§€ë§‰ì— í•œë²ˆë§Œ ì 으면 ëœë‹¤.
if i == 0 then -- i가 0과 같으면
print("0ì´êµ°.")
else
print("0아님.")
end
- ì•„ë‹ê²½ìš° í•œë²ˆë” ê²€ì‚¬ë¥¼ í•˜ê³ ì‹¶ìœ¼ë©´ elseif를 사용한다. ì—시 가장 마지막ì—ë§Œ end를 쓴다는 ê²ƒì— ì£¼ì˜.
if i == 1 then -- i가 1과 같으면
print("1ì´êµ°.")
elseif i == 0 then -- ê·¸ë ‡ì§€ ì•Šê³ iê°€ 0ê³¼ 같으면
print("0ì´ë„¤~")
else
print("0ë„ 1ë„ ì•„ë‹ˆë„¤~")
end
6.3 while 문 #
- 기본 ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같다. ì´ ëª…ë ¹ì˜ ì˜ë¯¸ëŠ” "ì§€ì •í•œ ì¡°ê±´ì´ trueê°’ì„ ë°˜í™˜í• ë™ì•ˆ 반복ì 으로 실행한다"는 뜻ì´ë‹¤.
while 조건문 do .... end
- 예를 들면, 다ìŒì˜ ë¬¸ìž¥ì€ "!"를 100회 ì¶œë ¥í•œë‹¤.
i = 0
while i ~= 100 do -- iê°€ 100ì´ ì•„ë‹ë™ì•ˆ 반복한다
print("!")
i = i + 1
end
6.4 repeat 문 #
- 기본 ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같다. ì´ ëª…ë ¹ì˜ ì˜ë¯¸ëŠ” "ì§€ì •í•œ ì¡°ê±´ì´ trueê°€ ë 때까지 반복ì 으로 실행한다"는 뜻ì´ë‹¤. (즉, 위 while문과는 ë°˜ëŒ€ì˜ ì˜ë¯¸ì´ë‹¤!)
repeat .... until 조건문
- 예를 들면, 다ìŒì˜ ë¬¸ìž¥ì€ "redpixel"ì„ 50회 ì¶œë ¥í•œë‹¤.
i = 50
repeat
print("redpixel")
i = i - 1
until i == 0 -- iê°€ 0ì´ ë 때까지 반복한다
6.5.1 ì¼ë°˜ì ì¸ ì‚¬ìš©ë²• #
- 다른 ì–¸ì–´ì™€ì˜ ë§ˆì°¬ê°€ì§€ë¡œ ì§€ì •ëœ ë²”ìœ„ë¥¼ ì§€ì •í•¨ìœ¼ë¡œì„œ ë°˜ë³µëª…ë ¹ì„ ìˆ˜í–‰í•˜ëŠ” ê²ƒì´ forëª…ë ¹ì´ë‹¤. 기본 ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같다.
7.1.1.1 gcinfo() #
- 현재 ë£¨ì•„ë‚´ì˜ ì „ì²´ 메모리 사용ìƒíƒœë¥¼ 반환합니다. 첫번째 ê°’ì€ ì ìœ ìš©ëŸ‰ì´ê³ , ë‘번째 ê°’ì€ ë£¨ì•„ë‚´ì— í• ë‹¹ëœ ì¢… 허용용량입니다. 단위는 KByte입니다.
- ì¸ìžëŠ” 없습니다.
- print(gcinfo())를 해보면 쉽게 결과를 볼 수 있습니다.
7.1.1.2 collectgarbage() #
- 루아가 메모리 ì •ë¦¬ë¥¼ 하는 한계메모리 ì‚¬ìš©ëŸ‰ì„ ì •ì˜í•©ë‹ˆë‹¤. (gcinfo()ì—서 ë‘번째 ê°’ì„ ë§í•©ë‹ˆë‹¤)
- ì´ê²ƒì´ ë„“ì„ìˆ˜ë¡ ìžë™ìœ¼ë¡œ 메모리 관리가 실행ë˜ëŠ” í™•ë¥ ì´ ì¤„ì–´ë“니다.
7.3.1.1 io.open (filename, mode) #
í™”ì¼ì„ ì—´ê³ ê·¸ í™”ì¼ì— 해당하는 í™”ì¼ í•¸ë“¤ì„ ë°˜í™˜í•œë‹¤. ì—ëŸ¬ì¼ ê²½ìš°ì—는 nilì„ ë°˜í™˜í•œë‹¤.
mode는 string 형으로 ì§€ì •í•˜ë©° ì˜µì…˜ì€ ë‹¤ìŒê³¼ 같다.
b문ìžë¥¼ mode 문ìžì—´ì˜ ëì— ì²¨ê°€í•˜ë©´ ì´ì§„í™”ì¼í˜•태로 열게 ëœë‹¤.
| "r" | ì½ê¸°ëª¨ë“œ |
| "w" | 쓰기모드 |
| "a" | 첨부모드 |
| "r+" | ê°±ì‹ ëª¨ë“œ. ì½ê¸°ëª¨ë“œì§€ë§Œ ì´ì „ í™”ì¼ì€ ì‚ì œ. |
| "w+" | ê°±ì‹ ëª¨ë“œ. 쓰기모드지만 ì´ì „ í™”ì¼ì€ ì‚ì œ. |
| "a+" | 첨부모드지만 í™”ì¼ì˜ ëì—서부터만 쓰기가 허용. |
b문ìžë¥¼ mode 문ìžì—´ì˜ ëì— ì²¨ê°€í•˜ë©´ ì´ì§„í™”ì¼í˜•태로 열게 ëœë‹¤.
7.3.1.2 io.tmpfile() #
임시화ì¼ì„ ìƒì„±í•˜ê³ ê·¸ í™”ì¼ì— 대한 í•¸ë“¤ì„ ë°˜í™˜í•œë‹¤. 임시화ì¼ì€ 차후 í”„ë¡œê·¸ëž¨ì´ ì¢…ë£Œí•˜ë©´ ìžë™ìœ¼ë¡œ ì‚ì œëœë‹¤.
7.3.2 핸들 사용 함수들 #
fh는 ìœ„ì˜ í•¸ë“¤ íšë“ í•¨ìˆ˜ë“¤ì˜ ë°˜í™˜ê°’ì¸ í™”ì¼ í•¸ë“¤ì„ ì˜ë¯¸í•œë‹¤.
7.3.2.3 fh:read(í¬ë§·ë¬¸ìžì—´, ...) #
í™”ì¼ í•¸ë“¤ fh로부터 주어진 í¬ë§·ì— ë”°ë¼ ë°ì´íƒ€ë¥¼ ì½ì–´ë“¤ì—¬ ê·¸ ê°’ì„ ë°˜í™˜í•œë‹¤. í¬ë§·ë¬¸ìžì—´ì•ˆì— 들어가는 ëª…ë ¹ì€ ë‹¤ìŒê³¼ 같다.
ì˜ˆì œ:
| "*n" | 숫ìžë¥¼ ì½ì–´ë“¤ì—¬ 반환한다. ì´ê²ƒì€ number 타입으로 반환하는 ìœ ì¼í•œ í¬ë§·ì´ë‹¤. |
| "*a" | 현재 위치ì—서 나머지 ì „ì²´ ë‚´ìš©ì„ ì½ì–´ë“¤ì—¬ ê·¸ ë‚´ìš©ì„ ë°˜í™˜. í™”ì¼ì˜ ëì—서 ëª…ë ¹ì„ ì‹¤í–‰í•œê±°ë¼ë©´ nil반환. |
| "*l" | ë‹¤ìŒ ì¤„ì„ ì½ì–´ë“¤ì¸ë‹¤.(EOF는 건너뛴다) í™”ì¼ì˜ ëì—서 ëª…ë ¹ì„ ì‹¤í–‰í•œê±°ë¼ë©´ nil반환. ì´ê²ƒì´ 기본 í¬ë§·ìž„. |
| ìˆ«ìž | 주어진 숫ìžë§Œí¼ì˜ 문ìžë¥¼ ì½ì–´ë“¤ì—¬ ê·¸ ë‚´ìš©ì„ ë°˜í™˜í•œë‹¤. 0ì„ ì§€ì •í•˜ë©´ ì•„ë¬´ê²ƒë„ ì½ì§€ì•Šê³ 텅빈 문ìžì—´ì„ 반환한다. í™”ì¼ì˜ ëì—서 ëª…ë ¹ì„ ì‹¤í–‰í•œê±°ë¼ë©´ nil반환. |
ì˜ˆì œ:
myfile = open("test.txt","r")
t1 = myfile:read(3) -- t1ì— 3글ìžë§Œí¼ 문ìžì—´ì„ ì½ì–´ì„œ 기ë¡(문ìžì—´)
n2 = myfile:read("*n") -- n1ì— ìˆ«ìžë¥¼ ì½ì–´ ê·¸ ê°’ì„ ê¸°ë¡(숫ìž)
t3 = myfile:read() -- í•œì¤„ì„ ëª¨ë‘ ì½ì–´ t3ì— ê¸°ë¡(문ìžì—´)
7.3.2.4 fh:seek (whence [, offset]) #
Sets and gets the file position, measured in bytes from the beginning of the file, to the position given by offset plus a base specified by the string whence, as follows:
“set†base is position 0 (beginning of the file); “cur†base is current position; “end†base is end of file;
In case of success, function seek returns the final file position, measured in bytes from the beginning of the file. If this function fails, it returns nil, plus a string describing the error. The default value for whence is "cur", and for offset is 0. Therefore, the call file:seek() returns the current file position, without changing it; the call file:seek("set") sets the position to the beginning of the file (and returns 0); and the call file:seek("end") sets the position to the end of the file, and returns its size.








![[http]](/wiki/imgs/http.png)
