선택적 속성
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨 — 73개 중 39번째.
모든 필드가 항상 존재하는 것은 아닙니다. Lua에서는 테이블에 존재하지 않는 필드를 읽으면 단순히 nil을 반환합니다. 이는 유연하지만 attempt to concatenate a nil value와 같은 버그가 몰래 발생하는 원인이 되기도 합니다.
Luau에서는 형태(shape)에 이를 명시적으로 표현할 수 있습니다. 필드의 타입 뒤에 ?를 붙여 해당 필드가 옵셔널(optional)임을 표시합니다:
type User = {
name: string, -- 필수
email: string?, -- 선택 사항: string 또는 nil
}
local alice: User = {name = "Alice", email = "alice@luau.dev"}
local bob: User = {name = "Bob"} -- ✓ 괜찮음, email은 선택 사항이전 변수에서 다루었던 것과 같습니다. string?는 string | nil의 축약어입니다. 이제 동일한 개념이 형태의 개별 필드에 적용됩니다.
옵셔널 필드는 nil일 수 있으므로 사용하기 전에 확인(check)해야 합니다. 클래식한 Lua 패턴이 잘 작동하며, 엄격 모드(strict mode)에서는 검사기(checker)가 조건문 내부에서 타입을 좁혀줍니다:
if bob.email then
print(`email: {bob.email}`) -- 여기서 email은 문자열입니다
else
print("no email on file")
end옵셔널은 "생략될 수 있음"을 의미하며, "아무 타입이나 가능함"을 의미하지 않습니다. 만약 email이 존재한다면, 그것은 여전히 string이어야 합니다.
챌린지
쉬움다음 조건을 만족하는 User라는 이름의 타입 별칭(type alias)을 작성하세요:
string타입의name(필수)string?타입의email(선택 사항)
두 명의 사용자를 생성하세요:
alice— 이름"Alice", 이메일"alice@luau.dev"bob— 이름"Bob", 이메일 없음
User를 매개변수로 받는 printContact 함수를 생성하세요. 사용자에게 이메일이 있으면 [name] - [email]을 출력하고, 그렇지 않으면 [name] - no email을 출력해야 합니다.
그런 다음:
printContact(alice)호출printContact(bob)호출bob.email == nil의 비교 결과 출력
직접 해보기
-- 여기에 코드를 작성하세요
-- 1) 선택적 email 필드가 있는 User 타입을 정의하세요
-- 2) alice(email 있음)와 bob(없음)을 생성하세요
-- 3) nil 검사가 있는 printContact를 작성하세요
-- 4) 두 사용자에 대해 호출한 다음 bob.email == nil을 출력하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.