범위

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

스크립팅에서 코드 블록은 제어 구조 또는 함수 의 본체입니다. 변수 또는 함수의 범위는 이를 액세스할 수 있는 코드 블록이며, 전역 또는 지역일 수 있습니다. 모든 블록은 전역 변수와 함수에 접근할 수 있습니다. 블록은 부모 블록 내의 지역 변수와 함수에 접근할 수 있지만, 자식 블록 내의 지역 변수와 함수에 접근할 수는 없습니다.

변수와 함수는 기본적으로 전역 범위를 가지지만, Luau가 지역 변수와 함수에 더 빠르게 접근하기 때문에 지역 범위로 선언하는 것이 거의 항상 더 나은 선택입니다. 변수 또는 함수에 지역 범위를 주려면 선언할 때 이름 앞에 키워드 local을 붙여야 합니다.

스크립트는 다른 스크립트의 전역 및 지역 변수나 함수에 접근할 수 없습니다. 스크립트 간에 값과 함수를 공유하려면 ModuleScripts를 사용하세요.


local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!
  • 블록 B는 블록 A의 지역 변수에 접근할 수 있습니다.
  • 블록 C는 블록 A와 B의 지역 변수와 함수에 접근할 수 있습니다.
  • 블록 A는 블록 B나 C의 지역 변수와 함수에 접근할 수 없습니다.
  • 블록 B는 블록 C의 지역 변수에 접근할 수 없습니다.

전역 범위

전역 변수 또는 함수를 선언한 후, 동일한 스크립트의 모든 코드 블록이 이를 접근할 수 있습니다. 변수를 local 키워드로 선언하지 않는 한 변수와 함수는 전역 범위를 가집니다.

다음 코드에서 testVar는 지역 testFunc() 함수 내에서 전역 범위를 가집니다. Luau가 testFunc()를 호출할 때, testVar에 값 64를 할당합니다. testVar는 전역 범위를 가지므로, testFunc() 외부의 print() 함수가 이를 접근해 64를 출력할 수 있습니다.

전역 함수와 변수의 예제

local function testFunc() -- 지역 범위
testVar = 64 -- 전역 범위
end
testFunc()
print(testVar) -- 64

다음 코드에서 전역 변수 x0으로 시작하여 for 루프의 각 반복마다 1씩 증가하고, 마지막 값이 4일 때 다시 출력됩니다.


x = 0 -- 전역 변수 "x"
for i = 1, 4 do
x += 1
print("전역 'x' = " .. x)
end
print("전역 'x' = " .. x)
--[[ 결과 출력:
전역 'x' = 1
전역 'x' = 2
전역 'x' = 3
전역 'x' = 4
전역 'x' = 4
]]

전역 변수와 함수를 선언하는 것은 입력할 내용이 적기 때문에 쉽지만, 전역 변수와 함수는 지역 변수에 비해 다음과 같은 단점이 있습니다:

  • Luau는 해시 조회를 사용하여 전역 변수와 함수에 접근하므로 성능 측면에서 비쌉니다. 시간 비판 루프에서 전역 변수를 사용하는 것은 동일한 루프에서 지역 변수를 사용할 때보다 성능이 10% 더 느릴 수 있습니다.
  • Luau는 지역 변수가 범위가 끝난 후 이를dispose하여 메모리 사용량을 줄입니다.
  • 동일한 스크립트 내에서 전역 변수와 함수에 접근할 수 있지만, 여러 스크립트 간에는 접근할 수 없습니다. 따라서 전역 변수 또는 함수는 범위 내 지역 변수, 업값 또는 섀도우와 비교했을 때 이점이 없습니다.

지역 범위

Luau는 당신이 선언한 코드 블록 내에서만 지역 변수나 함수에 접근할 수 있습니다. 지역 범위로 변수를 생성하는 것은 그 값이 변경되는 시점과 장소를 보다 엄격하게 제어할 수 있게 해줍니다.

다음 코드에서 testFunc() 함수와 testVar 변수는 지역 범위를 가집니다. 오직 testFunc() 내의 코드만 testVar 변수에 접근할 수 있습니다. testVar 변수는 testFunc() 외부에서 값을 가지지 않으므로, testFunc() 내에서 print(testVar)를 호출하면 testVar의 값을 출력하지만, testFunc() 외부에서 print(testVar)를 호출하면 nil을 출력합니다.


local function testFunc() -- 지역 범위
local testVar = 64 -- 지역 범위
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil

다음 코드에서 지역 변수 x는 1행에서 값 0을 가집니다. Luau가 for 루프를 반복하면서 다른 지역 변수 x1의 값을 가집니다. 그런 다음 Luau는 변경되지 않은 값 0으로 초기 변수 x를 출력합니다.


local x = 0 -- 지역 변수 "x"
for i = 1, 4 do
local x = 1 -- 다른 변수 "x", 이 "for" 루프에 지역적
print("루프 'x' = " .. x)
end
print("초기 'x' = " .. x)
--[[ 결과 출력:
루프 'x' = 1
루프 'x' = 1
루프 'x' = 1
루프 'x' = 1
초기 'x' = 0
]]

캡처

지역 변수를 선언하고 할당한 후, 해당 범위와 해당 지역 변수가 포함된 함수 범위 내에서 읽을 수 있습니다. 이 기법은 캡처로 알려져 있습니다.

다음 코드에서 함수 f는 지역 변수 x를 캡처합니다. f() 내의 변수 x업값입니다.


local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5

섀도우

지역 변수를 선언하고 할당한 후, 해당 범위와 자손 범위 내에서 이를 읽을 수 있습니다. 자손 범위에서 변수를 다시 선언하고 재할당하면, 가장 최근의 할당과는 다른 값을 가진 동일한 이름의 새로운 지역 변수를 생성하게 됩니다. 새로운 지역 변수가 이전 할당의 지역 변수에 영향을 미치지 않습니다. 이 기법은 섀도우링으로 알려져 있으며, 값은 재사용하지 않고 변수의 이름을 재사용하는 데에 도움이 됩니다.

다음 코드에서 Luau는 변수 x를 섀도우합니다. f() 내의 변수 x섀도우 변수입니다.


local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5

값을 할당하지 않고 지역 변수를 다시 선언할 수도 있으므로, 해당 범위와 자손 범위 내에서 변수를 재할당할 수 있습니다. 값을 할당하지 않고 지역 변수를 다시 선언하면 그 값을 nil로 설정합니다.

다음 코드에서 Luau는 getFruitByColor() 함수 내의 지역 변수 fruitName을 섀도우합니다. 함수는 fruitName을 새로운 섀도우 변수로 다시 선언하고 그 값을 nil로 설정합니다. 함수에는 fruitName에 값을 할당하는 자손 범위인 for 루프가 있습니다. for 루프 후, 함수는 fruitName 섀도우 변수를 반환합니다. 전체 함수 범위에서 fruitName은 초기 fruitName 지역 변수를 덮어쓰지 않는 동일한 지역 변수입니다.


local fruitName = "Chocolate"
local fruitTable = {
Lemon = "Yellow",
Apple = "Red",
Orange = "Orange"
}
local function getFruitByColor(color)
local fruitName
for key, value in fruitTable do
if value == color then
fruitName = key
end
end
return fruitName
end
local fruit = getFruitByColor("Yellow")
print(fruit) -- Lemon
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate
©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.