🔥 switch 문의 평가 순서

338자
5분

switch 문은 case 절을 위에서부터 아래로 순차적으로 평가하면서, 조건을 만족하는 case 절을 찾으면 해당 case 절의 코드 블록을 실행하고 switch 문을 종료합니다.

예를 들어, 다음과 같은 switch 문이 있다고 가정해 봅시다.

switch i {
case 0:
case f():
}
 
go

만약 i가 0이라면, f() 함수는 호출되지 않습니다. 첫 번째 case 절인 case 0:이 조건을 만족하므로, 두 번째 case 절인 case f():은 평가되지 않기 때문이에요.

참고: Go 플레이그라운드에서는 항상 시간이 2009-11-10 23:00:00 UTC부터 시작되는 것처럼 보입니다. 이 값의 의미는 독자 여러분이 직접 생각해 보시길 바라요! (힌트: Go 언어의 탄생일과 관련이 있습니다.)

다음은 switch 문을 사용하여 오늘이 토요일인지, 내일이 토요일인지, 모레가 토요일인지, 아니면 토요일까지 더 멀리 있는지를 판단하는 예제 코드입니다.

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    fmt.Println("토요일은 언제인가요?")
 
    // 현재 요일을 가져옵니다.
    today := time.Now().Weekday()
 
    switch time.Saturday {
    case today + 0:
        fmt.Println("오늘이 토요일입니다.")
    case today + 1:
        fmt.Println("내일이 토요일입니다.")
    case today + 2:
        fmt.Println("모레가 토요일입니다.")
    default:
        fmt.Println("토요일까지는 좀 더 기다려야 합니다.")
    }
}
 
go

코드를 하나씩 살펴보도록 하죠.

today := time.Now().Weekday()
 
go
  • time.Now()로 현재 시간을 가져온 뒤, .Weekday() 메서드를 호출하여 현재 요일을 time.Weekday 타입으로 얻습니다.
switch time.Saturday {
 
go
  • switch 키워드 다음에 비교 대상인 time.Saturday를 지정합니다. 이는 time.Weekday 타입의 상수로, 토요일을 나타냅니다.
case today + 0:
    fmt.Println("오늘이 토요일입니다.")
 
go
  • 첫 번째 case 절에서는 today + 0을 평가합니다. 이는 현재 요일과 토요일의 차이가 0인지를 확인하는 것으로, 오늘이 토요일인 경우에 해당됩니다.
case today + 1:
    fmt.Println("내일이 토요일입니다.")
 
go
  • 두 번째 case 절에서는 today + 1을 평가합니다. 현재 요일에서 1일을 더한 값이 토요일인지를 확인하는 것으로, 내일이 토요일인 경우입니다.
case today + 2:
    fmt.Println("모레가 토요일입니다.")
 
go
  • 세 번째 case 절에서는 today + 2를 평가하여, 현재 요일에서 2일을 더한 값이 토요일인지를 확인합니다. 즉, 모레가 토요일인 경우를 나타내요.
default:
    fmt.Println("토요일까지는 좀 더 기다려야 합니다.")
 
go
  • 마지막으로 default 절에서는 위의 어떤 case 절에도 해당되지 않는 경우, 즉 토요일까지 3일 이상 남은 경우에 실행됩니다.

이렇게 switch 문을 사용하면 여러 조건을 간결하고 가독성 있게 처리할 수 있습니다. case 절은 위에서부터 순차적으로 평가되므로, 조건을 적절히 배치하는 것이 중요하죠.