[Golang] 열거형(enum)

고는 열거형 타입을 지원하지 않습니다만, 그 열거형의 목적을 달성할 수 있습니다. 아래의 코드는 12개의 달(Month)에 대한 고 언어적 열거형 타입의 정의입니다.

type Month int

const (
	January Month = 1 + iota
	February
	March
	April
	May
	June
	July
	August
	September
	October
	November
	December
)

var months = [...]string{
	"January",
	"February",
	"March",
	"April",
	"May",
	"June",
	"July",
	"August",
	"September",
	"October",
	"November",
	"December",
}

func (m Month) String() string { return months[(m-1)%12] }

언어에서 근본적으로 열거형을 지원하지 않다보니, 다소 불편하고 어색하기는 합니다. 주지해야 할 코드만을 살펴보면, 4번에서 상수형 값 정의시 iota는 그 이후의 상수값들을 1씩 더해 정의되어지도록 지정합니다. 즉, January에 1의 값으로 정의되고, 그 다음인 February는 2의 값을 자동으로 갖도록한다는 것입니다. 그리고 33번은 Month를 enum 타입으로써 그 문자열 명칭을 갖도록 매서드를 추가해 주는 것입니다. 달의 순환이라는 개념을 위해 12로 나눈 나머지값을 인덱스 값으로 취했습니다. 활용하는 코드는 아래와 같습니다.

func main() {
	month := December

	if month == December {
		fmt.Println("Found a December")
	}

	month = month + Month(2)
	fmt.Println(month)

	month = January + Month(2)
	fmt.Println(month)

	month++
	fmt.Println(month)

	day := 34
	month = Month(day % 31)
	fmt.Println(month)

	val := int(month) + 4
	fmt.Println(val)

	month = Month(val) + 1
	fmt.Println(month)
}

우리가 원하는 enum 타입의 정의대로 그 결과값을 그대로 얘상할 수 있는데요. 결과는 아래와 같습니다.

Found a December
February
March
April
March
7
August

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다