선생님을 위한 프로그래밍 수업

반복문

토픽 선생님을 위한 프로그래밍 수업 > 웹 애플리케이션 만들기 > PHP

반복문

반복문은 프로그래밍에서 가장 중요한 요소 중의 하나다. 인간은 반복적인 작업을 잘하지 못한다. 실수하고, 지루해한다. 컴퓨터는 이런 반복적인 작업을 대행하기 위해서 만들어진 기계다. 반복문은 컴퓨터에게 반복적인 작업을 지시하는 방법이다.

반복문의 문법

반복문의 문법은 몇가지가 있다. 각각의 구문은 서로 대체 가능하기 때문에 상황과 취향에 따라서 선택해서 사용하면 된다.

while

형식은 아래와 같다.

while(조건){
    코드
    코드
}

아래의 예제를 실행해보자.

다음 예제는 무한반복을 발생시킨다. 저장되지 않은 작업이 있다면 모두 정리한 후에 이 명령을 실행하자. 콘솔에서 실행할 경우 Ctrl+C 나 Cmd+. 단축키를 이용해서 무한반복을 중지 할 수 있다. 실행하기 않아도 된다.

/loop/1.php

https://github.com/egoing/phpeverybody/blob/master/loop/1.php

<?php
while(true) {
    echo 'coding everybody';
}
?>

이번에는 true를 false로 바꾼 아래의 예제를 실행해보자. 아무런 결과도 출력하지 않을 것이다.

/loop/2.php

https://github.com/egoing/phpeverybody/blob/master/loop/2.php

<?php
while(false) {
    echo 'coding everybody';
}
?>

while 문은 조건이 참(true)이면 중괄호 구간의 구문을 반복적으로 실행한다. 조건이 false면 반복문이 실행되지 않는다. 여기서 true와 false는 종료조건이 되는데, 반복문에서 종료조건을 잘못 지정하면 무한반복이 되거나, 반복문이 실행되지 않는다.

이번 수업의 초입에서 살펴본 반복문의 문법을 해석해보자. 아래의 반복문은 i의 값을 1씩 순차적으로 증가시킴으로서 반복의 지속 여부를 결정하고 있다. 주석으로 첨부한 설명을 주의깊게 살펴보자.

/loop/3.php

https://github.com/egoing/phpeverybody/blob/master/loop/3.php

<?php
# i의 값으로 0을 할당한다. 
$i = 0;
# 종료조건으로 i의 값이 5보다 작다면 true, 같거나 크다면 false
while($i < 5){
    echo 'coding everybody';
    # 반복문이 실행될 때마다 i의 값을 1씩 증가시킨다. 그 결과 i의 값이 5가 되면 종료조건이 false가 되면서 반복문이 종료된다.
    $i += 1;
}
?>

for

형식은 아래와 같다.

for(초기화; 반복 지속 여부; 반복 실행){
    코드;
}

다음 예제를 보자.

/loop/4.php

https://github.com/egoing/phpeverybody/blob/master/loop/4.php

<html>
<body>
<?php
for($i = 0; $i < 10; $i++){
    echo 'coding everybody'.$i."<br />";
}
?>
</body>
</html>

결과는 아래와 같다.

coding everybody0
coding everybody1
coding everybody2
coding everybody3
coding everybody4
coding everybody5
coding everybody6
coding everybody7
coding everybody8
coding everybody9

위의 예제에서 for 문의 초기화 구문은 $i = 0; 이다. 초기화 구문은 반복문이 실행될 때 1회에 한해서 최초로 실행되는 구문이다. 그렇기 때문에 반복문이 처음 실행될 때는 $i의 값이 0이다. 그 다음에는 반복 실행 조건인 $i < 10; 이 실행된다. 현재 $i의 값은 0이기 때문에 결과는 true이다. 반복 실행 조건이 true이면 중괄호 사이의 구간이 실행된다. 그 결과 화면에는 coding everybody0이 출력된다. 그 후에는 반복실행 구문이 실행된다. $i의 값은 현재 0인데 $i++를 하게 되면 $i의 값이 1이 된다. 그리고 반복 실행 조건인 $i < 10;이 실행되는데 결과는 true이다. 그리고 중괄호 구간이 실행된다. 이것은 반복되다가 $i의 값이 9일 때 중괄호 구간의 실행이 끝나면 $i++에 의해서 $i의 값이 10이 된다. 그 결과 $i<10은 false가 되고 반복문이 종료되게 된다.

