Skip to main content
Summary

프로그램은 위에서 아래로만 흐르지 않는다

앞 장에서는 변수, 자료형, 연산자를 배웠다. 이제 그 값을 이용해 "어떤 코드를 실행할지" 결정해야 한다. 예를 들어 로그인한 사용자에게는 "마이페이지"를 보여주고, 로그인하지 않은 사용자에게는 "로그인해 주세요"라고 보여줄 수 있어야 한다.

또 같은 작업을 여러 번 반복해야 할 때도 있다. 게시글 10개를 화면에 출력하거나, 장바구니 상품 목록을 하나씩 보여주는 일이 그렇다. 이런 흐름을 다루는 문법이 조건문과 반복문이다.

조건문은 상황에 따라 코드를 갈라서 실행한다. 반복문은 같은 코드를 필요한 만큼 되풀이한다. 웹 페이지가 사용자 입력과 데이터에 반응하려면 이 두 가지를 자유롭게 다룰 수 있어야 한다.

조건문과 반복문으로 흐름 제어하기AI 생성 이미지

if, elseif, else로 조건 나누기

가장 기본적인 조건문은 if다. if 뒤의 조건이 참으로 판단되면 중괄호 안의 코드가 실행된다.

<?php
$age = 20;

if ($age >= 19) {
    echo '성인입니다.';
}

조건이 맞지 않을 때 실행할 코드는 else에 작성한다.

<?php
$age = 16;

if ($age >= 19) {
    echo '성인입니다.';
} else {
    echo '미성년자입니다.';
}

조건이 여러 갈래라면 elseif를 사용한다.

<?php
$score = 82;

if ($score >= 90) {
    echo 'A 등급';
} elseif ($score >= 80) {
    echo 'B 등급';
} elseif ($score >= 70) {
    echo 'C 등급';
} else {
    echo '재평가가 필요합니다.';
}

위 코드는 위에서부터 조건을 확인한다. $score가 82이면 첫 번째 조건 $score >= 90은 거짓이고, 두 번째 조건 $score >= 80은 참이다. 그래서 B 등급이 출력되고 나머지 조건은 검사하지 않는다.

조건문의 순서는 중요하다. 넓은 조건을 먼저 쓰면 좁은 조건이 실행될 기회를 잃을 수 있다.

<?php
$score = 95;

if ($score >= 70) {
    echo '통과';
} elseif ($score >= 90) {
    echo '우수'; // 실행되지 않음
}

95는 이미 $score >= 70 조건에 걸리므로 우수는 출력되지 않는다. 이 경우에는 더 구체적인 조건을 먼저 써야 한다.

<?php
if ($score >= 90) {
    echo '우수';
} elseif ($score >= 70) {
    echo '통과';
}

로그인 상태에 따라 다른 화면 보여주기

웹 개발에서 조건문은 매우 자주 사용된다. 다음은 로그인 상태에 따라 다른 HTML을 출력하는 예다.

<?php
$isLoggedIn = true;
$userName = '지민';
?>

<?php if ($isLoggedIn): ?>
    <p><?= htmlspecialchars($userName, ENT_QUOTES, 'UTF-8') ?>님, 환영합니다.</p>
    <a href="/mypage.php">마이페이지</a>
<?php else: ?>
    <p>로그인이 필요합니다.</p>
    <a href="/login.php">로그인</a>
<?php endif; ?>

PHP 코드를 HTML 사이에 넣을 때는 위처럼 if:, else:, endif; 형태를 사용할 수 있다. 중괄호 방식과 기능은 같지만, HTML이 섞인 화면 코드에서는 이 방식이 더 읽기 쉬울 때가 많다.

사용자 이름처럼 외부에서 들어올 수 있는 값은 출력할 때 htmlspecialchars()로 감싸는 습관을 유지하자. 조건문은 "무엇을 보여줄지"를 정하고, 안전한 출력은 "어떻게 보여줄지"를 지킨다.

