본문으로 바로가기

[Golang] Switch문

category Programming/Go 2022. 11. 6. 14:44

Switch문 동작 원리

switch문은 값에 따라 다른 로직을 수행할 때 사용한다.

형식

switch 비굣값 {
case 값1:
	문장
case 값2:
	문장
default:
	문장
}
  • 비굣값과 case값이 같으면 해당 case문장을 수행하고 switch문을 종료한다.
  • 같은 값이 없으면 default 문장을 수행한다. (default는 생략 가능하다.)

그래서 switch문 언제 씀?

복잡한 if else문을 깔끔하게 변경 가능함.

  • Before
package main

import "fmt"

func main() {

	day := 3

	if day == 1 {
		fmt.Println("첫째 날입니다")
		fmt.Println("오늘은 팀미팅이 있습니다.")
	} else if day == 2 {
		fmt.Println("둘째 날입니다")
		fmt.Println("새로운 팀원 면접이 있습니다.")
	} else if day == 3 {
		fmt.Println("셋째 날입니다.")
		fmt.Println("설계안을 확정하는 날입니다.")
	} else if day == 4 {
		fmt.Println("넷째 날입니다.")
		fmt.Println("예산을 확정하는 날입니다.")
	} else if day == 5 {
		fmt.Println("다섯째 날입니다.")
		fmt.Println("최종 계약하는 날입니다.")
	} else {
		fmt.Println("프로젝트를 진행하세요")
	}
}

 

  • After
package main

import "fmt"

func main() {

	day := 3

	switch day {
	case 1:
		fmt.Println("첫째 날입니다")
		fmt.Println("오늘은 팀미팅이 있습니다.")
	case 2:
		fmt.Println("둘째 날입니다")
		fmt.Println("오늘은 면접이 있습니다.")
	case 3:
		fmt.Println("셋째 날입니다.")
		fmt.Println("설계안을 확정하는 날입니다.")
	case 4:
		fmt.Println("넷째 날입니다.")
		fmt.Println("예산을 확정하는 날입니다.")
	case 5:
		fmt.Println("다섯째 날입니다.")
		fmt.Println("최종 계약하는 날입니다.")
	default:
		fmt.Println("프로젝트를 진행하세요")
	}
}

 

다양한 switch문 형태

1️⃣ 한 번에 여러 값 비교

package main

import "fmt"

func main() {

	day := "thursday"

	switch day {
	case "monday", "tuesday": // ❶
		fmt.Println("월, 화요일은 수업 가는 날입니다.")
	case "wednesday", "thursday", "friday": // ❷
		fmt.Println("수, 목, 금요일은 실습 가는 날입니다.")
	}
}
  • 하나의 case는 하나 이상의 값을 비교할 수 있다.

2️⃣ 조건문 비교

단순히 값만 비교할 수 있는게 아니라 if문 처럼 true가 되는 조건문을 검사할 수 있다.

package main

import "fmt"

func main() {
	temp := 18

	switch true {
	case temp < 10 || temp > 30:
		fmt.Println("바깥 활동하기 좋은 날씨가 아닙니다.")
	case temp >= 10 && temp < 20:
		fmt.Println("약간 추울 수 있으니 가벼운 겉옷을 준비하세요")
	// 이미 두 번째 case를 실행했기 때문에 검사하지 않습니다.
	case temp >= 15 && temp < 25:
		fmt.Println("야외활동 하기 좋은 날씨입니다")
	default:
		fmt.Println("따뜻합니다.")
	}
}
  • 비굣값을 true로 할 경우 case의 조건문이 true가 되는 경우 실행된다.
  • 비굣값을 적지 않는다면 default값으로 true를 사용한다.
  • switch { ... }

3️⃣ switch 초기문

if문과 마찬가지로 switch문에서도 초기문을 넣을 수 있다.

형식

switch 초기문; 비굣값{
	case 값1:
		...
	case 값2:
		...
	default:	
}

예제 1

package main

import "fmt"

func getMyAge() int {
	return 22
}

func main() {
	switch age := getMyAge(); age { // getMyAge() 결과값 비교 ❶
	case 10:
		fmt.Println("Teenage")
	case 33:
		fmt.Println("Pair 3")
	default:
		fmt.Println("My age is", age) // age값 사용
	}

	fmt.Println("age is", age) // error - age 변수는 사라졌습니다. ❷
}

예제 2

package main

import "fmt"

func getMyAge() int {
	return 22
}

func main() {
	// age 변수 선언 및 초기화
	switch age := getMyAge(); true { // ❶
	case age < 10:
		fmt.Println("Child")
	case age < 20:
		fmt.Println("Teenager")
	case age < 30:
		fmt.Println("20s")
	default:
		fmt.Println("My age is", age) // age값 사용
	}
}

const 열거값과 switch

const 열거값에 따라 수행되는 로직을 변경할 때 switch문을 주로 사용한다.

예제

package main

import "fmt"

type ColorType int // 별칭 ColorType을 선언하고 Const 열거값 정의 ❶
const (
	Red ColorType = iota
	Blue
	Green
	Yellow
)

// 각 ColorType 열거값에 따른 문자열을 반환하는 함수
func colorToString(color ColorType) string { // ❷
	switch color {
	case Red:
		return "Red"
	case Blue:
		return "Blue"
	case Green:
		return "Green"
	case Yellow:
		return "Yellow"
	default:
		return "Undefined"
	}
}

func getMyFavoriteColor() ColorType {
	return Blue
}

func main() {
	fmt.Println("My favorite color is", colorToString(getMyFavoriteColor()))
}

switch문을 사용해 색깔을 나타내는 열거값을 문자열로 바꾸는 함수이다.

break와 fallthrough 키워드

일반적으로 다른 프로그래밍 언어에서는 switch문의 각 case 종료시에 break 를 사용해야 다음 case로 코드가 이어서 실행되지 않고 switch문을 빠져나가지만

Go언어는 break를 사용하지 않아도 조건을 만족하면 자동으로 switch문을 빠져나가게 된다.

그러면 반대로 하나의 case문을 실행 후 다음 case문까지 같이 실행하고 싶다면 어떻게 해야 할까?

fallthrough 키워드를 사용하면 된다.

예제

package main

import "fmt"

func main() {

	a := 3

	switch a {
	case 1:
		fmt.Println("a == 1")
		break
	case 2:
		fmt.Println("a == 2")
	case 3:
		fmt.Println("a == 3")
		fallthrough //
	case 4:
		fmt.Println("a == 4")
	case 5:
		fmt.Println("a == 5")
	default:
		fmt.Println("a > 4")
	}
}
fallthrough 키워드는 코드를 보는 사람에게 혼동을 줄 수 있으니 되도록 사용하지 않는걸 권장한다.

'Programming > Go' 카테고리의 다른 글

[Golang] 배열 (Array)  (0) 2022.11.12
[Golang] for문  (0) 2022.11.11
[Golang] if문  (0) 2022.11.06
[Golang] 상수 (Const)  (0) 2022.10.29
[Golang] 함수 (Function)  (1) 2022.10.29