Golang 의 Switch-Case 분기문

GolangBeginner
지금 연습하기

소개

이전 실습에서는 if-else 분기문의 사용법을 알아보았습니다. 이번 실습에서는 switch-case 분기문에 대해 배워보겠습니다. switch 문은 if-else 문에 비해 여러 가지 조건을 처리해야 하는 상황에 더욱 적합합니다.

학습 포인트:

  • switch-case 문
  • default 키워드
  • fallthrough 키워드
이 실습은 단계별 안내를 통해 학습과 실습을 돕는 가이드형 랩입니다. 각 단계를 주의 깊게 따라가며 직접 경험을 쌓아보세요. 통계에 따르면 이 과정은 초급 수준이며, 100%의 수료율과 학습자들로부터 100%의 긍정적인 평가를 기록하고 있습니다.

기본 구문

switch 분기문의 구문은 if 분기문과 마찬가지로 조건 판단 로직을 포함하고 있어 유사한 면이 있습니다. 기본적인 구조는 다음과 같습니다.

switch condition {
    case val1:
        // 코드 블록
    case val2:
        // 코드 블록
    ...
    default:
        // 코드 블록
}

조건식 (condition) 에는 모든 타입의 표현식이 올 수 있습니다. 조건식의 결과가 특정 case 문에 정의된 값과 일치하면 해당 case 블록이 실행되며, 실행이 끝나면 프로그램은 즉시 switch 문을 빠져나갑니다.

case 문에 사용하는 값들은 반드시 조건식의 결과와 동일한 타입이어야 합니다.

프로그램은 위에서 아래 방향으로 case 문을 검사하며, 가장 먼저 일치하는 case 문 하나만 실행하고 전체 switch 분기를 종료합니다.

default 문은 if 문의 else와 비슷한 역할을 합니다. 일치하는 case가 하나도 없을 때 마지막 수단으로 실행됩니다.

일기 예보 프로그램을 예로 들어 살펴보겠습니다. switch.go라는 새 파일을 생성하고 다음 코드를 작성하세요.

cd ~/project
touch switch.go
package main

import (
    "fmt"
)

func main() {
    // 오늘의 날씨
    weather := "rainy"
    switch weather {
    case "snow":
        fmt.Println("Remember to wear a scarf today.🧣")
    case "rainy":
        fmt.Println("Remember to bring an umbrella today.🌂")
    default:
        fmt.Println("Today is sunny.☀")
    }
}

코드를 실행합니다.

go run switch.go

출력 결과는 다음과 같습니다.

Remember to bring an umbrella today.🌂

이 프로그램은 날씨 상태에 따라 다른 메시지를 출력합니다. 먼저 오늘의 날씨를 "rainy"로 설정했습니다. switch-case 문에서 세 가지 조건을 확인하는데, 눈이 오면 목도리를, 비가 오면 우산을 챙기라고 안내하며, 그 외의 경우에는 맑은 날로 간주합니다.

분기 내 다중 값 처리

case 문 하나에 여러 개의 값을 지정할 수도 있습니다. 방법은 다음과 같습니다.

switch condition {
    case val1, val2:
        // 코드 블록
    ...
}

앞서 작성한 날씨 프로그램을 다음과 같이 업데이트해 보겠습니다.

package main

import (
    "fmt"
)

func main() {
    // 오늘의 날씨
    weather := "snow"
    switch weather {
    case "snow", "stormy":
        fmt.Println("Remember to wear a scarf today.🧣")
    case "haze", "sandstorm":
        fmt.Println("Remember to wear a mask today.😷")
    case "rainy":
        fmt.Println("Remember to bring an umbrella today.🌂")
    default:
        fmt.Println("Today is sunny.☀")
    }
}
go run switch.go

코드를 실행하면 다음과 같은 결과가 나옵니다.

Remember to wear a scarf today.🧣

몇 가지 날씨 조건을 더 추가했습니다. 이제 안개가 끼거나 황사가 불 때 마스크를 착용하라는 안내가 함께 제공됩니다.

조건 변수가 없는 switch 문

switch 문에서 조건 변수는 생략할 수 있는 선택적 매개변수입니다. 조건 변수를 생략하면 switch 문은 if-else 문과 매우 유사하게 동작합니다.