switch와 match 표현식

조건이 하나의 값에 따라 여러 갈래로 나뉠 때는 switch를 사용할 수 있다.

<?php
$role = 'admin';

switch ($role) {
    case 'admin':
        echo '관리자 페이지로 이동합니다.';
        break;

    case 'member':
        echo '회원 페이지로 이동합니다.';
        break;

    case 'guest':
        echo '게스트 페이지로 이동합니다.';
        break;

    default:
        echo '알 수 없는 권한입니다.';
        break;
}

switch에서 중요한 것은 break다. break는 현재 흐름을 멈추고 switch 밖으로 나가라는 뜻이다. break를 빠뜨리면 다음 case 코드까지 이어서 실행될 수 있다. 이를 fall-through라고 부르며, 의도하지 않았다면 버그가 된다.

PHP 8부터는 match 표현식을 사용할 수 있다. match는 값을 비교한 뒤 결과를 반환한다.

<?php
$role = 'admin';

$message = match ($role) {
    'admin' => '관리자 페이지로 이동합니다.',
    'member' => '회원 페이지로 이동합니다.',
    'guest' => '게스트 페이지로 이동합니다.',
    default => '알 수 없는 권한입니다.',
};

echo $message;

switch와 match는 비슷해 보이지만 차이가 있다.

  • switch는 여러 줄의 실행 흐름을 나눌 때 익숙하다.

  • match는 조건에 따라 하나의 값을 고를 때 간결하다.

  • match는 비교가 더 엄격하다. 예를 들어 숫자 1과 문자열 '1'을 같은 값으로 보지 않는다.

  • match에서 일치하는 항목이 없고 default도 없으면 오류가 발생한다. 모든 경우를 확실히 나열할 수 없다면 default를 두는 편이 안전하다.

현대적인 PHP에서는 "조건에 따라 값을 선택하는 코드"라면 match가 읽기 쉽다. 반대로 여러 작업을 순서대로 처리해야 한다면 if나 switch가 더 자연스러울 수 있다.

for 반복문: 횟수가 정해진 반복

반복문은 같은 코드를 여러 번 실행할 때 사용한다. for는 반복 횟수가 분명할 때 적합하다.

<?php
for ($i = 1; $i <= 5; $i++) {
    echo $i . '번째 실행
'
; }

for 괄호 안에는 세 부분이 들어간다.

for (초기값; 반복 조건; 반복 후 실행) {
    // 반복할 코드
}

위 예제에서는 $i가 1에서 시작한다. $i <= 5 조건이 참인 동안 반복하고, 한 번 반복할 때마다 $i++로 1씩 증가한다.

HTML 목록도 만들 수 있다.

<ul>
<?php for ($i = 1; $i <= 3; $i++): ?>
    <li>공지사항 <?= $i ?></li>
<?php endfor; ?>
</ul>

결과적으로 li 태그 3개가 만들어진다. 실제 게시판에서는 숫자 대신 데이터베이스에서 가져온 게시글 목록을 출력하게 된다.

while과 do while: 조건이 중심인 반복

while은 조건이 참인 동안 반복한다. 반복 횟수보다 "언제까지 반복할지"가 중요할 때 사용한다.

<?php
$count = 1;

while ($count <= 3) {
    echo $count . '회 실행
'
; $count++; }

while에서는 반복 조건을 바꾸는 코드가 반드시 필요하다. 위 예제의 $count++가 없다면 $count는 계속 1이고, 조건은 영원히 참이 된다. 이런 상태를 무한 반복이라고 한다.

do while은 먼저 한 번 실행한 뒤 조건을 확인한다.

<?php
$count = 5;

do {
    echo '현재 값: ' . $count . '
'
; $count++; } while ($count <= 3);

위 코드는 조건 $count <= 3이 처음부터 거짓이다. 그래도 do 블록이 먼저 실행되므로 한 번은 출력된다. 즉, while은 조건을 먼저 확인하고, do while은 실행을 먼저 한다.

