PHP If...Else...Elseif
PHP 조건문: if
, else
, elseif
완벽 가이드
PHP 조건문이란 무엇인가요?
PHP에서 조건문은 특정 조건에 따라 코드의 실행 흐름을 제어하는 데 사용됩니다. 가장 기본적인 조건문인 if
, else
, elseif
를
사용하여 다양한 논리적 결정을 구현할 수 있습니다. 조건문은 사용자 입력 검증, 데이터 처리, 프로그램 흐름 제어 등 웹 애플리케이션 개발에서 필수적인 요소입니다. 이 가이드에서는 PHP의
if
, else
, elseif
조건문의 기본 사용법부터 고급 활용법까지 상세히 설명하고, 실용적인 예제들을 통해 이해를 도울 것입니다.
1. if
조건문
if
조건문은 주어진 조건이 참(true
)일 때 특정 코드를 실행합니다.
기본 문법
<?php
if (조건) {
// 조건이 참일 때 실행될 코드
}
?>
예제: 나이에 따른 메시지 출력
<?php
$age = 20;
if ($age >= 18) {
echo "성인입니다.";
}
?>
출력:
성인입니다.
2. if...else
조건문
if...else
조건문은 조건이 참일 때와 거짓일 때 각각 다른 코드를 실행할 수 있게 해줍니다.
기본 문법
<?php
if (조건) {
// 조건이 참일 때 실행될 코드
} else {
// 조건이 거짓일 때 실행될 코드
}
?>
예제: 나이에 따른 성인/미성년자 메시지 출력
<?php
$age = 16;
if ($age >= 18) {
echo "성인입니다.";
} else {
echo "미성년자입니다.";
}
?>
출력:
미성년자입니다.
3. if...elseif...else
조건문
if...elseif...else
조건문은 여러 개의 조건을 순차적으로 검사하여, 첫 번째로 참인 조건에 해당하는 코드를 실행합니다.
기본 문법
<?php
if (조건1) {
// 조건1이 참일 때 실행될 코드
} elseif (조건2) {
// 조건2가 참일 때 실행될 코드
} else {
// 모든 조건이 거짓일 때 실행될 코드
}
?>
예제: 학점에 따른 성적 등급 출력
<?php
$score = 85;
if ($score >= 90) {
echo "A 등급입니다.";
} elseif ($score >= 80) {
echo "B 등급입니다.";
} elseif ($score >= 70) {
echo "C 등급입니다.";
} else {
echo "D 등급입니다.";
}
?>
출력:
B 등급입니다.
4. 중첩된 조건문
조건문 내부에 또 다른 조건문을 포함시켜 복잡한 논리를 구현할 수 있습니다.
예제: 로그인 상태와 사용자 역할에 따른 접근 제어
<?php
$is_logged_in = true;
$user_role = "admin"; // "admin", "editor", "subscriber"
if ($is_logged_in) {
echo "로그인 상태입니다.<br>";
if ($user_role === "admin") {
echo "관리자 대시보드에 접근합니다.";
} elseif ($user_role === "editor") {
echo "편집자 대시보드에 접근합니다.";
} else {
echo "구독자 대시보드에 접근합니다.";
}
} else {
echo "로그인이 필요합니다.";
}
?>
출력:
로그인 상태입니다.
관리자 대시보드에 접근합니다.
5. 다중 조건 검사
if
조건문 내에서 논리 연산자(&&
, ||
, and
, or
)를 사용하여 여러
조건을 동시에 검사할 수 있습니다.
논리 연산자 설명
&&
또는and
: 모든 조건이 참일 때 전체가 참||
또는or
: 하나 이상의 조건이 참일 때 전체가 참!
: 조건의 논리값을 반전
예제: 사용자 나이와 회원 등급에 따른 혜택 제공
<?php
$age = 25;
$membership = "gold"; // "silver", "gold", "platinum"
if ($age >= 18 && ($membership === "gold" || $membership === "platinum")) {
echo "무료 배송 혜택을 받을 수 있습니다.";
} else {
echo "무료 배송 혜택을 받을 수 없습니다.";
}
?>
출력:
무료 배송 혜택을 받을 수 있습니다.
6. 삼항 연산자
삼항 연산자는 간단한 조건문을 한 줄로 작성할 수 있는 연산자입니다. if...else
문을 간결하게 표현할 때 유용합니다.
기본 문법
<?php
(조건) ? 참일 때의 값 : 거짓일 때의 값;
?>
예제: 나이에 따른 성인/미성년자 메시지 출력
<?php
$age = 17;
$message = ($age >= 18) ? "성인입니다." : "미성년자입니다.";
echo $message;
?>
출력:
미성년자입니다.
7. 널 병합 연산자와 조건문
PHP 7.0부터 도입된 널 병합 연산자(??
)는 변수가 설정되어 있고 null
이 아닌 경우 그 값을 반환하며, 그렇지 않으면 대체 값을 반환합니다. 조건문과 함께
사용하여 보다 간결한 코드를 작성할 수 있습니다.
예제: 사용자 이름 출력
<?php
// GET 파라미터로부터 'name'을 가져옴
$name = $_GET['name'] ?? '게스트';
echo "안녕하세요, $name 님!";
?>
사용 예시:
- URL:
http://example.com/?name=홍길동
출력:
안녕하세요, 홍길동 님!
- URL:
http://example.com/
출력:
안녕하세요, 게스트 님!
8. switch
문과 if...elseif...else
의 비교
switch
문은 다중 조건을 처리할 때 if...elseif...else
문보다 가독성이 높을 수 있습니다. 하지만 switch
문은 비교
대상이 동일할 때 유용하며, 범위 조건이나 복잡한 논리를 처리하기에는 적합하지 않습니다.
switch
문 기본 문법
<?php
switch (표현식) {
case 값1:
// 값1일 때 실행할 코드
break;
case 값2:
// 값2일 때 실행할 코드
break;
default:
// 모든 case가 일치하지 않을 때 실행할 코드
}
?>
예제: 요일에 따른 메시지 출력
<?php
$day = "수요일";
switch ($day) {
case "월요일":
echo "오늘은 월요일입니다. 새로운 한 주가 시작됩니다.";
break;
case "화요일":
echo "오늘은 화요일입니다. 꾸준히 화이팅!";
break;
case "수요일":
echo "오늘은 수요일입니다. 주말이 다가오고 있습니다.";
break;
case "목요일":
echo "오늘은 목요일입니다. 곧 금요일입니다!";
break;
case "금요일":
echo "오늘은 금요일입니다. 즐거운 주말 보내세요!";
break;
default:
echo "오늘은 주말입니다. 푹 쉬세요!";
}
?>
출력:
오늘은 수요일입니다. 주말이 다가오고 있습니다.
9. 조건문에서의 논리 오류 방지
조건문을 작성할 때는 논리적 오류를 방지하기 위해 다음 사항에 주의해야 합니다.
9.1 비교 연산자 사용 시 타입 주의
==
연산자는 타입을 강제로 변환하여 비교===
연산자는 타입과 값을 모두 비교
예제:
<?php
$a = 0;
$b = "0";
var_dump($a == $b); // 출력: bool(true)
var_dump($a === $b); // 출력: bool(false)
?>
9.2 조건문의 우선순위 이해
연산자 우선순위를 정확히 이해하고, 필요한 경우 괄호를 사용하여 의도한 대로 표현식을 작성합니다.
예제:
<?php
$a = false || true; // ($a = (false || true)) -> $a = true
$b = false or true; // (($b = false) or true) -> $b = false
var_dump($a); // 출력: bool(true)
var_dump($b); // 출력: bool(false)
?>
10. 실용적인 조건문 예제
10.1 사용자 권한에 따른 접근 제어
<?php
$user_role = "editor"; // "admin", "editor", "subscriber"
if ($user_role === "admin") {
echo "관리자 페이지에 접근할 수 있습니다.";
} elseif ($user_role === "editor") {
echo "편집자 페이지에 접근할 수 있습니다.";
} else {
echo "구독자 페이지에 접근할 수 있습니다.";
}
?>
출력:
편집자 페이지에 접근할 수 있습니다.
10.2 피보나치 수열 생성기
사용자가 입력한 숫자까지의 피보나치 수열을 생성하는 예제입니다.
HTML 폼: fibonacci.html
<!DOCTYPE html>
<html>
<head>
<title>피보나치 수열 생성기</title>
</head>
<body>
<h2>피보나치 수열 생성기</h2>
<form method="post" action="fibonacci.php">
항의 개수: <input type="number" name="count" min="1" required><br><br>
<input type="submit" value="생성">
</form>
</body>
</html>
PHP 처리 스크립트: fibonacci.php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$count = intval($_POST['count']);
if ($count < 1) {
echo "항의 개수는 1 이상이어야 합니다.";
exit;
}
$fibonacci = [];
for ($i = 0; $i < $count; $i++) {
if ($i === 0) {
$fibonacci[] = 0;
} elseif ($i === 1) {
$fibonacci[] = 1;
} else {
$fibonacci[] = $fibonacci[$i - 1] + $fibonacci[$i - 2];
}
}
echo "피보나치 수열: " . implode(", ", $fibonacci);
}
?>
사용 예시:
-
입력:
5
-
출력:
피보나치 수열: 0, 1, 1, 2, 3
10.3 할인율 적용 예제
구매 금액에 따라 할인율을 적용하여 최종 결제 금액을 계산하는 예제입니다.
<?php
$purchase_amount = 250000; // 구매 금액 (원)
if ($purchase_amount >= 500000) {
$discount_rate = 0.20; // 20% 할인
} elseif ($purchase_amount >= 300000) {
$discount_rate = 0.15; // 15% 할인
} elseif ($purchase_amount >= 100000) {
$discount_rate = 0.10; // 10% 할인
} else {
$discount_rate = 0.00; // 할인 없음
}
$discount = $purchase_amount * $discount_rate;
$final_amount = $purchase_amount - $discount;
echo "구매 금액: ₩" . number_format($purchase_amount) . "<br>";
echo "할인율: " . ($discount_rate * 100) . "%<br>";
echo "할인 금액: ₩" . number_format($discount) . "<br>";
echo "최종 결제 금액: ₩" . number_format($final_amount);
?>
출력:
구매 금액: ₩250,000
할인율: 10%
할인 금액: ₩25,000
최종 결제 금액: ₩225,000
11. 조건문에서의 함수 사용
조건문 내에서 함수를 호출하여 복잡한 논리를 단순화할 수 있습니다.
예제: 사용자 입력 검증
<?php
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
$email = "user@example.com";
if (isValidEmail($email)) {
echo "유효한 이메일 주소입니다.";
} else {
echo "유효하지 않은 이메일 주소입니다.";
}
?>
출력:
유효한 이메일 주소입니다.
12. 중첩된 조건문에서의 주의사항
중첩된 조건문은 코드의 가독성을 떨어뜨릴 수 있으므로, 가능한 한 단순하게 유지하고 필요 시 함수를 활용하여 코드를 분리하는 것이 좋습니다.
예제: 중첩된 조건문
<?php
$age = 25;
$gender = "남성";
if ($age >= 18) {
if ($gender === "남성") {
echo "성인 남성입니다.";
} else {
echo "성인 여성입니다.";
}
} else {
if ($gender === "남성") {
echo "미성년자 남성입니다.";
} else {
echo "미성년자 여성입니다.";
}
}
?>
출력:
성인 남성입니다.
개선된 예제: 함수 사용
<?php
function getAgeGenderMessage($age, $gender) {
if ($age >= 18) {
return ($gender === "남성") ? "성인 남성입니다." : "성인 여성입니다.";
} else {
return ($gender === "남성") ? "미성년자 남성입니다." : "미성년자 여성입니다.";
}
}
$age = 25;
$gender = "남성";
echo getAgeGenderMessage($age, $gender);
?>
출력:
성인 남성입니다.
13. 조건문에서의 스위칭과 폴딩(Folding)
복잡한 조건문을 간결하게 작성하기 위해 조건을 그룹화하거나 스위칭을 활용할 수 있습니다.
예제: 다중 조건 그룹화
<?php
$role = "editor";
if ($role === "admin" || $role === "superadmin") {
echo "전체 권한을 가집니다.";
} elseif ($role === "editor" || $role === "contributor") {
echo "편집 권한을 가집니다.";
} else {
echo "기본 사용자입니다.";
}
?>
출력:
편집 권한을 가집니다.
14. 조건문과 배열 활용
조건문과 배열을 결합하여 보다 효율적인 코드를 작성할 수 있습니다.
예제: 다중 조건에 따른 메시지 출력
<?php
$status = "pending"; // "pending", "approved", "rejected"
$status_messages = [
"pending" => "승인 대기 중입니다.",
"approved" => "승인되었습니다.",
"rejected" => "거부되었습니다."
];
if (array_key_exists($status, $status_messages)) {
echo $status_messages[$status];
} else {
echo "알 수 없는 상태입니다.";
}
?>
출력:
승인 대기 중입니다.
15. 조건문에서의 예외 처리
조건문과 예외 처리를 결합하여 오류를 효과적으로 관리할 수 있습니다.
예제: 파일 읽기 시 예외 처리
<?php
$file_path = "data.txt";
if (file_exists($file_path)) {
$content = file_get_contents($file_path);
echo "파일 내용:<br>" . nl2br($content);
} else {
// 예외 던지기
throw new Exception("파일이 존재하지 않습니다: " . $file_path);
}
?>
출력 예시 (파일이 존재하지 않을 때):
Fatal error: Uncaught Exception: 파일이 존재하지 않습니다: data.txt in /path/to/script.php on line 8
16. 조건문에서의 PHP 8.0 새로운 기능 활용
PHP 8.0에서는 조건문을 더욱 유연하게 사용할 수 있는 새로운 기능들이 도입되었습니다. 그 중 대표적인 것은 매치 표현식(match expression
)입니다.
16.1 매치 표현식 (match
)
match
표현식은 switch
문과 유사하지만, 더 엄격한 비교와 반환 값을 지원합니다.
기본 문법
<?php
$result = match ($변수) {
값1 => 반환값1,
값2 => 반환값2,
default => 반환값3,
};
?>
예제: 요일에 따른 메시지 출력
<?php
$day = "수요일";
$message = match ($day) {
"월요일" => "오늘은 월요일입니다. 새로운 한 주가 시작됩니다.",
"화요일" => "오늘은 화요일입니다. 꾸준히 화이팅!",
"수요일" => "오늘은 수요일입니다. 주말이 다가오고 있습니다.",
"목요일" => "오늘은 목요일입니다. 곧 금요일입니다!",
"금요일" => "오늘은 금요일입니다. 즐거운 주말 보내세요!",
default => "오늘은 주말입니다. 푹 쉬세요!",
};
echo $message;
?>
출력:
오늘은 수요일입니다. 주말이 다가오고 있습니다.
장점:
- 엄격한 비교:
match
는==
대신===
를 사용하여 값을 비교합니다. - 반환값: 각 조건에 대해 값을 반환할 수 있어 변수에 직접 할당 가능합니다.
- break 필요 없음: 각 조건이 자동으로 종료됩니다.
예제: 매치 표현식과 변수 할당
<?php
$status = "approved";
$response = match ($status) {
"pending" => ["code" => 100, "message" => "승인 대기 중입니다."],
"approved" => ["code" => 200, "message" => "승인되었습니다."],
"rejected" => ["code" => 400, "message" => "거부되었습니다."],
default => ["code" => 500, "message" => "알 수 없는 상태입니다."],
};
echo "응답 코드: " . $response["code"] . "<br>";
echo "메시지: " . $response["message"];
?>
출력:
응답 코드: 200
메시지: 승인되었습니다.
17. 조건문에서의 함수와 클로저 활용
조건문 내에서 함수를 호출하거나 클로저(익명 함수)를 사용하여 복잡한 논리를 캡슐화할 수 있습니다.
예제: 조건에 따른 콜백 함수 실행
<?php
function executeCallback($condition, $callback) {
if ($condition) {
$callback(true);
} else {
$callback(false);
}
}
executeCallback(true, function($result) {
if ($result) {
echo "조건이 참입니다.";
} else {
echo "조건이 거짓입니다.";
}
});
?>
출력:
조건이 참입니다.
18. 조건문에서의 스코프와 변수 접근
조건문 내부에서 선언된 변수는 조건문 외부에서도 접근이 가능합니다. 하지만 함수나 클래스 내부에서는 스코프 규칙을 따릅니다.
예제: 조건문 내 변수 접근
<?php
if (true) {
$message = "조건이 참일 때 실행됩니다.";
}
echo $message; // 출력: 조건이 참일 때 실행됩니다.
?>
예제: 함수 내부에서 조건문과 변수 스코프
<?php
function checkNumber($num) {
if ($num > 0) {
$result = "양수입니다.";
} else {
$result = "음수이거나 0입니다.";
}
return $result;
}
echo checkNumber(10); // 출력: 양수입니다.
echo "<br>";
echo checkNumber(-5); // 출력: 음수이거나 0입니다.
?>
19. 조건문에서의 에러 처리
조건문을 사용하여 예상치 못한 상황이나 오류를 처리할 수 있습니다.
예제: 사용자 입력 검증 및 에러 메시지 출력
<?php
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if (empty($username) || empty($password)) {
echo "사용자명과 비밀번호는 필수 입력 사항입니다.";
} else {
// 로그인 처리 로직
echo "로그인 시도 중...";
}
?>
출력 예시:
사용자명과 비밀번호는 필수 입력 사항입니다.
20. 조건문과 보안 고려사항
조건문을 사용할 때는 보안 측면에서 주의가 필요합니다. 특히 사용자 입력을 기반으로 조건을 설정할 때는 입력값을 적절히 검증하고 필터링해야 합니다.
예제: SQL 인젝션 방지
<?php
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if (!empty($username) && !empty($password)) {
// 입력값을 이스케이프하여 SQL 인젝션 방지
$username = mysqli_real_escape_string($conn, $username);
$password = mysqli_real_escape_string($conn, $password);
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
// 쿼리 실행 로직
} else {
echo "사용자명과 비밀번호를 입력해주세요.";
}
?>
주의: 실제 애플리케이션에서는 비밀번호를 해싱하여 저장하고, 준비된 문장(prepared statements)을 사용하는 것이 더욱 안전합니다.
21. 조건문과 배열의 결합 활용
배열과 조건문을 결합하여 효율적인 데이터 처리를 구현할 수 있습니다.
예제: 상품 가격에 따른 할인율 적용
<?php
$products = [
["name" => "상품A", "price" => 120000],
["name" => "상품B", "price" => 80000],
["name" => "상품C", "price" => 50000],
];
foreach ($products as $product) {
$price = $product["price"];
if ($price >= 100000) {
$discount = 0.20; // 20% 할인
} elseif ($price >= 50000) {
$discount = 0.10; // 10% 할인
} else {
$discount = 0.00; // 할인 없음
}
$final_price = $price - ($price * $discount);
echo "{$product['name']}의 최종 가격: ₩" . number_format($final_price) . "<br>";
}
?>
출력:
상품A의 최종 가격: ₩96,000
상품B의 최종 가격: ₩72,000
상품C의 최종 가격: ₩50,000
22. PHP 조건문 Best Practices
PHP에서 조건문을 효과적으로 사용하기 위한 몇 가지 권장 사항을 소개합니다.
22.1 가독성 유지
- 들여쓰기: 조건문 내부의 코드는 들여쓰기를 통해 계층 구조를 명확히 합니다.
- 명확한 조건: 조건을 명확하고 간결하게 작성하여 코드를 쉽게 이해할 수 있도록 합니다.
- 주석 추가: 복잡한 논리에는 주석을 추가하여 코드의 의도를 설명합니다.
22.2 불필요한 중첩 피하기
가능한 한 조건문의 중첩을 피하고, 필요 시 함수를 활용하여 코드를 분리합니다.
비권장:
<?php
if ($a > 0) {
if ($b > 0) {
echo "a와 b는 모두 양수입니다.";
}
}
?>
권장:
<?php
if ($a > 0 && $b > 0) {
echo "a와 b는 모두 양수입니다.";
}
?>
22.3 삼항 연산자와 널 병합 연산자 활용
간단한 조건문은 삼항 연산자(?:
)나 널 병합 연산자(??
)를 사용하여 코드의 간결성을 높입니다.
예제:
<?php
// 삼항 연산자
$status = ($age >= 18) ? "성인" : "미성년자";
// 널 병합 연산자
$username = $_GET['user'] ?? '기본 사용자';
?>
22.4 명확한 변수 네이밍
조건문의 가독성을 높이기 위해 변수명을 명확하고 직관적으로 설정합니다.
예제:
<?php
$is_user_logged_in = true;
if ($is_user_logged_in) {
echo "환영합니다!";
} else {
echo "로그인이 필요합니다.";
}
?>
23. PHP 조건문 관련 유용한 함수
조건문을 작성할 때 도움이 되는 PHP의 내장 함수들을 소개합니다.
23.1 empty()
변수가 비어 있는지 확인합니다. 비어 있음의 정의는 ""
, 0
, "0"
,
NULL
, FALSE
, array()
등입니다.
예제:
<?php
$username = "";
if (empty($username)) {
echo "사용자명이 비어 있습니다.";
} else {
echo "사용자명: $username";
}
?>
출력:
사용자명이 비어 있습니다.
23.2 isset()
변수가 설정되어 있고 NULL
이 아닌지 확인합니다.
예제:
<?php
$username = "홍길동";
if (isset($username)) {
echo "사용자명이 설정되어 있습니다.";
} else {
echo "사용자명이 설정되어 있지 않습니다.";
}
?>
출력:
사용자명이 설정되어 있습니다.
23.3 is_null()
변수가 NULL
인지 확인합니다.
예제:
<?php
$var = NULL;
if (is_null($var)) {
echo "변수는 NULL입니다.";
} else {
echo "변수는 NULL이 아닙니다.";
}
?>
출력:
변수는 NULL입니다.
24. PHP 조건문과 함수 결합
조건문과 함수를 결합하여 코드의 재사용성과 모듈화를 향상시킬 수 있습니다.
예제: 사용자 등급에 따른 할인율 적용 함수
<?php
function getDiscountRate($user_level) {
if ($user_level === "gold") {
return 0.20; // 20% 할인
} elseif ($user_level === "silver") {
return 0.10; // 10% 할인
} elseif ($user_level === "bronze") {
return 0.05; // 5% 할인
} else {
return 0.00; // 할인 없음
}
}
$user_level = "silver";
$purchase_amount = 500000;
$discount_rate = getDiscountRate($user_level);
$discount = $purchase_amount * $discount_rate;
$final_amount = $purchase_amount - $discount;
echo "사용자 등급: $user_level<br>";
echo "할인율: " . ($discount_rate * 100) . "%<br>";
echo "할인 금액: ₩" . number_format($discount) . "<br>";
echo "최종 결제 금액: ₩" . number_format($final_amount);
?>
출력:
사용자 등급: silver
할인율: 10%
할인 금액: ₩50,000
최종 결제 금액: ₩450,000
25. PHP 조건문 관련 참고 자료
- PHP 공식 문서: if, else, elseif
- PHP 공식 문서: switch
- PHP 공식 문서: match
- PHP 공식 문서: 삼항 연산자
- PHP 공식 문서: 널 병합 연산자
26. 요약
PHP의 if
, else
, elseif
조건문은 프로그램의 논리 흐름을 제어하는 데 필수적인 도구입니다. 기본적인 조건 검사부터 복잡한 논리
구성까지 다양한 방식으로 활용할 수 있으며, 중첩 조건문, 논리 연산자, 배열과의 결합 등을 통해 강력한 로직을 구현할 수 있습니다. 또한, PHP 8.0의 매치 표현식과 같은 최신 기능을 활용하면 코드의
가독성과 효율성을 더욱 향상시킬 수 있습니다.
조건문을 효과적으로 사용하면 웹 애플리케이션의 다양한 요구사항을 충족시키고, 사용자 경험을 개선할 수 있습니다. 이 가이드를 참고하여 PHP 조건문의 기본 개념을 이해하고, 실용적인 예제를 통해 실제 프로젝트에 적용해보세요. 코드를 명확하고 간결하게 유지하면서, 안정적이고 유지보수하기 쉬운 웹 애플리케이션을 개발할 수 있을 것입니다.