English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua 데이터 타입

Lua는 동적형식 언어이며, 변수에 타입 정의는 필요하지 않으며 변수에 값을 할당하면 됩니다. 값은 변수에 저장할 수 있으며, 매개변수로 전달하거나 결과로 반환할 수 있습니다.

Lua에 있습니다 8 기본 타입은 nil, boolean, number, string, userdata, function, thread, table입니다.

데이터 타입설명
nil이 가장 간단하며, nil 값만이 해당 타입에 속합니다. 조건 표현식에서는 false와 동일합니다.
booleanfalse와 true 두 가지 값을 포함합니다.
number실수 타입의 실수를 나타냅니다
string문자열은 두 개의 双引号 ""나 단일 双引号 ' '로 표시됩니다
functionC나 Lua로 작성된 함수
userdata변수에 저장된 C 데이터 구조를 나타냅니다
thread실행하는 독립적인 경로를 나타내어 협력 프로그램을 실행하는 데 사용됩니다
tableLua의 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, 예를 들어 값을 할당하지 않은 변수를 출력하면 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

nil과 비교할 때는 두 개의 双引号 ""를 추가해야 합니다:

> type(X)
nil
> type(X) == nil
false
> type(X) == "nil"
true
>

type(X) == nil 결과는 false 이유는 type(X)는 실제로는 반환하는 "nil" 문자열이며, string 타입입니다:

type(type(X)) == string

boolean(부울)

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입니다

number(숫자)

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

string(문자열)

문자열은 두 개의 양쪽 쌍따옴표나 일쌍따옴표로 표현됩니다.

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
>

table(테이블)

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

function(함수)

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

thread(스레드)

Lua에서 가장 중요한 스레드는 코루틴(coroutine)입니다. 그것은 스레드(thread)와 유사하며, 독립적인 스택, 지역 변수, 명령 포인터를 가지고 있으며, 다른 코루틴과 공유할 수 있는 전역 변수와 대부분의 것을 공유할 수 있습니다.

스레드와 코루틴의 차이: 스레드는 동시에 여러 개가 실행될 수 있지만, 코루틴은 언제든지 하나만 실행됩니다. 또한, 실행 중인 코루틴은 중지되지 않은 한 멈추지 않습니다.

userdata(사용자 정의 타입)

userdata는 사용자 정의 데이터로, 응용 프로그램이나 C/C++ 언어 라이브러리가 생성한 타입을, 어떤 C/C++ 의 어떤 데이터 타입의 데이터(일반적으로 struct 및 포인터)를 Lua 변수에 저장할 때 호출됩니다.