정리하면 다음과 같다.

  • for: 반복 횟수가 분명할 때

  • while: 조건이 참인 동안 반복할 때

  • do while: 최소 한 번은 실행해야 할 때

foreach로 배열 순회하기

웹 페이지에서는 여러 데이터를 한 번에 다루는 일이 많다. 게시글 목록, 상품 목록, 댓글 목록이 모두 그런 예다. 이런 여러 값을 담는 자료형을 배열이라고 한다. 배열은 다음에 더 자세히 배우지만, 여기서는 반복문과 함께 기본 사용법만 살펴보자.

<?php
$fruits = ['사과', '바나나', '딸기'];

foreach ($fruits as $fruit) {
    echo $fruit . '
'
; }

foreach는 배열의 값을 하나씩 꺼내 반복한다. 첫 번째 반복에서는 $fruit에 '사과'가 들어가고, 두 번째 반복에서는 '바나나', 세 번째 반복에서는 '딸기'가 들어간다.

HTML 목록을 만들 때 특히 자주 사용한다.

<?php
$posts = [
    'PHP 시작하기',
    '조건문 이해하기',
    '반복문 연습하기',
];
?>

<ul>
<?php foreach ($posts as $post): ?>
    <li><?= htmlspecialchars($post, ENT_QUOTES, 'UTF-8') ?></li>
<?php endforeach; ?>
</ul>

배열의 번호나 이름이 필요하면 key => value 형태를 쓴다.

<?php
$menus = [
    'home' => '홈',
    'board' => '게시판',
    'login' => '로그인',
];
?>

<nav>
<?php foreach ($menus as $url => $label): ?>
    <a href="/<?= htmlspecialchars($url, ENT_QUOTES, 'UTF-8') ?>.php">
        <?= htmlspecialchars($label, ENT_QUOTES, 'UTF-8') ?>
    </a>
<?php endforeach; ?>
</nav>

여기서 $url에는 home, board, login이 차례로 들어간다. $label에는 홈, 게시판, 로그인이 들어간다.

break와 continue로 반복 흐름 제어하기

반복문은 조건이 끝날 때까지 계속 실행된다. 하지만 중간에 멈추거나, 특정 회차만 건너뛰고 싶을 때가 있다. 이때 break와 continue를 사용한다.

break는 반복문을 완전히 끝낸다.

<?php
$numbers = [1, 3, 5, 8, 9];

foreach ($numbers as $number) {
    if ($number % 2 === 0) {
        echo '첫 번째 짝수: ' . $number;
        break;
    }
}

위 코드는 짝수를 찾으면 출력하고 반복을 끝낸다. 8을 찾은 뒤에는 9를 검사하지 않는다.

continue는 현재 반복만 건너뛰고 다음 반복으로 넘어간다.

<?php
$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as $number) {
    if ($number % 2 === 0) {
        continue;
    }

    echo $number . '
'
; }

짝수일 때는 continue가 실행되므로 아래의 echo까지 가지 않는다. 결과적으로 홀수인 1, 3, 5만 출력된다.

break는 "이제 그만", continue는 "이번만 건너뛰기"라고 기억하면 쉽다.

작은 예제: 권한별 메뉴와 게시글 목록 출력하기

지금까지 배운 조건문과 반복문을 합쳐 보자.

<?php
$isLoggedIn = true;
$role = 'member';

$posts = [
    'PHP 설치하기',
    '변수와 자료형',
    '조건문과 반복문',
];

$menuLabel = match ($role) {
    'admin' => '관리자 메뉴',
    'member' => '회원 메뉴',
    default => '방문자 메뉴',
};
?>

<header>
    <?php if ($isLoggedIn): ?>
        <p><?= htmlspecialchars($menuLabel, ENT_QUOTES, 'UTF-8') ?></p>
    <?php else: ?>
        <p>로그인 후 더 많은 기능을 사용할 수 있습니다.</p>
    <?php endif; ?>
