switch 조건문

switch statement

Go의 switch 조건문은 C/C++이나 Java에 비해 사용법이 굉장히 다양하다. 여기서는 기본 사용법에 대해서만 우선 알아보자.


Go의 switch 작성 규칙은 다음과 같다.

SwitchStmt = ExprSwitchStmt | TypeSwitchStmt .

이 중 ExprSwitchStmt이 기본 용법으로 볼 수 있다. TypeSwitchStmt에 대한 것은 추후 관련 항목을 다룰 때 다시 살펴보자.

ExprSwitchStmt 규칙은 다음과 같다.

ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .
ExprCaseClause = ExprSwitchCase ":" StatementList .
ExprSwitchCase = "case" ExpressionList | "default" .

switch로 시작해 검사할 값을 case로 분기하는 것은 다른 언어와 유사하다.

var i = 1
switch i {
case 0:
	fmt.Println("Zero")
case 1:
	fmt.Println("One")
default:
	fmt.Println("Unknown")
}

여기서 한 가지 큰 특징은, Go의 case에서는 break를 사용하지 않아도 된다는 점이다. 즉, 다음 casebreak가 기본이다. 그렇다면 다음과 같은 코드를 작성하려면?

// c code
unsigned int i = 1;

switch (i)
{
	case 0:
	case 1:
	case 2:
		printf("<= 2\n");
		break;
	default:
		printf("> 2\n");
}

Go는 break를 기본으로 한 대신 다음 case로 이어 실행하는 별도의 키워드를 마련해 두었다. 바로 fallthrough이다. C/C++이나 Java로 작성했던 switch 문이 있다면 한 번 열어서 확인해 보자. 각 case 별로 break를 쓴 경우가 많은지, fallthrough로 작성한 것이 많은지. 더 자주 사용하는 방식을 기본으로 정하는 것은 꽤나 합리적으로 보인다. 위 c code는 fallthrough를 사용해 다음과 같이 쓸 수 있다.

// go code
var i uint = 1

switch i {
case 0:
	fallthrough
case 1:
	fallthrough
case 2:
	fmt.Println("<= 2")
default:
	fmt.Println("> 2")
}

그런데 이것도 c code에 비해 좀 깔끔한 맛이 덜하다. fallthroughcase가 많아질수록 점점 더 이런 경향은 짙어질 것이 뻔하다. 그래서 또 준비한 것이 case 뒤에 ExpressionList를 둔 것이다. Expression들을 comma(,)로 붙여둔 것이 ExpressionList이다. 따라서 위 코드는 다음과 같이 작성할 수도 있다.

// go code
var i uint = 1

switch i {
case 0, 1, 2:
	fmt.Println("<= 2")
default:
	fmt.Println("> 2")
}