Menu
Coddy logo textTech

리터럴 유니온 Enum 사용하기

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

리터럴 유니온은 함수 매개변수로서의 가치를 톡톡히 발휘합니다. 매개변수 타입을 유니온으로 지정하면 타입 체커가 함수가 항상 유효한 members로만 호출되도록 보장합니다:

type Direction = "up" | "down" | "left" | "right"

local function move(direction: Direction)
    print(`Moving {direction}...`)
end

move("left")  -- ✓
move("north") -- ✗ 타입 오류: Direction이 아님

함수 내부에서는 if/elseif 체인을 사용하여 members철저하게(exhaustively) 처리하세요. 타입이 inputfour개의 값으로 제한하므로, 세 개를 검사하고 else가 마지막 값을 처리하도록 하면 모든 경우를 다루게 됩니다:

local function describe(direction: Direction): string
    if direction == "up" then
        return "Going upward"
    elseif direction == "down" then
        return "Going downward"
    elseif direction == "left" then
        return "Turning left"
    else
        return "Turning right"
    end
end

한 가지 주의할 점: io.read()와 같이 외부에서 들어오는 문자열은 plain string 타입으로 취급됩니다. 타입 체커가 사용자가 무엇을 입력할지 알 수 없기 때문입니다. 이전에 배운 :: cast는 해당 값을 열거형 타입으로 취급하도록 알립니다:

local direction = io.read() :: Direction

cast는 약속일 뿐 검사가 아닙니다. 런타임에 입력값을 검증하지 않습니다. 프로덕션 코드에서는 먼저 검증을 거쳐야 하며, 여기서는 타입이 지정된 함수가 사용자 입력을 깔끔하게 받아들일 수 있게 해줍니다.

challenge icon

챌린지

쉬움

멤버 "up", "down", "left", "right"를 갖는 리터럴 유니온 타입 Direction을 생성하세요.

direction: Direction을 매개변수로 받아 Moving [direction]...을 출력하는 함수 move를 생성하세요.

direction: Direction을 받아 string을 반환하고, if/elseif/else를 사용하여 모든 멤버를 처리하는 함수 getMovementDescription을 생성하세요:

  • "up"Going upward
  • "down"Going downward
  • "left"Turning left
  • "right"Turning right

io.read()를 사용하여 사용자로부터 한 줄을 읽고 ::를 통해 Direction으로 cast하세요. 그런 다음:

  1. direction을 인자로 movecall하세요.
  2. 동일한 direction에 대해 getMovementDescription의 결과를 print하세요.

직접 해보기

-- 여기에 코드를 작성하세요
-- 1) Direction 타입 정의
-- 2) move와 getMovementDescription 작성 (if/elseif/else)
-- 3) 입력 읽기: local direction = io.read() :: Direction
-- 4) move 호출 후 description 출력
quiz icon실력 점검

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

Luau 소개의 모든 레슨