0Pricing
Lua Academy · 강의

Lua에서 변수 선언

전역 변수와 지역 변수를 비교하고 명명 규칙을 이해합니다.

Lua에서 변수 선언은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

전역 변수와 지역 변수

Lua에서 변수는 기본적으로 전역 변수입니다. local 키워드 없이 x = 10을 작성하면 어디서나 접근할 수 있는 전역 변수가 생성됩니다. local x = 10을 사용하면 해당 변수를 현재 블록과 그 안에 중첩된 블록으로 제한합니다.

성능과 안전성을 위해 항상 local을 우선 사용하십시오. 전역 변수는 _G 테이블에서 해시 테이블 조회가 필요하므로 지역 변수에 접근하는 것이 전역 변수에 접근하는 것보다 빠릅니다.

x = 100          -- global variable
local y = 200    -- local variable

do
  local z = 300  -- block-local
  print(x, y, z) -- 100  200  300
end

print(x, y)      -- 100  200
print(z)         -- nil  (out of scope)

local 키워드

local 키워드는 가장 가까운 바깥 블록에 속하는 변수를 선언합니다. 바깥 블록은 함수 본문, do...end 블록, 반복문 본문 또는 파일 청크일 수 있습니다. 지역 변수는 선언된 줄에서 생성되며 해당 블록이 끝나면 더 이상 존재하지 않습니다.

한 줄에서 여러 지역 변수를 선언하고 동시에 초기화할 수 있습니다. 초기화하지 않은 지역 변수의 기본값은 nil입니다.

local a, b, c = 1, 2, 3
print(a, b, c)    -- 1  2  3

local d, e = 10   -- e is nil
print(d, e)       -- 10  nil

local f           -- nil until assigned
f = 42
print(f)          -- 42

변수 이름 지정 규칙

Lua 식별자에는 다음 규칙이 적용됩니다. 식별자는 문자 또는 밑줄로 시작해야 하며, 그 뒤에는 문자, 숫자 또는 밑줄이 올 수 있습니다. Lua는 대소문자를 구분하므로 Value, value, VALUE는 서로 다른 세 변수입니다.

관례에 따라 일반 변수에는 camelCase 또는 snake_case를 사용하고, 상수에는 UPPER_CASE를 사용하며, 비공개 모듈 필드에는 밑줄을 접두사로 붙이십시오. 반복문의 카운터를 제외하면 한 글자 이름은 피하는 것이 좋습니다.

local myVariable = 1     -- camelCase
local my_variable = 2    -- snake_case
local MAX_SIZE = 100     -- constant convention
local _private = "hidden" -- private convention

-- Case sensitivity demo
local lua = "lower"
local Lua = "upper"
print(lua, Lua)  -- lower  upper

_G 전역 테이블

Lua의 모든 전역 변수는 _G라는 특수한 테이블에 저장됩니다. x = 10을 작성하는 것은 _G.x = 10을 작성하는 것과 같습니다. _G를 순회하면 모든 전역 변수를 검사할 수 있어 디버깅에는 편리하지만, 실제 운영 코드에서는 위험할 수 있습니다.

Lua 5.2 이상에서는 _ENV가 실제 환경 테이블이고 _G는 해당 테이블을 가리키도록 초기화됩니다. 이를 이해하면 _ENV를 교체하여 코드를 샌드박스화할 수 있습니다.

myGlobal = 42
print(_G.myGlobal)   -- 42

-- Setting via _G is the same as direct assignment
_G.another = "hello"
print(another)        -- hello

-- Counting globals (many built-ins exist)
local count = 0
for k in pairs(_G) do count = count + 1 end
print("Globals:", count)

다중 할당

Lua는 다중 할당을 지원하므로 하나의 문장에서 여러 변수에 값을 할당할 수 있습니다. 오른쪽 항을 먼저 평가한 다음 왼쪽에서 오른쪽 순서로 할당합니다. 값보다 변수가 많으면 남는 변수에는 nil이 들어갑니다. 변수보다 값이 많으면 남는 값은 버려집니다.

따라서 임시 변수 없이도 변수를 간단히 교환할 수 있습니다.

-- Swap without temp variable
local a, b = 10, 20
a, b = b, a
print(a, b)   -- 20  10

-- More variables than values
local x, y, z = 1, 2
print(x, y, z)  -- 1  2  nil

-- More values than variables
local p, q = 1, 2, 3  -- 3 is discarded
print(p, q)   -- 1  2

범위와 블록 경계

Lua의 블록 구분자는 do...end, 함수 본문, if/elseif/else...end, while...end, repeat...until, for...end입니다. 각각 새로운 범위 수준을 만듭니다. do...end 블록은 다른 로직 없이 범위만 제한할 때 유용합니다.

for 반복문의 헤더에서 선언한 지역 변수는 반복문 본문에 속하며 반복문 밖으로 유출되지 않습니다.

for i = 1, 3 do
  local msg = "item " .. i
  print(msg)
end
-- print(i)   -- would be nil, i is gone
-- print(msg) -- would be nil, msg is gone

