Go Language

[Go] #8 분기문 - Switch

Yeom's 2022. 12. 18. 21:12
728x90
반응형

Switch문에 의한 선택적 실행

이번에 배울 Switch문의 내용은 이전 챕터의 조건문과 흐름을 같이하고있다. 바로 '조건에 따른 흐름 분기'라는 내용이다. 이 말은 어떠한 조건이 주어졌을 때 그 조건과 맞는 부분을 실행함을 의미한다. 하지만 조금 다른 부분이 있다. 예를 들어, if ~ else if문은 num이 1일 때 이 조건과 맞는 조건문을 하나씩 검토해서 출력하는 느낌이다. '여기는 2일때... 여기는 3일때.. 여기는 4일때.. 여기가 1일때 실행하는 곳이구나!' 라는 느낌이다. 하지만 Switch문은 num이 1이면 라벨이 1인 곳을 딱 찾아내서 수행 구문을 실행시키는 느낌이다.

 

switch문은 기본적으로 변수를 가져와 switch 옆에 '태그'로 사용한다. 변수는 어느 자료형이든 쓸 수 있다. 태그의 값에 따라 case의 '라벨'과 일치하는 것을 찾고 일치하는 case의 구문을 수행한다. Go언어에서는 switch옆에 태그뿐만이 아니라 '표현식'을 쓰는 경우가 있다. 그리고 case 옆에도 라벨뿐만 아니라 참/거짓을 판별할 수 있는 표현식을 쓰는 경우도 있다. 그리고 태그나 표현식이 어느 조건에도 맞지 않는다면 default문을 사용해 해당 구문을 수행한다.

그리고 굳이 if문처럼 블록 시작 브레이스({)를 같은 줄에 쓰지 않아도 실행이 된다. 그리고 break를 따로 입력하지 않아도 해당되는 case만 수행한다. C언어에서는 break가 없으면 모든 case를 실행하는 것과 대조적이다.

 

1
2
3
4
5
6
7
8
9
switch 태그/표현식{
case 라벨/표현식:
    수행구문
case 라벨/표현식:
    수행구문
    ...
default 라벨/표현식:
    수행구문
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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("모르겠어요.")
    }
}
cs

사실 위의 형식은 Go언어 switch문에만 해당된다. C언어와 같은 언어는 switch문의 사용이 굉장이 제한적이다. switch문에 전달되는 인자가 반드시 필요하고, 정수형 변수(char 형도 포함)여야 한다. 그리고 전달되는 인자가 정수형 변수이기 때문에 case옆에 쓰이는 라벨도 상수 형태로만 쓰일 수 있어서 식을 쓸 수 없다. 쉽게 말해서 참/거짓을 판별하는 조건식은 쓸 수 없다는 것이다. 판별이 아닌 선택만을 위한 역할을 한다고 볼 수 있다.

아래는 C언어에서 활용되는 switch문의 대표적인 쓰임새이다. 역시 해당되는 태그와 일치하는 라벨의 case만 실행하기 위해 break를 전부 입력했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
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!");
}
cs

쓰임새가 비교적 넓은 Go언어에서의 switch문

이제는 Go언어에서 switch문이 어떻게 쓰이는 지 알아보자.

  • switch에 전달되는 인자로 태그 사용
  • switch에 전달되는 인자로 표현식 사용
  • switch에 전달되는 인자 없이 case에 표현식 사용(참/거짓 판별)

각각의 경우를 예시 코드를 보면서 확인해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//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")
    }
}
cs

위 예시 코든느 일부러 if문 조건식을 사용했다. "apple", "banana", "grape" 세 개 이외의 값을 입력하면 "잘못 입력했습니다."라는 구문이 출력되고 프로그램이 종료된다. 여기서 알아야 할 점이 있다. 

  • default문을 사용하지 않으면 if문을 사용해 따로 예외 처리를 해야하기 때문에 코드가 길어진다.
  • "return"을 실행하면 해당 함수가 종료된다. main 함수 안에서 return은 main함수를 종료한다는 것을 의미하기 때문에 프로그램이 종료된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//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)
}
cs

위 예시는 default문을 사용해 예외 처리를 하였다. 그리고 return을 입력하지 않았다면 "모르겠어요."를 출력한 뒤 아래 줄인 fmt.Println(result)를 실행한다. 따라서 아무 값도 초기화되지 않는 result는 빈칸으로 출력된다. 불필요한 실행을 막기 위해 잘못된 입력이 되면 return으로 프로그램을 종료시킨 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//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("모르겠어요.")
    }
}
cs

이렇게 switch문을 이용해서 여러 개의 조건을 처리하는 것을 확인 할 수 있다. switch문을 사용하며 ㄴ앞서 다뤘던 if~else if문으로 만든 코드를 동일하게 만들 수 있다. 다른 언어에서는 switch문의 쓰임에 제한이 많아 활용도 제한적이었지만, Go언어에서는 쓰임새가 확장되어 조건문을 독점하다시피했던 if문의 지분을 많이 차지할 수 있습니다. 따라서 if~else if문을 사용할지 switch문을 사용할지는 취향에 따른 문제이다. 보통 조건이 많지 않다면 if~else if, 조건이 많다면 switch문을 사용한다.

728x90
반응형