1. [기본] while 문: 조건이 참인 동안 무한 질주
while 문은 주어진 조건식이 참(true)인 동안 코드 블록을 반복해서 실행합니다. 시니어 개발자들은 이를 "반복 가능한 if 문"이라고 부르기도 합니다.
기본 문법
while (조건식) {
    // 조건식이 참일 때 실행할 코드
}
실행 순서와 특징
1. 조건 검사: 루프 진입 전, 가장 먼저 조건식이 참인지 확인합니다.
2. 코드 실행: 조건이 참이면 중괄호 { } 안의 코드를 실행합니다.
3. 반복: 코드 실행이 끝나면 다시 1번(조건 검사) 단계로 돌아갑니다.
💡 Senior's Tip: 만약 첫 번째 조건 검사에서 결과가 false라면, 내부 코드는 단 한 번도 실행되지 않고 즉시 스킵됩니다. 실행 여부가 전적으로 사전 조건에 달려 있다는 점이 while 문의 핵심입니다.
대체 구문 (Colon Syntax)
MVC 패턴을 적용하거나 PHP를 템플릿 엔진처럼 사용할 때, HTML 태그와 섞어 쓰기 좋은 구문입니다. 가독성을 높여 유지보수성을 확보하는 시니어의 습관 중 하나입니다.
<?php while ($i <= 5): ?>
    <li>리스트 번호: <?php echo $i++; ?></li>
<?php endwhile; ?>
--------------------------------------------------------------------------------
2. [심화] do-while 문: 일단 한 번은 실행하고 본다
do-while 문은 조건을 검사하는 시점이 코드 블록 실행 이후라는 점이 일반 while 문과 다릅니다. 즉, 조건의 참/거짓 여부와 상관없이 최소한 한 번은 반드시 실행된다는 특징이 있습니다.
비교 예제: 조건이 처음부터 거짓(false)일 때
$i = 10;

// while 문: 선(先) 검사. 조건이 false이므로 루프를 건너뜀
while ($i < 10) {
    echo "while 실행"; // 결과: (아무것도 출력되지 않음)
    $i++;
}

// do-while 문: 후(後) 검사. 일단 실행하고 조건을 확인
do {
    echo "do-while 실행"; // 결과: "do-while 실행" (1회 출력됨)
    $i++;
} while ($i < 10);
--------------------------------------------------------------------------------
3. 한눈에 비교하기: while vs do-while

비교 항목while 문do-while 문

검사 시점
루프 진입 전 (선 검사)
루프 실행 후 (후 검사)
최소 실행 횟수
0회 (조건이 거짓이면 미실행)
1회 (무조건 최소 한 번 실행)
주요 용도
조건 충족 시에만 동작해야 할 때
입력값 검증 등 최소 1회 로직이 필요할 때
--------------------------------------------------------------------------------
4. 실전 활용 예제: 데이터와 파일을 다루는 법
DB 데이터 처리
데이터베이스에서 게시판 목록을 가져올 때, 전체 레코드 수를 미리 알 수 없습니다. 이때 mysqli::fetch_assoc()의 리턴값을 조건으로 활용합니다. 이 함수는 더 이상 가져올 데이터가 없으면 null 또는 false를 반환하며 루프를 자연스럽게 종료시킵니다.
// 연결 및 안전한 코딩을 위한 체크
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) die("연결 실패: " . $conn->connect_error);

$result = $conn->query("SELECT id, title FROM board");

if ($result && $result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"] . " - 제목: " . $row["title"] . "<br>";
    }
} else {
    echo "데이터가 없습니다.";
}
파일 읽기
파일 포인터가 파일의 끝(EOF, End Of File)에 도달했는지 확인하는 feof() 함수와 조합하여 사용합니다.
$fp = fopen("list.txt", 'r');

if ($fp) {
    // 1. fgets(): 한 줄씩 읽기
    while (!feof($fp)) { // 파일 끝이 아닐 때까지 반복
        echo fgets($fp) . "<br>";
    }

    rewind($fp); // 포인터를 다시 처음으로

    // 2. fgetc(): 한 글자씩 읽기 (줄바꿈 처리 포함)
    while (!feof($fp)) {
        $char = fgetc($fp);
        if ($char == "\n") $char = "<br>";
        if (!feof($fp)) echo $char;
    }

    fclose($fp); // 자원 해제는 시니어의 기본 덕목입니다.
}
--------------------------------------------------------------------------------
5. 반복문의 흐름 제어: break와 continue
루프 내부에서 흐름을 제어할 때는 break continue를 사용합니다.
 break: 반복문을 완전히 이탈합니다. 다중 루프(부모-자식 관계)에서는 break 2;와 같이 숫자를 지정하여 상위 루프까지 한 번에 빠져나갈 수 있습니다.
 continue: 현재 반복의 남은 코드를 무시하고 즉시 다음 반복(조건 검사)으로 넘어갑니다. continue 2;는 상위 루프의 다음 단계로 이동합니다.
⚠️ Legacy Warning (PHP 5.4+): 과거에는 break $var;처럼 변수를 사용할 수 있었으나, PHP 5.4부터는 상숫값만 허용됩니다. break 0; 또한 지원되지 않으므로 주의하십시오.
--------------------------------------------------------------------------------
6. 성능 최적화 및 주의사항 (Best Practices)
성능 데이터 해석
특정 환경(PHP 5.2.12 / Apache 2.2.14)에서의 실험 결과, 순수 반복 속도는 while < for < foreach 순으로 while이 가장 빠른 것으로 나타났습니다. 하지만 현대의 PHP 7.x, 8.x 환경에서는 엔진 최적화로 인해 이 차이가 미미하므로, 성능보다는 코드의 가독성과 의도에 맞는 선택이 더 중요합니다.
무한 루프 예방
🚨 주의: 조건식에 사용되는 변수를 루프 내부에서 업데이트(예: $i++)하지 않으면 무한 루프에 빠져 서버 자원을 고갈시킵니다. 종료 조건이 반드시 발생하도록 설계하세요.
시니어가 전하는 클린 코드 팁
 루프 내 함수 호출 지양: while ($i < count($arr))처럼 작성하면 매 반복마다 count()가 호출됩니다. $total = count($arr);로 미리 계산하여 변수에 담아두세요.
 의미 있는 네이밍: $i보다는 $retryCount, $lineNum 등 변수의 역할을 명확히 하세요.
 표준 태그 준수: 호환성을 위해 단축 태그(<?) 대신 표준 PHP 태그(<?php ... ?>)만 사용하십시오.
--------------------------------------------------------------------------------
7. 결론: 상황에 맞는 도구 선택하기
반복 횟수가 불분명하거나 부울(Boolean) 조건에 의존해야 할 때는 while 문이 정답입니다. 만약 조건과 상관없이 최소한 한 번의 로직 실행이 담보되어야 한다면 do-while 문을 선택하십시오.

+ Recent posts