Chapter 9. switch문

조성권·2021년 8월 13일
0
post-thumbnail

오늘은 switch문을 사용하는 방법에 대해 배워보도록 하겠다.
다른 언어에도 switch문이 존재하지만 golang만의 차이점이 분명히 존재하니 주의해서 사용하길 바란다.

1. 기본 switch문

1-1. 정수 비교 switch문

첫번째로, 정수형 데이터에 대한 switch문을 작성해보도록 하겠다.
아래 예제코드를 보도록 하자.

i := 5

switch i{
	case 1:
 		fmt.Println("i: 1")
	case 2:
 		fmt.Println("i: 2")
	case 3:
		fmt.Println("i: 3")
	case 4:
		fmt.Println("i: 4")
	case 5:
		fmt.Println("i: 5")	// return Println
	default:
		fmt.Println("default")
}

최초, i:=5로 저장하였다.
switch문 하위 case문을 쫓아가다 case 5를 만나게 되면 조건에 충족되기에 해당 case문 내부로 접근하게 된다.
결과적으로 "i: 5"라는 출력문을 진행한 후, switch문을 탈출하게 된다.

  • 주의할 점
    golang은 암묵적으로 break 기능을 가지고 있다.
    타 언어에선 case문 하위에 break를 명시해주지 않으면 다음 case문으로 바로 접근하지만 golang은 오히려 그 반대이다.

1-2. 문자열 기반 switch문

1-1에선 정수 기반 switch문을 사용해봤다.
그렇다면 문자열 기반 switch문은 어떻게 사용될까?

아래 예제를 통해 알아보도록 하겠다.

s := "hello"

switch s{
	case "Hello":
    fmt.Println("Hello")
    case "hellO":
    fmt.Println("hellO")
    case "hello":
    fmt.Println("hello")	// return Println
    case "HELLO":
    fmt.Println("HELLO")
    default:
    fmt.Println("Deault")

위 예제를 통해 알 수 있는 점은 문자열을 비교할 때, 대소문자를 구분한다는 것이다.
그렇기 때문에 한글자라도 대소문자가 어긋나면 case문을 충족하지 않아 내부 함수로 진입하지 못한다.

  • 주의할 점
    문자열에 대해 switch문을 사용할 시, 대소문자를 구분한다는 것을 주의하면 좋을 것 같다.

2. fallthrough문

지금까진 기본 switch문에 대해 알아보았다.
위에서 언급한 것처럼 golang은 기본적으로 switch문을 사용할 시, 암묵적으로 break를 내포하고 있다.

그렇다면 case문을 충족한 후에도 다음 case문을 계속해서 진입하게끔 하고 싶다면 어떻게 해야할까?

예제를 통해 알아보도록 하겠다.

k := 2

switch k{
	case 1:
		fmt.Println("k: 1")
	case 2:
		fmt.Println("k: 2")	// return Println
		fallthrough
	case 3:
		fmt.Println("k: 3")	// return Println
		fallthrough
	case 4:
		fmt.Println("k: 4")	// return Println
		fallthrough
	default:
		fmt.Println("default")	// return Println
}

위 예제에선 case 2에 접근 시, 조건을 충족하므로 내부로 진입하게 되어 "k: 2"를 출력하게 된다.

  • 하지만 중요한건 지금부터이다.
  1. fallthrough를 기재했기 때문에 case 2를 탈출한 후, switch문을 종료하는 것이 아니라 case 3 내부로 곧장 진입하여 출력문을 호출한다.
  1. 또한, case 3에도 fallthrough를 기재했기 때문에 바로 case 4로 이동하게 된다.
  1. 이처럼 fallthrough가 기입된 이상 계속해서 다음 case문으로 이동하게 되고 결과적으로 본 예제에서는 case 2 ~ default문까지 쭉 출력하게 된다.

fallthrough: 현재 case문이 종료된 후, 다음 case문도 진입하도록 기능 수행

3. switch문 + 조건문

이번에는 switch문과 조건문을 함께 사용하는 방법에 대해 알아보도록 하겠다.
사실, 둘을 조합한다해서 거창한 점은 없다.
예제를 통해 알아보도록 하겠다.

j := 2
str := "world"

switch j{
	case 1:
		fmt.Println("j: 1")
	case 2:
		if str == "world"{
			fmt.Println("j: 2, str: world")	// return Println
		}else{
			fmt.Println("j: 2, str: ", str)
		}
	default:
	fmt.Println("default")
}

위 예제는 변수를 두개(j, str)두고 j는 switch문으로 비교 / str은 조건문을 통해 비교했다.

최초 switch문을 통해 case 2에 접근하게 된다.
이후, str == "world" 조건문에 부합하므로 해당 조건문 내부를 타고 출력문을 호출하게 된다.
본 예제에선 fallthrough를 사용하지 않았기 때문에 위 출력문을 호출한 뒤, switch문은 자연스레 탈출하게 된다.

4. 복수개의 조건 case문

지금까지는 각 case별로 하나의 조건을 가지고 대사작업을 진행하며 내부를 호출했다.
이번에는 복수 조건을 가진 case문을 사용하는 법을 알아보도록 하겠다.

4-1. 콤마(,) 사용법

h := 3

switch h{
	case 1,2:
		fmt.Println("h == 1 or h == 2")
	case 3,4:
		fmt.Println("h == 3 or h == 4")	// return Println
	case 5,6:
		fmt.Println("h == 5 or h == 6")
}

위 예제는 콤마(,)를 통해 case문의 조건을 걸었다.

  • case 1,2: h==1 || h==2와 동일한 조건
  • case 3,4: h==3 || h==4와 동일한 조건
  • case 5,6: h==5 || h==6과 동일한 조건

위와 같다고 볼 수 있으며 h:=3으로 저장했기 때문에 case 3,4에 부합하여 내부 출력함수를 호출하고 switch문을 탈출하게 된다.

4-2. 연산자 사용법

a := 3

switch {
	case a<3:
		fmt.Println("a<3")
	case 3<=a && a<5:
		fmt.Println("3<=a<5")	// return Println
	case 6<=a:
		fmt.Println("6<=a")
}

위 예제는 연산자를 통해 case문 작성해본 예시이다.
최초 a:=3으로 저장했기 때문에 case 3<=3 && a<5를 타게 되고 내부 출력문을 호출한 후, switch문을 탈출하게 된다.

5. 마무리

오늘은 switch문을 사용하는 방법에 대해 배워봤다.
다른 언어를 배운 경험이 있다면 switch문이 구조적으로 어떻게 작성하는지 알고 있을 것이다.
하지만 오늘 배운 것처럼 기존에 알고 있는 switch문과 golang의 switch문은 분명한 차이가 존재한다.
그렇기에 오늘 배운 부분은 꼭 이해하고 머리 속에 저장해둬야겠다!!

전체 소스 git 링크
https://github.com/cho876/Go/blob/main/Prac09/prac09.go

profile
천천히, 완벽히 배워나가고자 하는 웹 서비스 엔지니어

0개의 댓글