Enum 리터럴로 switch 쓰기

Enum 리터럴로 switch 쓰기

switch로 분기할 때마다 enum 타입이나 union 타입을 일일이 다시 적어야 한다면 꽤 번거롭죠? 그런 반복을 피하는 데 Enum Literals가 아주 유용하게 쓰여요. 이번에는 switch와 함께 enum 리터럴을 활용하는 패턴을 직접 코드로 확인해 볼게요.

출처: Zig Documentation — Switching with Enum Literals

본문

특히 color 값 하나마다 .auto, .on, .off처럼 어떤 타입의 리터럴인지가 분명할 때는, switch 안에서 매번 Color.auto라고 길게 쓰지 않고 점 하나만 붙인 리터럴로 간결하게 표현할 수 있어요. 그게 가능한 이유는 Zig 컴파일러가 switch 대상의 타입을 추론하니까, 각 가지에서 enum 혹은 union 타입을 반복해 명시하지 않아도 되기 때문이에요.

const std = @import("std");
const expect = std.testing.expect;

const Color = enum {
    auto,
    off,
    on,
};

test "enum literals with switch" {
    const color = Color.off;
    const result = switch (color) {
        .auto => false,
        .on => false,
        .off => true,
    };
    try expect(result);
}

여기서 switch의 각 가지는 .auto, .on, .off라는 enum 리터럴로 쓰였어요. Color.auto라고 써도 되지만, 이미 color의 타입이 Color로 정해져 있으니 점 앞부분을 생략해도 컴파일러가 알아서 맞춰 줍니다. 덕분에 코드가 훨씬 짧아지고, enum 이름이 반복되면서 생기는 잡음도 사라져요.

실행 흐름을 따라가 볼까요? colorColor.off이므로 switch는 .off 가지를 골라 true를 돌려주고, expect(result)가 이 값을 확인하니 테스트가 통과해요.

$ zig test test_exhaustive_switch.zig
1/1 test_exhaustive_switch.test.enum literals with switch...OK
All 1 tests passed.

더 알아보기

  • Enum Literals — enum과 union에 모두 적용되는 리터럴 문법의 기본
  • switch — switch 자체의 문법과 가지 작성 규칙