소개
프로그램에서 하나의 표현식 값에 따라 서로 다른 처리를 해야 하는 상황이라면, 일련의 if 문을 나열하는 방식은 각 조건마다 중괄호 블록이 따로 필요해 코드가 길어지고 지저분해지기 쉽습니다. 이럴 때 switch-case 구조를 활용하면 프로그램을 훨씬 간결하고 읽기 쉽게 만들 수 있습니다.
switch 구조를 사용하면 동일한 변수(또는 표현식)를 여러 개의 서로 다른 값과 비교하고, 일치하는 값에 따라 각각 다른 코드 블록을 실행할 수 있습니다.
기본 문법
switch (expr) {
case val1:
// expr이 val1과 일치할 때 실행할 코드
break;
case val2:
// expr이 val2와 일치할 때 실행할 코드
break;
...
...
default:
// 위의 어떤 값과도 일치하지 않을 때 실행할 코드
}각 case 블록 끝에는 반드시 break 문을 작성해야 합니다. break가 없으면 프로그램 흐름이 일치한 case 이후의 나머지 case들로 계속 이어져 실행되는 fall-through 현상이 발생하기 때문입니다.
다음 예제에서는 사용자에게 두 개의 숫자와 연산 종류(1/2/3/4 = 더하기/빼기/곱하기/나누기)를 입력받아 해당 연산을 수행합니다.
예제 1: 숫자 연산 처리
<?php
$first=(int)readline("enter a number");
$second=(int)readline("enter another number");
$x=readline("enter 1/2/3/4 for add/subtract/multiply/divide");
$result=0;
switch($x){
case 1: echo $first+$second; break;
case 2: echo $first-$second; break;
case 3: echo $first*$second; break;
case 4: echo $first/$second; break;
default: echo "Incorrect input";
}
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
Incorrect input
default 키워드는 switch 표현식이 어떤 case와도 일치하지 않을 경우 실행될 문장 블록을 지정하는 역할을 합니다. 위 예제에서는 1~4 외의 값이 입력되었기 때문에 default 블록의 메시지가 출력된 것입니다.
빈 case 블록의 동작
특정 case 블록이 비어 있으면, 별도의 처리 없이 프로그램 흐름이 그대로 다음 case로 넘어갑니다. 이 특성을 활용하면 여러 값을 하나의 실행 블록으로 묶어 처리할 수 있습니다.
예제 2: 여러 case 묶기
<?php
$x=(int)readline("enter a number");
switch($x){
case 1:
case 2: echo "x is less than 3"; break;
case 3: echo "x is equal to 3"; break;
case 4: echo "x is greater than 3"; break;
default: echo "x is beyond 1 to 4";
}
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
x is beyond 1 to 4
case 1과 case 2가 비어 있는 채로 연달아 배치되어 있으므로, x가 1 또는 2일 때 모두 "x is less than 3"이 출력됩니다.
문자열 값 비교하기
switch 문에서는 숫자뿐만 아니라 문자열 값과도 표현식을 비교할 수 있습니다.
예제 3: 문자열 매칭
<?php
$x=readline("enter a something..");
switch($x){
case "India": echo "you entered India"; break;
case "USA": echo "You typed USA"; break;
case "Mumbai": echo "you entered Mumbai"; break;
default: echo "you entered something else";
}
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
you entered something else
마무리 및 참고 사항
switch 문은 하나의 변수를 여러 값과 비교해야 할 때 if-else 문보다 가독성이 뛰어난 선택입니다. 다만 다음 사항을 항상 기억하세요.
• 각 case 블록 끝에는 의도적으로 fall-through를 만들려는 경우가 아니라면 break를 반드시 작성합니다.
• 어떤 case에도 해당하지 않는 입력을 처리하기 위해 default 블록을 습관적으로 포함하는 것이 좋습니다.
• switch 문은 느슨한 비교(==)를 사용하므로, 타입까지 엄격하게 비교해야 한다면 PHP 8부터 도입된 match 표현식을 대안으로 고려해볼 수 있습니다.