English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Lua는 동적형식 언어이며, 변수에 타입 정의는 필요하지 않으며 변수에 값을 할당하면 됩니다. 값은 변수에 저장할 수 있으며, 매개변수로 전달하거나 결과로 반환할 수 있습니다.
Lua에 있습니다 8 기본 타입은 nil, boolean, number, string, userdata, function, thread, table입니다.
데이터 타입 | 설명 |
---|---|
nil | 이 가장 간단하며, nil 값만이 해당 타입에 속합니다. 조건 표현식에서는 false와 동일합니다. |
boolean | false와 true 두 가지 값을 포함합니다. |
number | 실수 타입의 실수를 나타냅니다 |
string | 문자열은 두 개의 双引号 ""나 단일 双引号 ' '로 표시됩니다 |
function | C나 Lua로 작성된 함수 |
userdata | 변수에 저장된 C 데이터 구조를 나타냅니다 |
thread | 실행하는 독립적인 경로를 나타내어 협력 프로그램을 실행하는 데 사용됩니다 |
table | Lua의 table은 실제로는 "관련 배열"(associative arrays)입니다. 배열의 인덱스는 숫자, 문자열, 또는 table 타입일 수 있습니다. Lua에서 table의 생성은 "구조 표현식"을 통해 이루어지며, 가장 간단한 구조 표현식은 {}입니다. 이는 빈 table을 생성합니다. |
type 함수는 주어진 변수나 값의 타입을 테스트할 수 있습니다:
print(type("Hello world")) --> string print(type(10.4*3)) --> number print(type(print)) --> function print(type(type)) --> function print(type(true)) --> boolean print(type(nil)) --> nil print(type(type(X))) --> string
nil 타입은 어떤 유효 값도 없는 타입을 나타내며, 그것은 단 하나의 값만 있습니다: -- nil, 예를 들어 값을 할당하지 않은 변수를 출력하면 nil 값이 출력됩니다:
> print(type(a)) nil >
전역 변수와 table에 대해 nil은 또한 "삭제" 기능을 가집니다. 전역 변수나 table 내의 변수에 nil 값을 할당하면 그들을 지우는 것과 동일합니다. 아래 코드를 실행하면 알 수 있습니다:
tab1 = { key1 = "val1", key2 = "val2", "val3" } for k, v in pairs(tab1) do print(k .. " - " .. v) end tab1.key1 = nil for k, v in pairs(tab1) do print(k .. " - " .. v) end
> type(X) nil > type(X) == nil false > type(X) == "nil" true >
type(X) == nil 결과는 false 이유는 type(X)는 실제로는 반환하는 "nil" 문자열이며, string 타입입니다:
type(type(X)) == string
boolean 형식은 두 가지 선택 가능한 값만 있습니다: true(참)과 false(거짓),Lua는 false와 nil을 false로 간주하며, 나머지는 모두 true로 간주합니다. 숫자 0도 true입니다:
print(type(true)) print(type(false)) print(type(nil)) if false or nil then print("최소한 하나는 true입니다") else print("false와 nil은 모두 false입니다") end if 0 then print("숫자 0은 true입니다") else print("숫자 0은 false입니다") end
위 코드의 실행 결과는 다음과 같습니다:
$ lua test.lua boolean boolean nil false와 nil은 모두 false입니다 숫자 0은 true입니다
Lua는 기본적으로 하나의 number 형식만 있습니다 -- double(이진정)형식(기본 형식은 luaconf.h에서 정의할 수 있습니다),다음과 같은 작성 방식 모두 number 형식으로 간주됩니다:
print(type(2)) print(type(2.2)) print(type(0.2)) print(type(2e+1)) print(type(0.2e-1)) print(type(7.8263692594256e-06))
위 코드의 실행 결과는 다음과 같습니다:
number number number number number number
문자열은 두 개의 양쪽 쌍따옴표나 일쌍따옴표로 표현됩니다.
string1 = "this is string1" string2 = 'this is string2'
또한 2 개의 괄호 "[[]]"를 "일부" 문자열로 표현할 수 있습니다.
html = [[ <html> <head></head> <body> <a href="http://ko.oldtoolbag.com/">기본 튜토리얼 웹</a> </body> </html> ]] print(html)이 코드의 실행 결과는 다음과 같습니다:
<html> <head></head> <body> <a href="http://ko.oldtoolbag.com/">기본 튜토리얼 웹</a> </body> </html>
숫자 문자열에 수학적 연산을 수행할 때 Lua는 이 숫자 문자열을 숫자로 변환을 시도합니다:
> print("2" + 6) 8.0 > print("2" + "6") 8.0 > print("2 + 6") 2 + 6 > print("-2e2" * "6") -1200.0 > print("error" + 1) stdin:1: 문자 값에 수학적 연산을 시도합니다 stack traceback: stdin:1: in main chunk [C]: in ? >
위 코드에서 "error" + 1실행 중 오류가 발생했습니다. 문자열 연결은 .. 사용됩니다. 예를 들어:
> print("a" .. 'b')} ab > print(157 .. 428) 157428 >
문자열의 길이를 계산하기 위해 #을 사용합니다. 문자열 앞에 #을 두면 다음과 같은 예제와 같이 사용할 수 있습니다:
> len = "ko.oldtoolbag.com" > print(#len) 14 > print(#"ko.oldtoolbag.com) 14 >
Lua에서 테이블의 생성은 "구조 표현식"을 통해 완료됩니다. 가장 간단한 구조 표현식은 {}입니다. 빈 테이블을 생성하려면 {}를 사용할 수 있습니다. 테이블에 데이터를 추가하여 테이블을 직접 초기화할 수도 있습니다:
-- 가짜 테이블을 생성합니다 local tbl1 = {} -- 직접 초기 테이블 local tbl2 = {"apple", "pear", "orange", "grape"}
Lua의 테이블(table)은 실제로 "관계 배열(associative arrays)"입니다. 배열의 인덱스는 숫자나 문자열일 수 있습니다.
-- table_test.lua 스크립트 파일 a = {} a["key"] = "value" key = 10 a[key] = 22 a[key] = a[key] + 11 for k, v in pairs(a) do print(k .. " : " .. v) end
스크립트 실행 결과는 다음과 같습니다:
$ lua table_test.lua key : value 10 : 33
다른 언어의 배열과 달리 0을 배열의 초기 인덱스로 사용하지 않습니다. Lua에서 테이블의 기본 초기 인덱스는 일반적으로 1 시작.
-- table_test2.lua 스크립트 파일 local tbl = {"apple", "pear", "orange", "grape"} for key, val in pairs(tbl) do print("Key", key) end
스크립트 실행 결과는 다음과 같습니다:
$ lua table_test2.lua Key 1 Key 2 Key 3 Key 4
table은 고정된 길이가 아니며, 새로운 데이터가 추가될 때 table의 길이가 자동으로 증가합니다. 초기 table은 모두 nil입니다.
-- table_test3.lua 스크립트 파일 a3 = {} for i = 1, 10 do a3[i] = i end a3["key"] = "val" print(a3["key"]) print(a3["none"])
스크립트 실행 결과는 다음과 같습니다:
$ lua table_test3.lua val nil
Lua에서 함수는 "제일류 값(First Class Value)"로 간주됩니다:-Class Value)",함수는 변수 안에 존재할 수 있습니다:
-- function_test.lua 스크립트 파일 function 계산자1(n) if n == 0 then return 1 else return n * factorial1(n - 1) end end print(factorial1(5)) factorial2 = factorial1 print(factorial2(5))
스크립트 실행 결과는 다음과 같습니다:
$ lua function_test.lua 120 120
함수는 익명 함수(anonymous function)로 매개변수를 통해 전달될 수 있습니다:
-- function_test2.lua 스크립트 파일 function testFun(tab,fun) for k, v in pairs(tab) do print(fun(k,v)); end end tab={key1="val1",key2="val2"}; testFun(tab, function(key,val)--익명 함수 return key.."="..val; end );
스크립트 실행 결과는 다음과 같습니다:
$ lua function_test2.lua key1 = val1 key2 = val2
Lua에서 가장 중요한 스레드는 코루틴(coroutine)입니다. 그것은 스레드(thread)와 유사하며, 독립적인 스택, 지역 변수, 명령 포인터를 가지고 있으며, 다른 코루틴과 공유할 수 있는 전역 변수와 대부분의 것을 공유할 수 있습니다.
스레드와 코루틴의 차이: 스레드는 동시에 여러 개가 실행될 수 있지만, 코루틴은 언제든지 하나만 실행됩니다. 또한, 실행 중인 코루틴은 중지되지 않은 한 멈추지 않습니다.
userdata는 사용자 정의 데이터로, 응용 프로그램이나 C/C++ 언어 라이브러리가 생성한 타입을, 어떤 C/C++ 의 어떤 데이터 타입의 데이터(일반적으로 struct 및 포인터)를 Lua 변수에 저장할 때 호출됩니다.