Menu
Coddy logo textTech

상수 테이블 동결하기

Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨 — 73개 중 55번째.

상수 테이블에도 한 가지 약점이 있습니다. 여전히 일반 테이블이라는 점입니다. 어디서나 어떤 코드든 UserRole.Admin = 99를 쓸 수 있으며, 이렇게 되면 작성한 "상수"가 조용히 상수가 아니게 됩니다.

Luau는 table.freeze를 통해 이 격차를 메웁니다. 테이블을 동결(freezing)하면 런타임 시 읽기 전용이 되며, 필드를 추가, 변경 또는 제거하려는 모든 attempterror를 발생시킵니다. 관용적인 작성 방법은 테이블을 생성하는 바로 그 위치에서 동결하는 것입니다. table.freeze는 할당할 준비가 된 동일한 테이블을 반환합니다:

local Color = table.freeze({
    Red = 1,
    Green = 2,
    Blue = 3,
})

print(Color.Red) -- 1: 읽기는 평소처럼 작동합니다
Color.Gold = 4   -- ✗ 오류: 읽기 전용 테이블을 수정하려고 시도함

이 과정의 지금까지 내용들과 달리, 이것은 런타임 보호입니다. 편집 시점의 경고가 아니라 쓰기가 실행되는 순간 발생하는 실제 error입니다. 타입 검사기가 확인하지 못한 코드로부터도 안전하게 보호합니다.

함께 알아두면 좋은 두 가지 사항: table.isfrozen(t)는 테이블의 동결 여부(boolean)를 반환하며, 동결은 얕게(shallow) 적용됩니다. 즉, 중첩된 테이블은 직접 동결하지 않는 한 변경 가능한 상태로 남아 있습니다. 또한 동결을 해제할 수도 없습니다. 한 번 동결되면 테이블은 계속 동결된 상태를 유지합니다.

동결된 상수 table과 매개변수를 위한 리터럴 유니온의 조합은 완벽한 Luau 열거형(enum)이 됩니다. 아무도 조작할 수 없는 명명된 런타임 값과 이를 사용하는 모든 곳에서의 편집 시점 검사를 제공합니다.

challenge icon

챌린지

쉬움

table.freeze를 사용해 한 번에 생성하고 동결하는, Color라는 이름의 **동결된(frozen)** 상수 table을 만드세요. 다음 항목을 포함해야 합니다:

  • Red = 1
  • Green = 2
  • Blue = 3

volume = 5 필드를 가진 settings라는 이름의 일반(동결되지 않은) table을 만드세요.

각각 한 줄에 하나씩 출력하세요:

  1. Color.Red
  2. Color.Blue
  3. Color가 동결되었는지 여부 (table.isfrozen)
  4. settings가 동결되었는지 여부
  5. pcall 내부에서 Color에 필드를 추가하려고 시도한 결과 — pcall(function() Color.Gold = 4 end)를 호출하고 반환된 boolean 값을 출력하세요

직접 해보기

-- 여기에 코드를 작성하세요
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) Color.Red, Color.Blue, 양쪽 isfrozen 결과를 출력
-- 4) 금지된 쓰기를 pcall하고 반환된 불리언을 출력
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Luau 소개의 모든 레슨