본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP 중첩 if-else — type 분기로 배우는 다중 분기 완전 정리

by 왕진 2026. 6. 12.
반응형

 

 

Web Development · PHP nested if

PHP 중첩 if-else —
"3가지 이상" 분기를 만드는 방법

type 값에 따라 다른 화면을 보여주는 다중 분기 패턴
시작 오늘 분석할 코드

$type 값에 따라 등록 폼·등록 처리·오류 화면 중 하나를 보여주는 코드. else 안에 다시 if를 넣은 중첩 구조로 3가지 이상 분기를 만들었다.

<?php $type = "form"; if($type == "form"){ print "등록 폼입니다."; }else{ if($type == "exec"){ print "등록 처리를 실행중"; }else{ print "화면이 없습니다."; } } ?>
실제 출력 미리보기
등록 폼입니다.

$type이 "form"이므로 첫 번째 if가 참 → 본문 실행 → 나머지는 모두 건너뜀.

용어 용어 정리
중첩if 안에 또 if를 넣은 구조
분기조건에 따라 갈라지는 처리 경로
elseif중첩 if-else를 평탄하게 쓰는 키워드
$type현재 화면 모드를 담은 변수 (form/exec/...)
==값 같은가 비교
기본 분기어느 조건에도 안 맞을 때 실행되는 마지막 else
indentation중첩이 깊어질수록 들여쓰기 단계 ↑
switch동일 변수 다중 분기에 더 깔끔한 대안

1 중첩 if-else의 의미

처음 if가 거짓일 때만 else 안의 코드가 실행되고, 그 안에서 다시 새 조건을 검사한다. 이렇게 "안 맞으면 다음 가능성을 다시 검사"를 쌓아가는 구조다.

$type == "form" ? ├ 참 → "등록 폼입니다." └ 거짓 → ($type == "exec" ?) ├ 참 → "등록 처리를 실행중" └ 거짓 → "화면이 없습니다."
3가지 이상의 가능성이 있을 때 자연스럽게 만들어지는 모양 — 다만 가능성이 많아질수록 들여쓰기가 깊어져 가독성이 떨어진다.

2 본 코드의 동작
$type 값 실행되는 분기 출력
"form" 첫 if 참 등록 폼입니다.
"exec" 첫 if 거짓 → else 안의 if 참 등록 처리를 실행중
그 외 (예: "abc") 모두 거짓 → 마지막 else 화면이 없습니다.

반응형
3 같은 의도를 더 깔끔하게 — elseif

본 코드처럼 "한 변수의 값에 따른 분기"elseif로 평탄하게 쓰는 게 가독성이 훨씬 낫다. 들여쓰기가 깊어지지 않는다.

중첩 if-else (본 코드)
if($type == "form"){
 ...
}else{
 if($type == "exec"){
  ...
 }else{
  ...
 }
}
elseif (개선)
if($type == "form"){
 ...
}elseif($type == "exec"){
 ...
}else{
 ...
}
두 코드는 완전히 같은 결과를 만든다. 컴퓨터 입장에선 동일하지만, 사람이 읽기엔 후자가 훨씬 명확하다.

4 더 좋은 대안 — switch

"하나의 변수를 여러 값과 비교"하는 패턴이라면 switch가 더 명확하다. 같은 변수를 반복해서 적지 않아도 된다.

switch($type){ case "form": print "등록 폼입니다."; break; case "exec": print "등록 처리를 실행중"; break; default: print "화면이 없습니다."; }
※ if-elseif vs switch — 언제 무엇을?
  • 같은 변수를 여러 값과 비교 → switch가 깔끔
  • 다양한 조건/연산이 섞임 ($a > 10, $b == "x" 등) → if-elseif
  • 분기 2~3개 이하 → if-else로 충분
  • 분기 4개 이상이고 동일 변수 → switch나 match (PHP 8+)

5 중첩이 깊어지면 생기는 문제
if(...){ if(...){ if(...){ if(...){ // 들여쓰기 4단계 — 가독성 ↓ } } } }

이런 코드는 "arrow code" 또는 "죽음의 피라미드"라고 불린다. 디버깅이 어렵고, 깊은 곳에 버그가 숨기 쉽다. 해결법은 조기 반환(early return)이다.

// 깊은 중첩 (나쁨) function process($user){ if($user){ if($user->active){ if($user->hasPermission){ return doWork(); } } } return null; } // 조기 반환 (좋음) function process($user){ if(!$user) return null; if(!$user->active) return null; if(!$user->hasPermission) return null; return doWork(); }

6 자주 하는 실수
실수 증상 해결
중괄호 누락 → dangling else else가 엉뚱한 if에 붙음 모든 if/else에 중괄호 명시
분기마다 변수명 반복 ($type × N번) 가독성 ↓, 오타 위험 ↑ switch나 match로 치환 검토
마지막 else 누락 예상 못한 입력값에 대해 출력 0 "기본 처리"용 else 명시
들여쓰기 혼란 (탭/스페이스 섞임) 중첩 깊이 헷갈림 일관된 들여쓰기 사용
비교에 = 1개 대입이 일어나 항상 참 == 또는 ===

7 PHP 8+ 의 match 표현식

PHP 8 부터는 match가 추가됐다. switch보다 짧고, break 없음, 엄격 비교(===), 값을 반환하는 장점이 있다.

// PHP 8+ $message = match($type){ "form" => "등록 폼입니다.", "exec" => "등록 처리를 실행중", default => "화면이 없습니다.", }; print $message;
match===로 비교하므로 0"0"을 다르게 본다. 그리고 매치되는 케이스가 없고 default도 없으면 예외 발생.

핵심 한 줄 요약

중첩 if-elseelse 안에 또 if를 넣어 다중 분기 구현
elseif같은 효과를 평탄하게 — 가독성 좋음
switch한 변수 다중 비교에 가장 적합
match (PHP 8+)값 반환 + 엄격 비교 + break 불필요
기본 else예상 외 값 처리 — 항상 마련 권장
중첩 깊이3단계 넘으면 조기 반환·함수 분리 검토
중괄호dangling else 방지 — 항상 사용
반응형

댓글