반복문이 없다면

coding everybody를 10번 반복해서 출력하고 싶다고 한다면 아래와 같이 코드를 작성하면 된다.

/loop/5.php

https://github.com/egoing/phpeverybody/blob/master/loop/5.php

<html>
<body>
<?php
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
echo 'coding everybody<br />';
?>
</body>
</html>

이 정도의 작업은 복사&붙여넣기를 이용해서도 할만하다. 하지만 좀 더 큰 규모의 데이터를 다뤄야 한다면 반복문의 효용이 부각되기 시작한다. 예를들어서 'coding everybody'를 1천번 출력해야 한다면 위의 예제와 아래 예제의 코드 분량에 큰 차이가 생길 것이다.

/loop/6.php

https://github.com/egoing/phpeverybody/blob/master/loop/6.php

<html>
<body>
<?php
$i = 0;
while($i < 10){
    echo 'coding everybody<br />';
	$i++;
}

?>
</body>
</html>

만약 반복문 없이 coding everybody 뒤에 숫자를 1부터 10까지 붙이고 싶다면 아래와 같이 코드를 작성해야 할 것이다. 행마다 숫자를 바꿔야 하기 때문에 Copy & Paste도 할 수 없다.

/loop/7.php

https://github.com/egoing/phpeverybody/blob/master/loop/7.php

<html>
<body>
<?php
echo 'coding everybody1<br />';
echo 'coding everybody2<br />';
echo 'coding everybody3<br />';
echo 'coding everybody4<br />';
echo 'coding everybody5<br />';
echo 'coding everybody6<br />';
echo 'coding everybody7<br />';
echo 'coding everybody8<br />';
echo 'coding everybody9<br />';
echo 'coding everybody10<br />';
?>
</body>
</html>

반복문에서는 아래와 같이 하면 된다.

/loop/8.php

https://github.com/egoing/phpeverybody/blob/master/loop/8.php

<html>
<body>
<?php
$i = 1;
while($i <= 10){
    echo "coding everybody{$i}<br />";
	$i++;
}

?>
</body>
</html>

coding everybody 뒤에 붙는 숫자를 2의 배수하고 싶다면 어떻게 해야할까? 반복문이 없다면 한줄 한줄 수정해야 할 것이다. 반복문에서는 내용을 조금만 변경하면 된다.

/loop/9.php

https://github.com/egoing/phpeverybody/blob/master/loop/9.php

<html>
<body>
<?php
$i = 1;
while($i <= 10){
    echo "coding everybody".($i*2)."<br />";
	$i++;
}

?>
</body>
</html>

반복문의 제어

break

반복작업을 중간에 중단시키고 싶다면 어떻게 해야할까?  break를 사용하면 된다. 아래의 예제는 위에서 살펴본 예제를 일부 변형한 것이다.

/loop/10.php

https://github.com/egoing/phpeverybody/blob/master/loop/10.php

<html>
<body>
<?php
for($i = 0; $i < 10; $i++){
    if($i === 5){
		break;
	}
	echo "coding everybody{$i}<br />";
}

?>
</body>
</html>

위 코드의 결과는 아래와 같다. 종료조건에 따르면 10행이 출력돼야 하는데 5행만 출력되었다. 2행의 if ($i === 5) 에 의해서 $i의 값이 5일 때 break 문이 실행되면서 반복문이 완전히 종료된 것이다.

coding everybody 0
coding everybody 1
coding everybody 2
coding everybody 3
coding everybody 4

continue

/loop/11.php

