php 입문 | 제어 구문 | switch 문에 의한 다수의 분기

if는 양자 택일(true, false)의 분기이었지만, 때로는 더 많은 처리가 분기 할 수 있다(물론 elseif를 사용하면 if문도 많은 분기 처리가 가능하긴 하지만 길어지면 코드가 복잡해 진다). 특히 숫자 등을 취급하는 경우, “결과가 1이면 이것, 2라면 이거, 3이라면 ……“라는 식으로 값에 따라 각각 다른 처리를 하고자하는 경우도 있다.

이러한 경우에 사용되는 것이 ‘switch’이라는 구문이다. 이것은 다음과 같은 형태를 하고 있다.

switch (조건) {
case 값1 :
    ...... 값1 경우의 처리 ......
    break;
case 값2 :
    ...... 값2 경우의 처리 ......
    break;

    ...... 필요한만큼 case가 계속 ......

default :
    ...... 어떤 것도 아닌 경우에 처리 ......
}

중괄호 대신 콜론과 endswitch를 사용할 수도 있다.

switch (값1):
  case 값1:
    ...... 값1 경우의 처리 ......
    break;
  case 값2:
    ...... 값2 경우의 처리 ......
    break;
    
  ...... 필요한만큼 case가 계속 ......
  
  default:
    ...... 어떤 것도 아닌 경우에 처리 ......
endswitch;

이 switch 문도 ()의 조건을 체크하여 분기를 한다. 그렇다고 해도 이 조건은 if와 같은 논리 값이 없다. 평범한 숫자나 텍스트 값으로도 상관없다.

이 switch는 ()의 조건 값을 확인하고, 그 값이 지정된 case로 점프하는 기능을 한다. 예를 들어, 거기에 있는 값이 ‘1’이라면, “case 1:“라는 것을 검색하고 거기로 점프한다는 것이다.

그러나 여기서 잊지 말아야 할 것은 “switch는 case로 점프할 뿐이고, 돌아가거나 필요한 구문을 종료하는 기능은 없다.“는 것이다. 즉, 그대로 위에서 아래로 실행이 될뿐이다. 따라서 필요한 작업을 마치면 구문을 빠져 나오게 해야 한다.

이를 위해 준비되어 있는 것이 “break"라는 예약어이다. 이는 현재 실행중인 구문을 빠져나와 다음 동작을 한다. 각 case에 준비된 처리의 마지막에는 반드시 이 break를 붙이는 것이 기본이라고 기억해 두자.

만약, 값과 같은 case를 찾을 수 없는 경우, 마지막에 있는 “default:“이 선언된 처리로 이동을 한다. 이 default는 생략할 수 있다. 이 경우는 case가 발견하지 않았다면 그냥 아무것도하지 않고 구문을 빠져나와 계속 진행하게 된다.

이 switch를 사용하면 매우 복잡한 분기도 만들 수 있다. 아래에 간단한 예제를 보도록 하자.

<?php
    $b = "A"; // 혈액형 쓰기
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <div>
            <?php
                switch($b){
                case "A":
                    echo "당신은 꼼꼼하군요.";
                    break;
                case "B":
                    echo "당신은 자유 분방하네요.";
                    break;
                case "AB":
                    echo "당신은 복잡한 사람이네요.";
                    break;
                case "O":
                    echo "당신은 거물 이군요.";
                    break;
                default:
                    echo"당신은 인간이 아니군요.";
                }
            ?>
        </div>
    </body>
</html>

이것은 혈액형에 의해 표시 메시지를 바꾸는 예제이다. 첫 번째 “$b"에 혈액형을 입력하자. 그 혈액형에 메시지가 표시된다.

여기에서는 switch($b)로 분기를 준비하고 있다. 그리고 case "A": 등 각 혈액형의 텍스트의 case를 준비하고, 그걸로 echo를 실행하고 있다. 이런 분기가 많은 분기는 if로 하려고하면 많은 if 및 elseif문을 써야 한다. 이는 switch에 의해 상당히 깔끔하게 쓸 수 있게 되었다.

case문에 break;가 없다면

예제를 하나 더 보도록 하자.

<?php
    $var = 2; 
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <div>
           <?php
                $var = 2;
                switch ($var) {
                    case 1:
                      echo "A";
                      break;
                    case 2:
                      echo "B";
                    case 3:
                      echo "C";
                      break;
                    default:
                      echo "Z";
                 }
             ?>
        </div>
    </body>
</html>

위 예제에서 $var 값이 2이기 때문에 “A"와 “B"를 표시된다. 이는 case 2: 처리 안에 break;문이 없어서 “A"를 표시하고 이어서 case 3:에 있는 “B"도 같이 표시를 하게 된 것이다.