</header>

<section>
    <h2>최근 글</h2>

    <?php if (count($posts) > 0): ?>
        <ul>
        <?php foreach ($posts as $post): ?>
            <li><?= htmlspecialchars($post, ENT_QUOTES, 'UTF-8') ?></li>
        <?php endforeach; ?>
        </ul>
    <?php else: ?>
        <p>아직 등록된 글이 없습니다.</p>
    <?php endif; ?>
</section>

이 예제에는 세 가지 흐름이 들어 있다.

첫째, 로그인 여부에 따라 다른 안내 문구를 보여준다. 둘째, 역할에 따라 메뉴 이름을 선택한다. 셋째, 게시글 배열을 반복하며 HTML 목록을 만든다.

실제 웹 애플리케이션도 이와 크게 다르지 않다. 데이터가 어디에서 오느냐가 달라질 뿐이다. 지금은 배열에 직접 값을 넣었지만, 나중에는 데이터베이스에서 가져온 글 목록을 foreach로 출력하게 된다.

실습 과제

  1. $temperature 변수에 온도를 넣고, 다음 조건에 따라 문장을 출력해 보자.

    • 30 이상: 덥습니다.

    • 10 이상 30 미만: 활동하기 좋은 날씨입니다.

    • 10 미만: 춥습니다.

  2. $grade 변수에 A, B, C, D 중 하나를 넣고 match로 설명 문장을 만들어 보자.

    • A: 매우 우수

    • B: 우수

    • C: 보통

    • 그 외: 재학습 필요

  3. for 반복문으로 1부터 10까지 출력하되, 짝수만 출력해 보자.

  4. 다음 배열을 foreach로 순회하며 ul, li 목록을 만들어 보자.

<?php
$books = ['PHP 교과서', 'SQL 입문', '웹 보안 기초'];
  1. 1부터 20까지 반복하면서 3의 배수는 건너뛰고, 17을 만나면 반복을 멈추는 코드를 작성해 보자.

자주 발생하는 오류 점검

조건식에 대입 연산자를 쓰는 경우

<?php
if ($isLoggedIn = true) {
    echo '로그인됨';
}

=는 값을 넣는 대입 연산자다. 위 코드는 $isLoggedIn에 true를 넣은 뒤 그 결과를 조건으로 판단하므로, 의도와 다르게 동작할 수 있다. 비교할 때는 ===를 사용하자.

<?php
if ($isLoggedIn === true) {
    echo '로그인됨';
}

불리언 변수라면 더 간단히 쓸 수도 있다.

<?php
if ($isLoggedIn) {
    echo '로그인됨';
}

switch에서 break를 빠뜨리는 경우

switch의 case 끝에 break가 없으면 다음 case까지 실행될 수 있다. 의도한 동작이 아니라면 각 case마다 break를 넣자. 값을 고르는 목적이라면 match를 사용하는 것도 좋은 선택이다.

반복 조건이 끝나지 않는 경우

<?php
$i = 1;

while ($i <= 10) {
    echo $i;
}

$i가 증가하지 않으므로 조건이 계속 참이다. 반복문 안에서 조건을 바꿔야 한다.

<?php
$i = 1;

while ($i <= 10) {
    echo $i;
    $i++;
}

출력할 값을 escape하지 않는 경우

배열 값이 직접 작성한 문자열이라도, 웹 화면에 출력할 때는 htmlspecialchars()를 사용하는 습관을 들이자. 나중에 사용자 입력이나 데이터베이스 값으로 바뀌어도 안전한 코드 구조를 유지할 수 있다.

조건문과 반복문은 PHP 코드의 길을 만드는 도구다. 조건문으로 상황을 나누고, 반복문으로 목록을 처리하면 웹 페이지는 고정된 문서가 아니라 사용자와 데이터에 반응하는 프로그램이 된다.

책 목록

PHP 교과서: 기초 문법부터 게시판 프로젝트와 배포까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기