[Golang] 분기문 - switch

이정훈·2023년 5월 25일
0

Golang

목록 보기
17/24
post-thumbnail

swich문에 의한 선택적 실행

  • 조건문과 흐름이 같다!

  • 조건에 따라 흐름 분기
    어떤 조건이 주어졌을 때 그 조건과 맞는 부분을 실행함!

  • 하지만 조금 다른 점이 있는데, 예를 들어 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!");
}
  • 위 코드는 C언에서 사용되는 예시다. case만을 실행하기 위해 break를 전부 입력!

사용이 비교적 넓다

  • 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문을 사용!

한 눈에 끝내는 고랭 기초 !!

profile
싱숭생숭늉

0개의 댓글