Menu
Coddy logo textTech

엄격 모드에서의 Nil 안정성

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

가장 흔한 Lua 크래시는 "attempt to index nil"입니다. 이는 값이 존재한다고 가정했지만 실제로는 존재하지 않을 때 발생합니다. Luau의 해결책은 nil 규율(nil discipline)입니다. --!strict 모드에서는 일반 string이 절대로 nil이 될 수 없습니다. nil이 될 가능성이 있다면 ?를 사용하여 타입에 명시해야 합니다:

--!strict
local nickname: string? = nil   -- ok: string 또는 nil
local username: string = nil    -- ✗ strict 모드에서 타입 오류

이 규율은 양방향으로 적용됩니다. string? 타입이 주어지면 strict 모드에서는 nil 가능성을 배제할 때까지 이를 일반 문자열로 사용하지 못하게 합니다. 표준적인 방법은 typeof 가드처럼 타입을 좁혀주는 일반 비교 연산입니다:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- 여기서 name은 string입니다
    end
    return "NOBODY"
end

nil이 유효한 케이스가 아니라 버그여야 하는 상황에서는 assert를 사용하세요. assert(x ~= nil) 이후부터 검사기(checker)는 해당 스코프의 나머지 부분에서 x를 non-nil로 취급합니다. 런타임에서도 어설션이 잘못된 가정이 발생한 그 시점에 즉시 크래시를 발생시켜, 멀리 떨어진 곳에서 예기치 않게 터지는 것을 방지합니다.

이 방식의 장점은 코드 편집 중에 검사기가 "누락되었을 수도 있는" 모든 값을 처리하도록 강제하므로, 런타임 에러가 아예 발생하지 않는다는 점입니다.

challenge icon

챌린지

쉬움

누락되었을 수 있는 사용자 프로필 필드를 처리합니다. 파일의 시작 부분에 --!strict를 추가하세요.

  • getDisplayName(fullName: string?): stringfullNamenil이 아니면 fullName을 반환하고, 그렇지 않으면 Anonymous User를 반환합니다.
  • formatEmail(email: string?): stringemailnil이 아니면 소문자로 변환된 이메일(string.lower)을 반환하고, 그렇지 않으면 No email provided를 반환합니다.
  • getUserInfo(name: string?, email: string?): string — 두 함수를 모두 사용하여 Name: [processed name], Email: [processed email] 형식으로 반환합니다.

그런 다음 각각 한 줄에 하나씩 출력하세요:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. getUserInfo("Sarah Wilson", nil)

직접 해보기

--!strict
-- 여기에 코드를 작성하세요
-- 1) getDisplayName(fullName: string?): string — nil-check, fallback "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower or "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — 둘을 결합
-- 4) 작업의 일곱 가지 테스트 호출을 출력
quiz icon실력 점검

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

Luau 소개의 모든 레슨