-
[Lua] 연산자 알아보기Lua 2024. 10. 7. 18:54
프로그래밍 언어마다 사용되는 산술, 논리, 비교 연산자 등은 대부분 유사합니다.
사칙연산, 대소비교 등 대부분의 연산이 동일한 기호를 사용하며 동일한 결과를 도출하지만, 언어별로 일부 다른 부분이 존재하는 경우가 있습니다.
Lua또한 C, C++등과 용법이 다른 연산자가 있습니다.
이번 글에서는 Lua의 연산자들을 살펴보도록 하겠습니다.
1. 산술 연산자
산술 연산자는 덧셈, 뺄셈, 곱셈, 나눗셈, 제곱, 나머지, 부정 연산자 입니다.
각각 +(덧셈), -(뺄셈, 부정), *(곱셈), /(나눗셈), ^(제곱), %(나머지) 기호를 사용합니다.
더보기산술 연산자는 문자열 자동 변환을 지원합니다.
print("12" + "3") -- 15 print(1 - "123") -- -122 print("42" * 7) -- 294 print("121" / "11") -- 11
사칙 연산의 피연산자가 문자열일 때, 해당 문자열을 number타입으로 변환하여 연산을 시도합니다.
변환이 실패할 경우 오류가 발생하니 주의해주세요.
또한, 모든 산술 연산자들은 실수에 대하여 작동합니다.
실수에 대한 사칙연산은 크게 다른점이 없지만, 그 외의 산술 연산자는 사용에 유의해야합니다.
^(제곱)연산자는 실수에 대해 동작합니다.
print(8^-(1/3)) -- 0.5 print(4^0.5) -- 2 print(0^0) -- 1
%(나머지)연산자는 다음과 같이 정의됩니다.
a % b == a - math.floor(a/b) * b
math.floor함수는 인자로 전달된 값을 소수점 첫째 자리에서 내림한 값을 반환합니다.
// C++ std::cout << -10 % 3; -- -1 // Lua print(-10 % 3) -- 2
-10 % 3을 C++과 Lua에서 계산한 결과입니다.
각각 몫이 -3, -4인 경우입니다.
두 구현이 다르니 주의해주세요.
나머지 연산을 실수 범위로 확장할 경우 다음과 같은 응용을 할 수 있습니다.
foo = 123.4567 print(foo%1) -- 0.4567 print(foo-foo%0.01) -- 123.45
각각 주어진 값의 소수점 이하의 값만 취한 경우, 소수점 N(예제는 2)번째 자리까지 취한 경우입니다.
2. 비교 연산자
비교 연산자는 두 피연산자를 비교합니다.
Lua의 비교 연산자로는 <. >, <=, >=, ==, ~= 가 있습니다.
비교 연산자의 결과값은 모두 boolean값입니다.
더보기C, Java 등의 언어와 다른점은 ~= 연산자입니다.
~=연산자는 위 언어들의 !=연산자와 동일하며, 두 피연산자가 서로 다른지 검사합니다.
nil값은 nil이외의 값과는 동일하지 않습니다.
table과 userdata는 값이 아닌 참조 여부로 동등성을 판단합니다.
a = {"1", "2", "3"} b = {"1", "2", "3"} c = a print(a==b) -- false print(a==c) -- true
위 코드에서, a와 b의 table은 완전히 동일한 값을 가지고 있지만, 동일 객체가 아니므로 ==연산자의 결과값이 false입니다.
c는 a와 동일한 객체를 참조하므로, a == c의 결과값이 true입니다.
비교 연산자의 피연산자가 모두 문자열일 경우, 설정된 로캘에 따라 알파벳 순으로 비교합니다.
print("ab" < "ac") -- true print("abd" < "abc") -- false
비교하는 피연산자의 타입이 다를 경우 주의해야합니다.
print(0 == "0") -- false print(2 < 15) -- true print("2" < "15") -- false
비교 연산은 자동 변환을 지원하지 않습니다.
2 < 15는 참이지만, "2" < "15"는 알파벳 순으로 비교하기 때문에 거짓입니다.
3. 논리 연산자
논리 연산자는 and, or, not이 있습니다.
논리 연산자는 boolean타입과 유사하게, false와 nil값을 거짓으로, 그 외의 값을 참으로 취급합니다.
더보기and와 or연산자는 단축 계산 (Short-cut evaluation)이 적용됩니다.
and연산자는 첫 번째 인자가 거짓일 경우 첫 번째 인자를 반환하고, 그 외의 경우 두 번째 인자를 반환합니다.
or연산자는 첫 번째 인자가 참일 경우 첫 번째 인자를 반환하고, 그 외의 경우 두 번째 인자를 반환합니다.
and와 or연산자의 두 번째 피연산자는 필요할 때에만 계산됩니다.
function foo() print("foo") end if true or foo() then print("bar") end -- bar
예를 들어, 다음의 코드는 foo함수가 실행되지 않습니다.
위 특징을 활용하여, 다음과 같은 표현식을 구성할 수 있습니다.
(type(foo) == "table" and foo.bar =="Hi")
위 코드는 foo가 table타입이 아닐 경우 foo.bar를 실행하지 않습니다.
// Code foo = foo or bar // Equal if not foo then foo = bar end
위 코드에서, Code부분의 표현식은 Equal의 표현식과 동일합니다.
foo의 값을 참조하여, 값이 존재하지 않을 경우 bar를 대입하는, 기본 값을 지정하는 관용 표현입니다.
not 연산자는 단항 연산자로, boolean 값을 반환합니다.
print(not nil) -- true print(not not nil) -- false print(not 0) -- false print(not false) -- true print(not "foo") -- false
4. 삼항 연산자
삼항 연산자는 a ? b : c로 표현되는 표현식입니다.
a식이 참일 경우 b를 반환하고, 거짓일 경우 c를 반환합니다.
Lua에 삼항 연산자는 존재하지 않지만, 이와 동일하게 사용할 수 있는 표현식이 있습니다.
더보기삼항 연산자는 논리 연산자를 이용하여 다음과 같이 표현할 수 있습니다.
a and b or c
위 표현식은 b가 false가 아닐 경우, 삼항 연산자와 동일하게 작동합니다.
예를 들어, 위 표현식을 이용하여 다음과 같은 코드를 작성할 수 있습니다.
x = 10 y = 12 max = (x > y) and x or y print(max) -- 12
위 표현식은 주어진 두 값 중 큰 값을 구하는 표현식 입니다.
비교 연산자를 반대로 사용할 경우 작은 값을 구하는 표현식으로 사용할 수 있습니다.
5. 이어 붙이기
Lua는 두 문자열을 붙이는 연산자를 지원합니다.
,, (온점 두 개)연산자가 그것으로, 피연산자가 실수일 경우 실수를 문자열로 변환합니다.
print(000 .. 01) -- 01 print(01 .. 01) -- 11 print(3 + 5) -- 8 print(3 .. 5) -- 35
+와 결과값이 다를 수 있다는 점에 주의해주세요.
6. 길이 연산자
#연산자는 문자열과 순열의 길이를 반환하는 연산자입니다.
더보기순열은 1부터 시작하여, 연속된 자연수 인덱스가 비어있지 않은(nil값이 아닌) 테이블을 의미합니다.
길이 연산자를 이용한, 순열을 다루는 데 사용되는 몇 가지 관용 표현이 존재합니다.
foo = {"a", "b", "c", "d",}
위와 같은 순열이 존재할 때
print(foo[#foo]) -- d
#foo로 순열 foo의 길이를 알 수 있는 점을 이용해서 foo[#foo]로 순열의 마지막 값을 참조할 수 있습니다.
foo[#foo] = nil print(foo[#foo]) -- c
같은 방식으로, 순열의 마지막 값을 제거하는 코드입니다.
foo[#foo + 1] = "e" print(foo[#foo]) -- e
같은 방식으로, 순열의 끝에 값을 추가하는 코드입니다.
7. 연산 우선순위
더보기연산 우선순위를 연산자로 나타낼 경우 아래와 같습니다.
^ not # -(단항) * / % + - .. < > <= >= ~= == and or
아래로 갈 수록 우선순위가 낮아집니다.
해당 우선 순위는 기본적으로 숙지하는 것이 바람직합니다.
하지만, 실제 코드에서 사용할 때에는 가독성을 위해 괄호를 명식적으로 사용하는 것이 좋을 수 있습니다.
연산자에 대해 살펴봤습니다.
언어의 가장 기초적인 부분이기 때문에 다른 언어와 공유하는 점이 많습니다.
하지만, Lua에서만 사용되거나, Lua에서 표기법이 다른 연산자도 있기 때문에 숙지가 필요합니다.
이번 글이 도움이 되셨기를 바랍니다.
감사합니다.
'Lua' 카테고리의 다른 글
[Lua] 제어 구문 (if, while, repeat, for, break, goto...) (0) 2025.02.05 [Lua] 다중 할당문 (Multiple assignments) (1) 2024.10.08 [Lua] Type (자료형) 알아보기 (0) 2024.10.04 [Lua] Lua binary : lua.exe, luac.exe, wlua.exe (0) 2024.09.20 [Lua] Lua installation & 개발 환경 구축 (1) 2024.09.19