https://github.com/egoing/phpeverybody/blob/master/loop/11.php

그럼 실행을 즉시 중단 하면서 반복은 지속돼게 하려면 어떻게 해야 할까? 설명이 어렵다면 예제를 보자. 이전 예제의 break를 continue로 변경했을 뿐이지만 결과는 전혀 다르다.

<html>
<body>
<?php
for($i = 0; $i < 10; $i++){
    if($i === 5){
		continue;
	}
	echo "coding everybody{$i}<br />";
}

?>
</body>
</html>

결과는 아래와 같다. 숫자 5가 보이지 않는다. 왜 그럴까? i의 값이 5가 되었을 때 실행이 중단 됐기 때문에 continue 이후의 구문이 실행되지 않은 것이다. 하지만 반복문은 중단되지 않았기 때문에 나머지 결과가 출력된 것이다.

coding everybody 0
coding everybody 1
coding everybody 2
coding everybody 3
coding everybody 4
coding everybody 6
coding everybody 7
coding everybody 8
coding everybody 9

반복문의 중첩

반복문 안에는 다시 반복문이 나타날 수 있다. 다음 예제를 보자. 다음 예제는 00, 01, 02....99 까지를 화면에 출력한다.

/loop/12.php

https://github.com/egoing/phpeverybody/blob/master/loop/12.php

<html>
<body>
<?php
for($i = 0; $i < 10; $i++){    
	for($j = 0; $j < 10; $j++){	
		echo "coding everybody{$i}{$j}<br />";
	}
}

?>
</body>
</html>

단순히 글자를 반복적으로 출력하기 위해서 반복문을 사용한다고 생각 할 수도 있다. 하지만 반복문의 진가는 배열과 결합했을 때 나타난다. 다음 토픽인 배열에서 반복문의 진가를 살펴보자.

 

 

댓글

