본문 바로가기
Language/Golang

Golang (Go언어) Switch문 (조건문)

by HeeWorld 2024. 10. 31.

Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.

 

Golang 마스코트 Gopher(고퍼)

 

Switch문

- 값에 따라 다른 로직을 수행할 때 사용

- 복잡한 if else 문을 보기 좋게 switch문을 사용해 정리할 수 있음

switch 비굣값 {    // 검사하는 값이 옴
case 값1:         // 비굣값과 값 1이 같을 때 수행
  문장               // case 값 1가 ture이면 문장을 실행하고 빠져나옴
case 값2:         // 비굣값과 값 2이 같을 때 수행
  문장               // case 값 2가 ture이면 문장을 실행하고 빠져나옴
default:         // 만족하는 case가 없을 때 수행
  문장               // 만족하는 case가 없을 때 문장을 실행하고 빠져나옴
}

 

package main

import "fmt"

func main() {
	a := 3

	switch a {
	case 1:
		fmt.Println("a == 1")
	case 2:
		fmt.Println("a == 2")
	case 3:
		fmt.Println("a == 3")
	default:
		fmt.Println("a != 1, 2, 3")
	}
}

// 결과

a == 3

 

 

다양한 switch문 형태

 

한 번에 여러 값 비교

- case는 하나 이상의 값을 비교할 수 있고, 각 값은 쉼표 , 로 구분함.

package main

import "fmt"

func main() {

	day := "thursday"

	switch day {
	case "monday", "tuesday":
		fmt.Println("월, 화요일은 수업 가는 날 입니다.")
	case "wednesday", "thursday", "friday":
		fmt.Println("수, 목, 금요일은 실습 가는 날 입니다.")
	}
}


// 결과
수, 목, 금요일은 실습 가는 날 입니다.

 

 

조건문 비교

- 단순히 값만 비교하는 게 아닌 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 temp >= 15 && temp < 25:
		fmt.Println("야외 활동하기 좋은 날씨입니다.")
	default:
		fmt.Println("따뜻합니다.")
	}
}


// 출력
약간 추울 수 있으니, 가벼운 겉옷을 준비하세요.

 

 

switch true

- 비교 값을 true로, 결과는 블리언 타입으로 true, false 출력

 

→ switch문은 비굣값과 case의 값이 같아지는 경우를 찾는 구문이기 때문에 비굣값을 true로 할 경우 case의 조건문이 true가 되는 경우가 실행됨.

→ switch 다음에 비굣값을 적지 않는 경우 default 값으로 true를 사용

switch true {
 ...
}
 
// 아래와 같이 줄여서 사용할 수 있음
 
 switch {
  ...
 }

 

 

switch 초기문

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

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

 

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
    
}

// 결과

./prog.go:19:24: undefined: age

 

switch age := getMyAge(); age

→ 선언대입문을 사용하여 getMyAge의 return 값을 age의 변수 값으로 사용, 해당 변수는 { 안에서 사용할 수 있는 local 변수

 

✓ 에러가 나는 이유는 마지막 fmt.Println("age is", age) 구문의 age는 위 switch문이 아닌, 외부에서 사용하기 때문에 컴파일 에러가 발생됨.

 

 

const 열거값과 switch

- const문과 switch는 함께 자주 사용됨

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

package main

import "fmt"

type ColorType int // 별칭 타입, 타입을 선언할 것이고 이름은 ColorType이며 int 타입임(결국 int와 동일)
const (
	Red ColorType = iota
	Blue
	Green
	Yellow
)

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()))
}


// 결과
My Favorite color is Blue

 

type ColorType int 

→ 별칭타입(Alias, 어떤 타입의 이름을 정하는 것), type을 선언하고 새로운 이름과 타입을 선언하는 것

    (int타입이며, ColorType이라고 부르는 새로운 타입을 새로 만든 것)

 

const(

→ Red, Blue, Green, Yellow 타입은 모두 ColorType이고 iota 를 사용하여 0,1,2,3으로 감. 

→ 별칭을 사용하는 이유는 Red, Blue 등의 값을 명확하게 하기 위해 사용

   (Color를 나타내기 위한 코드 형태로 사용하기 때문에 별칭을 사용하여 의미를 명확하게 함)

 

func colorToString(color ColorType) string {

→ 각 ColorType 열거 값에 따른 문자열을 반환하는 함수 (colorToString함수는 ColorYype의 값을 받아서 string으로 변환하는 함수)

 

✓ fmt.Println("My Favorite color is", colorToString(getMyFavoriteColor()))

getMyFavoriteColor()함수가 먼저 호출되고 해당 함수의 결과를 먼저 인자로 넣기 때문에 가장 먼저 호출되고,

상단의 func getMyFavoriteColor()를 호출하는데, ColorType를 Blue로 반환(return)함.

Blue case가 걸려서 Blue가 반환되어 "My Favorite color is Bleu"가 출력 됨.

 

만약 colorToString()에 1을 넣게 되면, 동일하게 Blue가 나오는데, 상단 ColorType이 int 타입의 별칭이라 0(Red), 1(Blue) ... 1은 Blue를 반환

 

 

break와 fallthrough 키워드

- Go에서는 brake를 사용하지 않아도 case가 끝나면 자동으로 switch문을 빠져나감

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")
	default:
		fmt.Println("a > 4")
	}
}

// 결과

a==3
a==4

 

- case가 끝날 때 break를 사용해도 되고, 사용하지 않아도 됨(break 사용 여부와 상관 없이 case 하나를 실행 후 switch문을 빠져나감)

- break를 원하지 않으면 fallthrough를 사용하여 다음 case문으로 내려갈 수 있음 → case3 실행 이후 case4 실행하고 종료 됨

 

✓ fallthrough는 Go에만 있는 용어이며, 코드를 보는 사람에게 혼동을 일으킬 수 있으니 되도록 사용하지 않기를 권장함.

'Language > Golang' 카테고리의 다른 글

Golang (Go언어) 배열(Array)  (0) 2024.11.02
Golang (Go언어) for문 (반복문)  (4) 2024.10.31
Golang (Go언어) IF문 (조건문)  (4) 2024.10.30
Golang (Go언어) 상수(Constant)  (0) 2024.10.30
Golang (Go언어) 함수(Function)  (2) 2024.10.30