-- do...end for manual scoping
do
  local temp = expensive_computation or 0
  print(temp)
end
-- temp is nil here

상수: local 관례

Lua에는 내장 const 키워드가 없습니다. 값이 변경되지 않아야 함을 나타내기 위해 UPPER_CASE 이름과 local을 사용하는 것이 관례입니다. 모듈 상단에 상수를 지역 변수로 배치하면 JIT 컴파일러에 해당 값이 안정적이라는 힌트도 제공할 수 있습니다.

진정한 불변성을 원한다면, 수정 시 오류를 발생시키는 __newindex를 가진 프록시 테이블을 사용할 수 있습니다. 이 내용은 메타테이블 레슨에서 다루겠습니다.

local MAX_RETRIES = 3
local PI = 3.14159265358979
local APP_VERSION = "1.0.0"

-- Use them as read-only by convention
local area = PI * 5 * 5
print(area)           -- 78.539...
print(MAX_RETRIES)    -- 3

변수 가리기

변수 가리기는 내부 범위에서 바깥 변수와 같은 이름의 지역 변수를 선언할 때 발생합니다. 내부 선언은 완전히 새로운 변수를 만들고, 해당 범위 안에서는 바깥 변수를 가립니다. 바깥 변수는 변경되지 않으며 내부 범위가 끝나면 다시 보이게 됩니다.

변수 가리기는 혼란을 일으킬 수 있으므로 중첩된 범위에서는 서로 다른 이름을 사용하는 것이 좋습니다. 다만 중첩 반복문에서 반복 변수 이름을 다시 사용하는 것처럼 의도적으로 활용하는 경우도 있습니다.

local x = "outer"
do
  local x = "inner"  -- shadows outer x
  print(x)            -- inner
end
print(x)              -- outer (unchanged)

local n = 10
for n = 1, 3 do       -- loop n shadows outer n
  print(n)            -- 1, 2, 3
end
print(n)              -- 10 (outer unchanged)

전역 오염 방지하기

실수로 만들어지는 전역 변수는 Lua에서 흔한 버그입니다. 지역 변수 이름을 잘못 입력하면 새 전역 변수가 조용히 생성됩니다. 프로젝트에 흔히 포함하는 strict.lua 모듈은 _G에 메타테이블을 추가하여 선언되지 않은 전역 변수의 읽기와 쓰기를 감지합니다.

더 간단한 방법은 항상 local을 사용하고, 실행 전에 실수로 생성된 전역 변수를 감지하도록 luac -p나 luacheck 같은 린터를 실행하는 것입니다.

-- Dangerous: typo creates a global silently
local counter = 0
coutner = 5  -- typo! creates global 'coutner'
print(counter)  -- 0 (not 5!)
print(coutner)  -- 5 (the typo global)

-- Fix: always use local keyword
local score = 0
score = 10  -- assigns to existing local
print(score) -- 10

nil 할당으로 전역 변수 삭제하기

전역 변수에 nil을 설정하면 해당 변수가 _G에서 제거되어 메모리가 해제됩니다. 이것이 전역 변수를 "삭제"하는 올바른 방법입니다. 지역 변수는 범위를 벗어나게 두기만 해도 같은 효과가 있으며, 가비지 컬렉터가 메모리를 회수합니다.

다중 할당에서 nil을 전달할 때는 주의하십시오. 특히 오른쪽 항에 함수 호출이 있는 경우처럼 일부 상황에서는 인수 목록이 잘릴 수 있습니다.

myGlobal = "exists"
print(myGlobal)   -- exists
print(_G.myGlobal ~= nil)  -- true

myGlobal = nil
print(myGlobal)   -- nil
print(_G.myGlobal ~= nil)  -- false
-- The entry is removed from _G

빠른 확인

for 반복문 본문 안에서 local x = 5로 선언한 변수의 범위는 어디까지일까요?

복습: Lua에서 변수 선언하기

이 레슨의 핵심 내용입니다.

  • 변수는 기본적으로 전역 변수이므로 항상 local을 사용하십시오
  • 지역 변수는 더 빠르고(해시 조회가 없음) 안전합니다
  • 다중 할당: a, b = b, a로 한 줄에서 값을 교환합니다
  • 모든 전역 변수는 _G에 저장되며, nil을 할당하면 삭제됩니다
  • 변수 가리기: 내부의 local이 바깥 변수를 변경하지 않고 가립니다
  • 관례에 따라 상수에는 UPPER_CASE를 사용합니다

다음 주제: 산술, 관계, 논리 연산자

자주 묻는 질문

“Lua에서 변수 선언” 강의는 무료인가요?

네 — “Lua에서 변수 선언” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Lua에서 변수 선언”에서 뭘 배우나요?

전역 변수와 지역 변수를 비교하고 명명 규칙을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“Lua에서 변수 선언” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Lua 자료형 개요
  2. Lua에서 변수 선언
  3. 산술 및 관계 연산자
  4. 형 변환과 변환 함수
← Lua Academy(으)로 돌아가기