๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go

[Go] enum ์‚ฌ์šฉํ•˜๊ธฐ

by ์„œ์•„๋ž‘๐Ÿ˜ƒ 2025. 11. 10.

 

๋“ค์–ด๊ฐ€๋ฉฐ

Go๋Š” ๊ณต์‹์ ์œผ๋กœ enum ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ์‰ฌ์šฐ๋‹ˆ ๋ช‡๊ฐœ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ const + iota๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ํƒ€์ž… ์ •์˜(type alias)๋กœ ์—ด๊ฑฐํ˜•๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ iota๋ฅผ ์ด์šฉํ•œ Enum

package main

import "fmt"

// Weekday ํƒ€์ž… ์ •์˜
type Weekday int

// iota๋ฅผ ์ด์šฉํ•œ ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜ ์„ ์–ธ
const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

func main() {
    fmt.Println(Sunday, Monday, Tuesday) // 0 1 2
    fmt.Printf("%T\n", Sunday)           // main.Weekday
}
  • iota๋Š” const ๋ธ”๋ก ๋‚ด์—์„œ 0๋ถ€ํ„ฐ ์ž๋™ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Weekday ํƒ€์ž…์„ ์„ ์–ธํ•ด์„œ, ํƒ€์ž… ์•ˆ์ „์„ฑ๋„ ํ™•๋ณด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ int ๊ฐ’๊ณผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(type wrapping).

 

String ์ถœ๋ ฅ์šฉ Enum

package main

import "fmt"

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

// Weekday๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
func (w Weekday) String() string {
    return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[w]
}

func main() {
    day := Wednesday
    fmt.Println(day)         // Wednesday
    fmt.Println(int(day))    // 3
}
  • [...string]{} ๋ฐฐ์—ด์„ ํ™œ์šฉํ•ด์„œ enum ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  • String() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์œผ๋กœ fmt.Println์—์„œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

bitmask Enum ์˜ˆ์ œ (Flags)

package main

import "fmt"

type Permission uint8

const (
    Read Permission = 1 << iota  // 1
    Write                        // 2
    Execute                      // 4
)

func main() {
    var p Permission = Read | Write
    fmt.Println(p&Read != 0)   // true
    fmt.Println(p&Execute != 0) // false
}
  • iota + ๋น„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ ๊ถŒํ•œ ํ”Œ๋ž˜๊ทธ(enum flags) ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • | ์—ฐ์‚ฐ์œผ๋กœ ์กฐํ•ฉํ•˜๊ณ , & ์—ฐ์‚ฐ์œผ๋กœ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ”Œ๋ž˜๊ทธ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ด ์ž์ฃผ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์‹ค๋ฌดํ˜• ์˜ˆ์ œ: ์ƒํƒœ๊ฐ’ Enum

package main

import "fmt"

// Order ์ƒํƒœ ์ •์˜
type OrderStatus int

const (
    Pending OrderStatus = iota
    Paid
    Shipped
    Completed
    Cancelled
)

func (s OrderStatus) String() string {
    return [...]string{"Pending", "Paid", "Shipped", "Completed", "Cancelled"}[s]
}

func main() {
    var status OrderStatus = Shipped

    switch status {
    case Pending, Paid:
        fmt.Println("Order not delivered yet")
    case Shipped:
        fmt.Println("Order is on the way")
    case Completed:
        fmt.Println("Order delivered")
    case Cancelled:
        fmt.Println("Order cancelled")
    }

    fmt.Println(status) // Shipped
}

 

  • ๋‹ค๋ฅธ int ๊ฐ’๊ณผ ํ˜ผ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ž„์œผ๋กœ์จ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • String() ๋ฉ”์„œ๋“œ๋กœ ๋””๋ฒ„๊น…/๋กœ๊ทธ ์ถœ๋ ฅ์ด ์‰ฝ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • Switch-case์™€ ์กฐํ•ฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ ๊ด€๋ฆฌ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€