
Go 언어 열거형(Enum) 완벽 정복! 아이오타(iota)로 상수 다루는 꿀팁 대방출!
다른 프로그래밍 언어들을 살펴보면, 서로 관련된 상수들을 보기 좋게 묶어주는 enum(이넘)이라는 특별한 키워드를 제공하는 경우가 많습니다.
예를 들어 신호등의 색깔(빨강, 노랑, 초록)이나 요일처럼 말입니다.
하지만 Go 언어에는 아쉽게도 이 enum(이넘) 키워드가 직접적으로 존재하지 않는데요.
그렇다고 실망할 필요는 없습니다! Go 언어는 상수(constant)와 특별한 식별자인 iota(아이오타)를 활용하여 이와 유사한 기능을 아주 깔끔하게 구현할 수 있도록 지원한데요.
이 방법을 사용하면 Go 개발자들도 명확하고 유지보수하기 좋은 열거형 타입을 만들 수 있습니다.
지금부터 iota(아이오타)가 어떻게 작동하고, 이를 활용해 Go 언어에서 열거형과 비슷한 구조를 어떻게 만들 수 있는지 함께 알아보도록 하겠습니다.
1. 로 순서 있는 상수 만들기
iota(아이오타) 식별자는 순차적으로 증가하는 숫자를 아주 간단하게 만들어주는 역할을 하는데요.
마치 "하나, 둘, 셋..." 하고 숫자를 세는 것과 비슷해서, 열거형 상수를 정의할 때 정말 유용하게 사용됩니다.
바로 예시를 통해 확인해 볼까요?
package main
import "fmt"
// Day라는 새로운 타입을 int 기반으로 정의합니다.
type Day int
// 상수를 선언하는 const 블록입니다.
const (
// Sunday에 iota를 할당하면 0부터 시작합니다.
Sunday Day = iota
// iota는 자동으로 1씩 증가합니다. Monday는 1이 됩니다.
Monday
// Tuesday는 2가 됩니다.
Tuesday
Wednesday // Wednesday는 3
Thursday // Thursday는 4
Friday // Friday는 5
Saturday // Saturday는 6
)
func main() {
fmt.Println(Sunday) // 출력: 0
fmt.Println(Monday) // 출력: 1
fmt.Println(Tuesday) // 출력: 2
// 이런 식으로 나머지 요일들도 숫자로 출력됩니다.
}위 예제에서 iota(아이오타)는 const 블록 안에서 첫 번째 상수인 Sunday에 0을 할당하면서 시작합니다.
그리고 그 다음 상수인 Monday부터는 자동으로 1씩 증가된 값을 가지게 되는데요.
덕분에 우리는 각 요일에 일일이 숫자를 지정해 줄 필요 없이, iota(아이오타)가 알아서 0부터 6까지의 값을 차례대로 할당해 주게 됩니다.
정말 편리하지 않습니까?
2. 숫자 대신 의미 있는 이름으로! 인터페이스 활용하기
숫자로만 값을 가지는 것도 나쁘지 않지만, 우리가 실제로 프로그램을 사용할 때는 이 숫자 대신 "일요일", "월요일"처럼 알아보기 쉬운 문자열로 표현되면 훨씬 더 편리할 것입니다.
Go 언어에서는 fmt 패키지의 Stringer(스트링어) 인터페이스를 구현함으로써 이러한 기능을 멋지게 추가할 수 있는데요.Stringer(스트링어) 인터페이스는 String()이라는 메소드 하나만을 가지고 있는데, 이 메소드를 우리가 만든 타입에 맞게 구현해주면 됩니다.
package main
import "fmt"
type Day int
const (
Sunday Day = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
// Day 타입에 대한 String() 메소드를 구현합니다.
// 이 메소드가 있으면 fmt.Println과 같은 함수가 Day 타입의 값을 출력할 때 이 메소드를 사용합니다.
func (d Day) String() string {
// 요일 문자열 배열을 만들고, Day 값(0~6)을 인덱스로 사용하여 해당 문자열을 반환합니다.
return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[d]
}
func main() {
fmt.Println(Sunday) // 출력: Sunday
fmt.Println(Monday) // 출력: Monday
fmt.Println(Tuesday) // 출력: Tuesday
// 이제 숫자 대신 우리가 지정한 문자열로 출력됩니다!
}위 코드에서 func (d Day) String() string { ... } 부분이 바로 Stringer(스트링어) 인터페이스를 구현하는 부분입니다.Day 타입의 변수 d에 대해 String() 메소드를 호출하면, 미리 정의된 요일 문자열 배열에서 d의 숫자 값에 해당하는 인덱스의 문자열을 반환하도록 만들었습니다.
이렇게 하면 fmt.Println(Sunday)를 실행했을 때, 이전처럼 숫자 0이 아니라 "Sunday"라는 훨씬 이해하기 쉬운 문자열이 출력되는 것을 확인할 수 있습니다.
3. 문과 찰떡궁합! 열거형으로 코드 가독성 높이기
이렇게 iota(아이오타)와 Stringer(스트링어) 인터페이스를 활용해 만든 열거형 타입은 switch 문과 함께 사용될 때 그 진가를 더욱 발휘합니다.switch 문은 특정 변수의 값에 따라 서로 다른 코드를 실행하도록 분기하는 데 사용되는데요.
열거형 상수를 사용하면 코드가 훨씬 더 명확해지고 이해하기 쉬워집니다.
package main
import "fmt"
type Day int
const (
Sunday Day = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
func (d Day) String() string {
return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[d]
}
// 주어진 요일이 주말인지 판별하는 함수입니다.
func isWeekend(d Day) bool {
// Day 타입의 변수 d의 값에 따라 분기합니다.
switch d {
// d가 Saturday 또는 Sunday인 경우
case Saturday, Sunday:
return true
// 그 외의 모든 경우
default:
return false
}
}
func main() {
fmt.Println("일요일은 주말인가요?", isWeekend(Sunday)) // 출력: 일요일은 주말인가요? true
fmt.Println("수요일은 주말인가요?", isWeekend(Wednesday)) // 출력: 수요일은 주말인가요? false
}위 isWeekend 함수는 입력받은 Day 타입의 값이 Saturday나 Sunday인 경우에는 true를, 그렇지 않은 경우에는 false를 반환합니다.
만약 우리가 열거형 상수를 사용하지 않고 그냥 숫자로 요일을 다뤘다면, case 6, 0: 과 같이 코드를 작성해야 했을 텐데요.
이렇게 되면 숫자 6이나 0이 정확히 어떤 요일을 의미하는지 바로 알기 어려워 코드의 가독성이 떨어질 수 있습니다.
하지만 Saturday, Sunday와 같이 의미 있는 이름을 가진 상수를 사용함으로써, 코드를 읽는 사람이 훨씬 더 쉽게 그 의도를 파악할 수 있게 됩니다.
지금까지 Go 언어에 enum(이넘) 키워드가 없더라도, 상수와 iota(아이오타) 식별자를 얼마나 효과적으로 활용하여 열거형과 유사한 기능을 구현할 수 있는지 살펴보았습니다.iota(아이오타)를 통해 순차적인 숫자 값을 쉽게 생성하고, Stringer(스트링어) 인터페이스를 구현하여 가독성 높은 문자열 표현을 추가하며, switch 문과 함께 사용하여 코드의 구조를 더욱 명확하게 만들 수 있었는데요.
이러한 방법들은 단순히 기능을 구현하는 것을 넘어, 코드의 가독성과 유지보수성을 크게 향상시키는 데 기여합니다.
Go 언어로 개발할 때, 관련된 상수들을 묶어 관리해야 한다면 오늘 배운 iota(아이오타) 활용법을 적극적으로 사용해 보시는 것을 추천한데요!
'Go' 카테고리의 다른 글
| Go(고) API 개발, 설계부터 탄탄하게! Goa(고아) 프레임워크 완전 정복 (초보자 눈높이 가이드) (0) | 2025.05.28 |
|---|---|
| Go 언어 파일 읽기 완전 정복: 효율적인 방법과 핵심 꿀팁 대방출! (0) | 2025.05.27 |
| Go 언어에 do-while이 없다고? 걱정 마세요! for 루프로 완벽 재현 비법 대공개! (0) | 2025.05.27 |
| Go 개발 환경 청소의 달인! go clean 명령어로 개발 환경 상쾌하게 만들기 (0) | 2025.05.27 |
| Go 언어 시간 관리의 두 마법사: Timer와 Ticker 완벽 이해! (0) | 2025.05.27 |