반응형
Web Development · PHP switch
PHP switch 조건문 —
case · break · default 3종 세트
한 변수의 값에 따라 여러 갈래로 나뉘는 정석 패턴
시작 오늘 분석할 코드
$type 값에 따라 폼/확인/실행/오류 4가지 화면을 분기하는 코드. 같은 변수를 여러 값과 비교하는 상황에 switch가 가장 깔끔하다.
<?php $type = "form"; switch($type){ // 등록 폼을 표시 case "form": print "등록 폼입니다."; break; // 확인 화면을 표시 case "confirm": print "확인 화면입니다."; break; // 등록처리를 실행 case "exec": print "등록처리를 실행중"; break; //오류 처리 default: print "화면이 없습니다."; } ?>
실제 출력 미리보기
등록 폼입니다.
→ $type이 "form"이므로 첫 케이스에서 매치 → 출력 → break로 빠져나감.
용어 용어 정리
switch"이 변수의 값에 따라 분기하라"는 키워드
case"값이 ~와 같으면" 한 분기를 표시
breakswitch 블록을 즉시 빠져나감
default어느 case에도 안 맞으면 실행 (else 역할)
fall-throughbreak 없으면 다음 case로 흘러내림
: (콜론)case 끝 표시 (세미콜론 아님)
==switch 비교는 느슨한 동등 비교 (== 사용)
matchPHP 8+ 의 더 엄격한 대안 (===)
1 switch의 기본 구조
switch ( 비교할_변수 ) { case 값1: ... 실행할 코드 ... break; case 값2: ... 실행할 코드 ... break; default: ... 어느 case와도 안 맞을 때 ... }
괄호 안 변수의 값을 위에서부터 차례로 각 case 값과 비교한다. 처음 매치된 case의 코드를 실행하고, break를 만나면 switch 전체를 빠져나간다.
2 case + break의 의미 — 가장 중요한 한 쌍
switch의 가장 큰 함정은 break를 안 쓰면 다음 case로 그대로 흘러내린다는 점이다 (fall-through). 의도치 않은 실행이 일어난다.
break 있음 (정상)
case "form":
print "A";
break;
case "exec":
print "B";
break;"form" → "A"만 출력
break 누락 (위험)
case "form":
print "A";
case "exec":
print "B";
break;"form" → "A" + "B" 둘 다 출력
※ break는 옵션이 아니라 거의 필수다. 의도적으로 fall-through를 쓰는 경우(같은 처리를 여러 case에 적용)가 아니면 빠뜨리지 말 것.
3 의도된 fall-through — 여러 case 묶기
같은 처리를 여러 값에 적용하고 싶을 때는 일부러 break를 빼는 경우도 있다. case를 연달아 쓰면 그 모두에 같은 코드가 적용된다.
switch($day){ case "월": case "화": case "수": case "목": case "금": print "평일"; break; case "토": case "일": print "주말"; break; } // 월~금 모두 "평일", 토·일은 "주말"
의도적 fall-through일 때는
// fallthrough 같은 주석을 남겨주면 코드 리뷰어가 "버그가 아니라 의도"임을 알 수 있다.4 default — 모든 케이스를 놓쳤을 때
위의 모든 case와 매치되지 않으면 default 블록이 실행된다. if-else의 마지막 else와 같은 역할. 어느 위치에 둬도 동작하지만 관습적으로 맨 아래 둔다.
switch($type){ case "form": ... break; case "exec": ... break; default: // ← "이상한 값"이 들어와도 안전망 print "화면이 없습니다."; }
※ default가 없으면?
- 매치되지 않으면 아무것도 실행되지 않음
- 화면이 텅 빈 채 응답이 가는 경우 발생
- 예상 못한 입력에 대비해 default를 쓰는 습관이 좋다
반응형
5 if-elseif vs switch — 언제 무엇을?
if-elseif
- 각 분기가 다른 변수·연산
- 예:
$a > 10 || $b == "x" - 범위 비교 (>, <, between)
switch
- 한 변수의 여러 값 비교
- 예:
$type이 "form/exec/confirm" - 등호 비교만 (==)
// if-elseif (변수 반복) if($type == "form") ... elseif($type == "confirm") ... elseif($type == "exec") ... else ... // switch (한 번만) switch($type){ case "form": ... case "confirm": ... case "exec": ... default: ... }
6 switch의 함정 — 느슨한 비교
PHP의 switch는 ==로 비교한다. "0"과 0이 같다고 판단한다거나, 빈 문자열과 0이 같다고 보는 경우가 있어 주의해야 한다.
$x = 0; switch($x){ case "abc": // PHP 7 이전: 0 == "abc" 가 참! ← 이상한 동작 // PHP 8 이후: 수정됨 print "matched abc"; break; }
※ PHP 8 이전엔 숫자 0과 임의의 문자열이 == 비교에서 같다고 판정되는 버그성 동작이 있었다. PHP 8+에서는 수정됨. 그래도 의도가 분명하면
match 사용을 권장.7 PHP 8+ 의
match — switch의 후계자$message = match($type){ "form" => "등록 폼입니다.", "confirm" => "확인 화면입니다.", "exec" => "등록처리를 실행중", default => "화면이 없습니다.", }; print $message;
※ match가 더 좋은 이유
===로 엄격 비교 — 0과 "abc" 헷갈림 없음break불필요 — fall-through 없음- 표현식이라 결과를 변수에 저장 가능
- 매치 안 되고 default도 없으면 예외 — 누락 방지
- 한 case에 여러 값:
"a", "b" => ...
8 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
break 누락 |
다음 case까지 흘러 들어가 두 번 실행 | 각 case 끝에 break |
case 뒤에 세미콜론 (case "x";) |
case 라벨로 인식 안 됨 | 콜론 (case "x":) |
default 없음 |
이상한 값에 대해 무반응 | default 추가 |
| 0과 "abc" 헷갈림 (PHP 7-) | 의외 매치 | PHP 8 이상 또는 match 사용 |
case에 범위 (case > 10:) |
Parse error | switch는 등호만 — 범위는 if-elseif |
9 switch 실행 흐름
switch($type) ← $type = "form" ↓ [ case "form": ] ← 매치! ↓ "등록 폼입니다." 출력 ↓ [ break; ] ← switch 빠져나감 ↓ [ switch 종료 — 다음 코드로 ] # 다른 값일 때: $type = "exec": case "form" → 안 맞음 case "confirm" → 안 맞음 case "exec" → 매치! 출력 → break $type = "abc": 모두 안 맞음 → default 실행
핵심 한 줄 요약
switch한 변수를 여러 값과 비교하는 분기문
case"이 값이면" 분기 — 콜론(:)으로 끝
breakswitch에서 빠져나감 — 거의 필수
default아무 case도 안 맞을 때 실행
fall-throughbreak 없으면 다음 case로 흐름
vs if-elseif한 변수 여러 값 → switch / 다양한 조건 → if
match (PHP 8+)엄격 비교 + break 없음 + 값 반환
반응형
'php' 카테고리의 다른 글
| PHP 디렉토리 읽기 — opendir / readdir / closedir 완전 정리 (1) | 2026.06.12 |
|---|---|
| PHP while 반복문 — 조건이 참인 동안 반복하는 선검사 루프 (0) | 2026.06.12 |
| PHP로 SELECT 옵션 동적 생성 — 배열 → HTML 만들기 완전 정리 (0) | 2026.06.12 |
| PHP for + count() — 배열 길이만큼 반복하는 패턴 완전 정리 (0) | 2026.06.12 |
| PHP 중첩 if-else — type 분기로 배우는 다중 분기 완전 정리 (0) | 2026.06.12 |
왕진 블로그

댓글