2021. 5. 26. 15:57ㆍ개발/Golang
switch문은 여러조건을 검사하거나 열거값에 따라서 다른 명령을 수행할 때 사용하기 편합니다. 이번시간엔 switch문을 요약해보고자 합니다.
1. switch문 동작원리
switch 비굣값 { // 검사하는 값이 옵니다.
case 값1: // 비굣값과 값1이 같을 때 수행합니다.
문장
case 값2: // 비굣값과 값2이 같을 때 수행합니다.
문장
default: // 만족하는 case가 없을 때 수행합니다.
문장
}
- switch 키워드 다음에 비굣값이 옵니다. 그리고 첫번째 case를 검사합니다 만약 case문이 같으면 수행하고 종료합니다. 같은 값이 없으면 default 문장을 수행합니다. default는 생략 가능합니다.
- if문은 조건이라면 switch는 값이 중요합니다.
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")
case 4:
fmt.Println("a==4")
default:
fmt.Println("a>4")
}
}

2. switch문을 언제 쓰는가?
- 동작이 많이 필요한 경우 if else문을 쓰면 한 눈에 보이지 않고 코드가 지저분 한경우에 씁니다.
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("프로젝트를 진행하세요.")
}
}

3. 다양한 switch문 형태
- 한 번에 여러 값 비교
case는 하나 이상의 값을 비교할 수 있습니다. 각 값은 쉼표 , 로 구분합니다.
package main
import "fmt"
func main() {
day := "thurday"
switch day {
case "monday", "tuesday":
fmt.Println("월,화요일은 수업 가는날입니다.")
case "wednesday","thurday","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문의 비굣값과 case의 값이 같아지는 경우를 찾는 구문이기 때문에 비굣값을 true로 할 경우 case의 조건문이 true가 되는 경우가 실행됩니다.
- switch문은 다음에 비굣값을 적지 않는 경우 default값으로 true를 사용합니다.
switch true {
....
}
// ↓ 위 식을 다음과 같이 줄여 쓸 수 있습니다.
switch {
....
}
- switch 초기문
if문과 마찬가지로 switch문에도 초기문을 넣을 수 있습니다.
switch 초기문; 비굣값 {
case 값1:
...
case 값2:
...
default:
}
switch문에서의 선언된 초기문의 변수는 switch문이 종료되기 전까지 접근할 수 있습니다. 하지만 종료되면 사라지기 때문에 잘 확인하고 써야합니다.
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 ins",age) //age값사용
}
}

- 비굣값 true를 사용해서 case조건문이 true가 되는 경우를 찾습니다. 비굣값이 true일 경우 생략할 수 있습니다.
- swtich age := getMyAge(); { 같이 쓸 수 있습니다.
4. 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()))
}

- ColorType 별칭 타입을 정의하고 ColorType의 열거값을 정의했습니다.
- switch문을 이용해 각 열거값에 따른 문자열을 반환하는 함수를 만들었습니다.
- 열거값은 switch문과 잘 어울립니다.
※ 열거값에 색깔하나를 추가하면 colorToString()함수도 수정해줘야합니다. 이런 경우를 커플링됐다고 하거나 결합됬다고 합니다. 열거값이 수정될 때 switch case문도 수정해줘야합니다. 그래서 하나의 열거값에 연관된 switch case는 최대한 줄이는게 좋습니다.
4. break와 fallthrough 키워드
일반적으로 다른언어에서는 switch문의 case종료시 break를 사용해야 코드가 이어서 실행되지 않습니다. 하지만 Go언어는 break를 사용하지 않아도 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")
break
case 3:
fmt.Println("a==3")
case 4:
fmt.Println("a==4")
default:
fmt.Println("a>4")
}
}

- case 1과 case2는 break문을 사용해서 switch문을 빠져나갔습니다.
- case 3과 case4는 사용하지 않았습니다. Go언어에서는 break를 사용하든 사용하지 않든 상관없이 case하나를 실행후 switch문을 빠져나갑니다.
- fallthrough
하나의 case문을 실행 후 다음 case 문을까지 실행하고싶을때 사용합니다.
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 // fallthrough 사용
case 4:
fmt.Println("a==4")
default:
fmt.Println("a>4")
}
}

- case3 구문 마지막에 fallthrough 키워드를 사용했습니다. 그 결과 case 4까지 실행됐습니다.
- fallthrough는 코드를 보는 사람에게 혼동을 일으킬 수 있으니 되도록 사용하지 않기를 권장합니다.
'개발 > Golang' 카테고리의 다른 글
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 12강 배열 (0) | 2021.05.27 |
|---|---|
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 11강 for문 (0) | 2021.05.27 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 9강 if문 (0) | 2021.05.24 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 8강 상수 (0) | 2021.05.23 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 7강 함수 (0) | 2021.05.22 |