댓글 본문
  1. DreamBoy
    2023.10.24. PHP - 반복문 파트 수강했습니다.
  2. dueto park
    2022.07.02. 반복문 수강 완.

    - 변수를 중괄호({}) 사용하여 문자열 안에 끼워넣으려면, 문자열을 큰 따옴표로 묶어야 한다. (작은 따옴표로 묶으면 "."으로만 결합할 수 있다.)
  3. 코드파괴자
    22.05.19 complete.
  4. 드림보이
    2022.01.14. 반복문 파트 수강완료
  5. ggyuker
    21.12.31 수강완료
  6. ggyuker
    21.12.30 반복문의 문법까지 수강완료
  7. jeisyoon
    2021.07.25 Loop(While, For) - OK
  8. 눈누난나
    무한루프 주의 메세지에 실힘이기 않아도 된다 -> 실행하지 않아도 된다
  9. OEGUKIN
    thanks
  10. WICO
    감사합니다
  11. choon
    감사합니다.
  12. 호두
    고맙습니다.
  13. 웅이
    답변 감사합니다 복받으세요 !
    대화보기
    • 빌빌타
      웅이님,

      1)전역변수
      while문 전에 $s=1; 하셨을경우, 첫 s의 반복문을 거치면서 변수 s는 10이 되버리기때문에 그 이후의 s의 반복문은 실행이 되지 않습니다. 코드 제일 뒤에 print($s); 로 체크하면 10이 출력됩니다.

      2)지역변수
      반면 i의 반복문안에 $s = 1; 을 하셨을경우 s의 반복문이 처음 실행되고 s가 10이 되어도 i의 반복문이 실행되면서 다시 s=1로 지정되기때문에 구구단 전체가 출력되는 것입니다.
      대화보기
      • 웅이
        while문으로 구구단 만들어본 코드인데요,
        첫번째 while문 전에
        $i=2;
        $s=1; 을 하면 2단 내용 출력하고 나머지는 3단 4단 5단... 이렇게 제목만 나오구요,
        첫번째 while문안에 $s=1; 을 넣으면 구구단 전체가 다 나오는데 왜그런지 설명해주실분 계신가요?

        <?php
        $i = 2;
        while($i<10){
        echo $i.'단<br>';
        $s = 1;
        while($s<10){
        echo $i.'*'.$s .'='. $i*$s.'<br>';
        $s++;
        }
        $i= $i + 1;
        }
        ?>
      • 말봉
        감사합니다.
      • 도미닉
        결과는 동일하고 좀 더 짧게 쓰려고 예제처럼 사용합니다
        대화보기
        • parkhj
          i = i + 1 , i = i*2 , i= i/2 등 기존의 변수를 활용하여 연산하는 과정들이 자주 사용되기 떄문이 아닐까요?
          가장 먼저 이해하셔야 할 것은

          [var = var 연산자 k ] -> [ var 연산자 = k ]

          로 변경하는 것에 익숙해지시는게 중요할 거 같구요.

          더 나아가 i++, ++i는 i+=1의 형태가 조금 변환된 것입니다. ++i와 i++차이는 메모리 저장의 순서가 다름에 있습니다. 이 부분은 오래전에 공부해서 자세하게 기억이 나지 않네요. 간단하게 말씀드리면 i++은 해당 라인의 처리를 다 수행하고 i의 값을 1 증가시키는 것이 됩니다. 반대로 ++i는 i를 증가시킨 후 라인의 처리를 수행합니다. 즉, printf(++i); 를 하면 기존에 i가 5였다면 6이 출력됩니다. 1 증가된 값이 처리에 반영이 되는 것이에요. print(i++)은 어떨까요?

          여기서 ++i의 방식은 복사해놓은 변수를 사용하는 것에 원인이 있는데요. 결과적으로 i의 값은 1씩 모두 증가합니다. 하지만 ++i는 처리에서 기존의 i값을 사용합니다. 즉, printf( i++)에서 기존 i가 5라고 해볼게요. 5의 값을 가지는 복사본 i' 를 생성하고 i는 6으로 값을 변경합니다. 하지만 실제 처리에서는 i'을 사용하기 때문에 printf(i++)을 하여도 기존의 i 값(=5)이 출력됩니다!
          대화보기
          • Elec Car
            답변 감사드립니다 왜 그러한 형태로 축약하는지 정확히 머리로 이해는 안가지만 일단 걍 외워야 겠네유 ㅜㅜ
            대화보기
            • parkhj
              c언어에서 i = i + 1을 축약한 형태가 i + = 1 입니다. php에서도 동일한 것 같네요. [i = i 연산자 k ]와 같은 형식에서 명료하게 하는 장점이 있구요. 같은지는 직접 해보시는 것이 정확한 방법입니다.
              대화보기
              • Elec Car
                loop3 예제에서
                $i += 1; 는 $i=$i+1 과 정확히 같은 의미라고 하셨는데 왜 전자 처럼 표기하는지요? 왜 전자처럼 표기가 바뀌는지 이해가 안되네요.. ㅜㅜ 후자처럼 표기해도 동일한 결과가 나오나요?
              • 고스트프리
                감사합니다.
              • dosamo
                완료
              • 송성태
                반복문 잘 보았습니다.
                특히 for 반복문, 잘 이해했습니다.
                댓글 다신분들 대단하시네요.
                벌써 프로그램을 만드시다니요 ^^
              • Seongho Kim
                좋은 강좌에 감사드립니다.
                아래 구구단 놀이가 재밌네요.
                업그레이드 버전으로 만들어 봤습니다(^^).
                적당한 이름의 php 파일로 저장해서 실행해 보세요.

                <html>
                <head>
                <style media="screen">
                td {
                border: 1px solid black;
                }
                </style>
                </head>
                <body>
                <?php
                echo "<hr><h3>다른 방식의 구구단(^^);</h3><hr>";
                echo "<table>";
                for($i=0; $i<10; $i++){
                echo "<tr border=1>";
                for($j=2; $j<10; $j++){
                if($i == 0){
                echo "<th>"."{$j} 단</th>";
                } else {
                echo "<td>"."{$j} x {$i} = ".($i*$j)."</td>\t";
                }
                }
                echo "</tr>";
                }
                echo "</table>";
                ?>
                </body>
                </html>
              • orez
                텍스트가 함께 있어서 너무너무 좋습니다!!
              • spiritord
                감사합니다
              • 어린왕자
                저도 구구단입니다. 좋은 강의 감사합니다.

                <?php
                /*
                구구단 입니다.
                2단부터 9단까지
                한개의 단이 끝나면 줄바꿈처리
                */
                for($i=2; $i<10; $i++){
                for($j=1; $j<10; $j++){
                echo "{$i} x {$j} = " .($i*$j)."<br />";
                }
                echo "<br />";
                }
                ?>
              • kimjs9105
                감사합니다~~
              • sheis
                잘 봤어요^^
              • 오원구
                고맙습니다.
              • 카이리
                좋은 강의 감사합니다!!!
              • 심화평
                반복문의 사용이유는 안듣고 갑니다.
                17-07-11 감사합니다~
              • treehouse
                크 반복문 강의도 명강의였다..
                이고잉 당신은 도대체...
              • <?php
                for($i = 2; $i < 10; $i++){
                for($j = 1; $j < 10; $j++){
                echo "$i x $j= ".$i*$j."<br />";
                }
                }

                ?>

                저두 구구단이요~ 잘보고있습니다!!
              • php가첫취업?
                2017.4.5 국비기간 한달전 취업성공 패키지 4월4일 신청후.....5월 15일 전까진 공백기 입니다..
                이 기간내에 php 수업 최대한 많이 배울까해요
              • 김세창
                정말 잘봤습니다!!^^

                2017.03.30

                응용편으로 구구단을 한번 만들어봤습니다^^

                <?php
                for ($i=0; $i < 10; $i++) {
                echo "<h1>".$i."단</h1>";
                for ($j=0; $j < 10; $j++) {

                echo "<h1>".$i."X".$j."=".$i*$j."</h1>";

                if ($j === 9) {
                echo "<hr>";
                }

                }
                }
              • 이명수
                web 이라는 녀석에 한발씩 다가갑니다. 감사합니다.
              • 주재학
                언제들어도 명강의! 이고잉님 항상 감사합니다 :) 새해복많이받으세요!!
              • NamJin Kim
                항상 감사합니다 ^^
              • 감사합니다!
              • 라꿍차타
                반복문을 통해 나온 결과값이

                1,2,3,4,5

                라고 한다면 이 값을 바로 변수에 담을 수는 없나요?
              • coding
                for($i=0, $j=0, $s="coding everywhere"; $i<10 && $j<16; $i++, $j=$i+2){
                echo $i.$s.$j."<br>";
                이렇게 바꿔밨습니다. 그냥 , 는 or 의 역할이라서 j 가 15 가 될때까지 i 도 10 이상으로 올라가는데 and 로 하니까 i 에 맞춰서 멈추네요. 재미있습니다...
                대화보기
                • sajuk
                  항상 감사합니다.
                  2016.08.26
                • Brandon S. Ha
                  감사합니다
                • JustStudy
                  고맙습니다
                • nacl3791
                  정말 잘 보았습니다.
                  이 귀한 영상 제작하시느라 수고가 많으십니다.
                  하늘의 복이 임할 것입니다. 이고잉님. ^^
                • SK Kim
                  while문은 조건이 하나밖에 안되는데에 비해 for문은 복잡하게도 되네요.
                  강의중 "실행"의 뜻을 그대로 해봤더니 다음 코드가 작동하네요!
                  for ($i=0,$j=0,$s="coding everywhere "; $i < 10, $j < 16 ; $i++,$j=$j+2) {
                  echo $i.$s.$j." <br>";
                  echo "{$i} {$s} {$j} <br>";
                  };
                • 고고1
                  ++ 표현이 적응 안되네여 ㅎㅎ
                • cham
                  3년 전에 처음 c언어 배울때가 생각나네요 ㅎㅎ