조건문과 흐름이 같다!
조건에 따라 흐름 분기
어떤 조건이 주어졌을 때 그 조건과 맞는 부분을 실행함!
하지만 조금 다른 점이 있는데, 예를 들어 if~else if
문은 num이 1일 때 이 조건과 맞는 조건무을 하나씩 검토해서 출력하는 느낌, '여기는 2일때.. 여기는 3일때... 여기는 4일때... 여기가 1일때 실행하는 곳! 이라는 느낌?
swich
문은 num이 1이면 라벨이 1인 곳을 딱 찾아내서 수행 구문을 실행시키는 느낌! '음.. 1일때 실행해야 하는 곳이.. 바로 여기구나!'
swich
문은 기본적으로 변수를 가져와 '태크'로 사용합니다. 변수는 어느 자료형이든 쓸수가 있습니다.
태그의 값에 따라 case의 '라벨'과 일치하는 것을 찾고 일치하는 case의 구문을 수행!
Go에서는 swich옆에 태그 뿐만 아니라 표현식
을 쓰는 경우가 있다. 그리고 case 옆에도 라벨뿐만이 아니라 참/거짓을 판별할 수 있는 표현식을 쓰는 경우도 있다. 그리고 태그나 표혀닉이 어느 조건에도 맞지 않은다면 default문을 사용해 해당 구문을 수행합니다.
그리고 굳이 if
문처첨 블록 시작 브레이드 ({)를 같은 줄에 쓰지 않아도 실행! break를 따로 입력하지 않아도 해당되는 case만 수행!
형태
switch 태그/표현식{ case 라벨/표현식: 수행구문 case 라벨/표현식: 수행구문 ... default 라벨/표현식: 수행구문 }
코드
package main import "fmt" func main() { var num int fmt.Print("정수 입력:") fmt.Scanln(&num) switch num { case 0: fmt.Println("영") case 1: fmt.Println("일") case 2: fmt.Println("이") case 3: fmt.Println("삼") case 4: fmt.Println("사") default: fmt.Println("모르겠어요.") } }
입력
5
출력
모르겠어요.
위의 형식은 Go언어 swich문에만 해당!
C언어와 같은 언어는 switch문의 사용이 굉장히 제한적! swich문에 전달되는 인자가 반드시 필요하고, 정수형 변수(char 형도 포함), 전달되는 인자가 정수형 변수이기 떄문에 case옆에 쓰이는 라벨도 상수 형태로만 쓰일 수 있어서 식을 쓸 수 없다ㅜㅜ 즉, 참/거짓 판별하는 조건식은 쓸 수 없다는 것!
판별이 아닌 선택만을 위한 역할이다.
코드
switch(num){ case 1: printf("1은 one\n"); break; case 2: printf("2는 two\n"); break; case 3: printf("3은 three\n"); break; default: printf("I don't know!"); }
switch에 전달되는 인자로 태그 사용
switch에 전달되는 인자로 표현식 사용
switch에 전달되는 인자 없이 case에 표현식 사용(참/거짓 판별)
코드
//switch에 전달되는 인자로 태그 사용 package main import "fmt" func main() { var fruit string fmt.Print("apple, banana, grape중에 하나를 입력하시오:") fmt.Scanln(&fruit) if (fruit != "apple") && (fruit != "banana") && (fruit != "grape") { fmt.Println("잘못 입력했습니다.") return } switch fruit { case "apple": fmt.Println("RED") case "banana": fmt.Println("YELLOW") case "grape": fmt.Println("PURPLE") } }
입력
dkiej
출력
잘못 입력했습니다.
return
은 종료다!
defualt
문을 사용하지 않으면 if
문을 사용해 따로 예외 처리를 해야하기 떄문에 코드가 길어진다.
코드
//switch에 전달되는 인자로 표현식 사용 package main import "fmt" func main() { var num int var result string fmt.Print("10, 20, 30중 하나를 입력하시오:") fmt.Scanln(&num) switch num / 10 { //표현식 case 1: result = "A" case 2: result = "B" case 3: result = "C" default: fmt.Println("모르겠어요.") return } fmt.Println(result) }
입력
10
출력
A
default
문을 사용해 예외 처리!, return
을 입력하지 않았다면 "모르겠어요."를 출력한 뒤 아래 줄인 fmt.Println(result)
를 실행!
따라서, 아무 값도 초기화되지 않은 result
는 빈칸으로 출력! 불필요한 실행을 막기 위해 잘못된 입력이 되면 return
으로 프로그램을 종료!
코드
//switch에 전달되는 인자 없이 case에 표현식 사용(참/거짓 판별) package main import "fmt" func main() { var a, b int fmt.Print("정수 a와 b를 입력하시오:") fmt.Scanln(&a, &b) switch { case a > b: fmt.Println("a가 b보다 큽니다.") case a < b: fmt.Println("a가 b보다 작습니다.") case a == b: fmt.Println("a와 b가 같습니다.") default: fmt.Println("모르겠어요.") } }
입력
8 7
출력
a가 b보다 큽니다.
switch
문을 이용해 여러 개의 조건을 처리하는 것을 확인!switch
문을 사용하면 앞서 다뤘던 if ~else if
문으로 만든 코드를 동일하게 만들 수 있다.if ~else if
, 조건이 많다면 swithc
문을 사용!