이전 섹션에서 다루었던 오늘의 요일을 출력하는 프로그램을 조건 변수가 없는 switch 문으로 다시 작성해 보겠습니다.

package main

import (
    "fmt"
    "time"
)

func main() {
    today := time.Now().Weekday()
    switch {
    case today == time.Monday:
        fmt.Println("Today is Monday.")
    case today == time.Tuesday:
        fmt.Println("Today is Tuesday.")
    case today == time.Wednesday:
        fmt.Println("Today is Wednesday.")
    case today == time.Thursday:
        fmt.Println("Today is Thursday.")
    case today == time.Friday:
        fmt.Println("Today is Friday.")
    case today == time.Saturday:
        fmt.Println("Today is Saturday.")
    default:
        fmt.Println("Today is Sunday.")
    }
}
go run switch.go

코드를 실행하면 다음과 같이 출력됩니다.

Today is Monday.

이 프로그램에서는 switch 키워드 옆의 조건 변수를 제거했습니다. 프로그램이 실행되면 각 case에 작성된 조건식이 참인지 확인합니다. 조건이 충족되는 즉시 해당 블록의 코드를 실행하고 switch 문을 종료합니다.

fallthrough 문

앞서 설명했듯이, Go 의 switch 문은 일치하는 case를 실행한 후 자동으로 분기를 빠져나갑니다.

만약 특정 case를 실행한 후에도 멈추지 않고 다음 case 블록까지 이어서 실행하고 싶다면 fallthrough 키워드를 사용하면 됩니다.

fallthrough 사용 시 주의사항은 다음과 같습니다.

  • 기본적으로 switch 문은 case 10이 일치하여 실행되면 이후의 분기는 무시합니다. 하지만 fallthrough를 사용하면 조건 일치 여부와 상관없이 바로 다음 case 블록을 강제로 실행합니다.
  • fallthrough는 바로 다음에 오는 단 하나의 case에만 영향을 주며, 이때 다음 case의 조건식은 검사하지 않습니다.
  • fallthroughswitch 문의 마지막 분기에서는 사용할 수 없습니다.

구체적인 예시를 살펴보겠습니다.

package main

import (
    "fmt"
)

func main() {
    n := 10
    switch n {
    case 10:
        fmt.Println(10)
        fallthrough
    case 3:
        fmt.Println(3)
    }
}
go run switch.go

실행 결과는 다음과 같습니다.

10
3

n이 10 이므로 case 10이 실행되어 10이 출력됩니다. 그 후 fallthrough를 만났기 때문에 다음 case 3 블록으로 넘어가 3까지 출력하게 됩니다.

switch 문에서의 초기화 구문

Go 언어에서는 if 문뿐만 아니라 switch 문에서도 초기화 구문을 사용할 수 있습니다. 조건 변수 앞에 초기화 문을 작성하고 세미콜론 (;) 으로 구분하면 됩니다.

퀴즈

이제 이전 섹션의 프로그램을 수정하여 초기화 구문을 switch 문 안으로 옮겨보겠습니다.

switch2.go라는 새 파일을 생성합니다. 아래의 코드를 참고하여 switch2.go 파일에 작성하되, 변수 선언 부분을 switch 문 내부의 초기화 구문으로 변경하세요.

cd ~/project
touch switch2.go

수정 전 코드는 다음과 같습니다.

package main

import (
    "fmt"
)

func main() {
    n := 10
    switch n {
    case 10:
        fmt.Println(1)
        fallthrough
    case 3:
        fmt.Println(3)
    }
}

요구 사항:

  • switch2.go 파일은 ~/project 디렉토리에 위치해야 합니다.

힌트: if-else 실습에서 배웠던 초기화 구문 작성 방식을 참고하여 수정해 보세요.

✨ 솔루션 확인 및 연습

요약

이번 실습에서는 switch 분기문에 대해 알아보았습니다. 주요 내용은 다음과 같습니다.

  • case 문이 일치하여 실행되면 프로그램은 현재 switch 블록을 자동으로 빠져나갑니다.
  • fallthrough 키워드를 사용하면 다음 case 블록을 이어서 실행할 수 있습니다.
  • switch 문도 세미콜론을 사용하여 조건식 앞에 초기화 구문을 포함할 수 있습니다.