PHP도 여타 언어들과 똑같이 반복문이 존재한다. (아니 애초에 foreach문을 제외하면 php가 아니라 대부분의 언어와 호환됨.)
반복문의 존재 이유중 하나가 배열을 활용하기위해서이기때문에 C나 JAVA에는 없는 특이한 구문도 있는데, 예제를 통해 살펴보자.
1) for문
for문과 이후에 나올 while문은 모든 언어에 존재한다고 해도 과언이 아닐정도로 언어의 시초가 되는 반복문이다.
'프로그래밍이란 조건문과 반복문의 연속이다'
라는 말을 어디선가 들어본적이 있다. 아마 로직을 만들기 위해서는 조건문과 반복문의 사용이 불가피하기때문일것이다. 굉장히 공감이 되는 문장이다.
것보다 for문은 굳이 난이도를 얘기하자면 while문보다 아주아주 약간 더 어렵다.
예제문을 보자.
1 2 3 4 5 6 | <?php for($i=0; $i<5; $i++) { echo 'for문 실행중...<br>'; } ?> | cs |
일단 반복문은 함수가 아니다.
그래서 반복문이 끝나는 5행에 세미콜론(;)이 붙지 않은것을 볼 수 있다.
이는 모든 반복문이 가진 공통된 특징으로서, 많은 사람들이 간과하고있는 사실이기도 하다.
'왜 반복문에는 세미콜론이 붙지 않나요?'
라는 질문을 받는다면 위의 대답을 해주길 바란다. (물론 예외도 있다.. 천천히 읽어 내려가보자.)
아무튼.. for문의 구조는 이렇다.
for( 초기값; 조건값; 증감값 )
증감값에는 세미콜론을 붙이지 않는것도 특징이라면 특징이다.
위의 예제에 넣은 for문의 구조를 설명하자면
for($i=0; $i<5; $i++)
$i라는 변수의 초기값을 0으로 선언했고
'$i가 5보다 작을 경우 실행하라.' 라는 조건값을 넣었으며
$i++라는 증감값이 주어졌다.
즉, for문이 한번 끝날 경우 증감값을 실행하고 처음부터 다시 시작한다.
예제문의 4행을 보면
echo 'for문 실행중...<br>';
이라는 출력문이 for문안에 유일하게 들어가있는데, 이 출력문이 한번 실행되면 for문안에는 더이상 아무것도 존재하지 않기에 반복문의 실행을 초기화한다. $i라는 변수에 i++를 실행한 뒤 말이다.
그럼 변수는 초기값인 0에서 1이 되고 두번째 반복문이 시작된다.
그렇게 다섯번을 반복하면 출력값은
for문 실행중...
for문 실행중...
for문 실행중...
for문 실행중...
for문 실행중...
이 되는것이다.
2) while문
while문은 for문과 함께 반복문의 양대산맥을 이루며 언어를 지탱한다. 게다가 정말 쉽기때문에 우리집 강아지도 10년이면 가르칠 수 있다.
예제를 볼 필요까진 없지만 이해를 위해 일단 보자.
1 2 3 4 5 6 7 8 9 10 | <?php $i=true; while($i==true) { echo 'while문을 실행했다.'; $i=false; } ?> | cs |
while문은 for문과 꽤 다른 모습을 보인다.
일단 반복문의 구조가 매우 단순하기에 초보들은 초기에 while문부터 배운다. (나중엔 for문이 복잡한 반복식을 처리하기가 훨씬 쉽고 유용해서 while문의 사용이 줄어들기는 한다.)
일단 while문 안에서 변수를 선언하는것은 불가능하다. 이는 모든 언어가 공통이기도 하다.
그래서 3행처럼 while문이 실행되기 이전에 바로 윗줄에서 변수를 선언하는 방법을 가장 많이 사용한다. 아니, 그냥 정석이다. 프로그래머는 보수적이고 독자적이고 많이 알려진 코딩방법을 사용해야한다.
그래야 유지보수도 쉽고 알아보기도 쉽기 때문이다. 프로그래밍이 언어라고 불리는 이유가 컴퓨터와의 대화수단이 바로 프로그래밍 언어이기 때문이라는것을 생각하면 어려운것도 아니다.
아무튼 각설하고, 4행 while문의 조건을 살펴보자.
while($i==true)
'$i라는 변수가 true일때만 반복문을 실행하라.'
라는 말이다.
4행을 실행하기 전에 3행을 보면
$i=true;
$i라는 변수를 확실히 true의 값으로 선언했다.
그렇다면 while문의 조건에 충족하게 되는것이다.
조건문은 간단하다. 맞으면 실행, 아니면 그냥 지나감. 둘의 선택지밖에 없다.
그래서 결론적으로 출력값은
while문을 실행했다.
이 된다.
7행에서 $i=false, 즉 $i라는 변수에 다시 false를 담으라는 명령을 내렸기때문에 다음 반복문에서는 조건에 충족되지 않아 오직 한번 실행되는 것이다.
3) do~while문
do~while문은 while문을 이해했다면 한번만 설명을 들어도 이해할수밖에 없다.
do~while이란 말 그대로 '일단 그냥 해라.'라는 말이다.
즉, 무조건 처음 한번은 실행해라. 라는 것이다.
예제문을 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 | <?php $i=0; do { echo 'do~while문 실행중...<br>'; $i++; } while($i<5); ?> | cs |
이 코드의 출력값은
do~while문 실행중...
do~while문 실행중...
do~while문 실행중...
do~while문 실행중...
do~while문 실행중...
가 된다.
3행에서 $i라는 변수를 0으로 선언했고, 4행부터 반복문을시작한다. 그런 뒤에 6행을 통해 일단 do~while문 실행중...을 한번 출력하고, 7행에서 $i변수를 1 증가시킨다.
$i가 5번 증가할때까지는 조건이 맞으나 6번부터는 $i의 값이 5가 되었기때문에 while($i<5) 의 조건이 맞지 않는다. 그래서 반복문을 종료한다.
하지만 이 식으로는 do~while문을 완벽히 이해하기 힘들다.
위의 예제에서 살짝만 바꾼 예제를 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 | <?php $i=0; do { echo 'do~while문 실행중...<br>'; $i++; } while($i>5); ?> | cs |
유일하게 9행만 바뀌었다.
while($i<5)
에서
while($i>5)
로 바뀌었을 뿐인데
출력값은
do~while문 실행중...
이 된다.
5번이나 반복하던 위 예제와 확연이 다르다. 단 하나만 바꾸었을 뿐인데 말이다. 왜그럴까?
위에서 한번 이야기했듯 do~while문은 뭐가 되었든 일단 무조건 한번은 반복한다. 그래서 7행까지 한번 완료하고 다시 반복하려는데, while문의 조건이 맞지 않는것이다.
7행에서 $i라는 변수가 1이 되었지만
9행의 조건은 while($i>5), 즉 $i가 5보다 클 경우에만 반복문을 실행하라는 말인데 $i는 1밖에 되지 않아 반복이 되지 않고 끝이 나게 되는것이다.
그리고 반복문은 함수가 아니기때문에 끝에 세미콜론이 붙지 않는다고 이야기를 했었다.
선언된 함수를 부를때는 func();처럼 뒤에 세미콜론이 붙는것을 가리켜 말한것이다. 하지만 do~while문은 예외인 반복문이다. 이것만 기억해두자.
4) foreach문
이번은 좀 어려울수도 있다.
foreach는 상대적인 반복문이다.
배열의 수만큼 반복한다.
팁을 주자면 배열을 활용한 문법에서는 while문보다 foreach문이 30%정도 더 빠르다.
1 2 3 4 5 6 7 8 9 | <?php $number = array('one', 'two', 'three'); foreach($number as $num) { echo $num . '<br>'; } ?> | cs |
3행에서 $number이라는 배열 변수를 선언했다.
(php에서는 배열을 한꺼번에 선언할때 array를 붙인다.)
배열 안에는 세개의 문자열 변수가 들어있다.
'one', 'two', 'three'
그리고 4행부터 반복문을 시작한다.
foreach($number as $num)
는 $number안에 있는 배열을 $num에 대입하여 코드 안에서 활용하게 한다. 6행을 보자.
echo $num . '<br>';
$num에 담긴 $number의 변수를 echo, 즉 출력하라는 말이다.
$number배열의 변수는 3개이므로 반복도 세번하는것이고, 그렇기때문에 출력값은
one
two
three
이 되는것이다.
- foreach문 심화
어쩌면 위의 방법보다 더욱 자주쓰이는 방법이다. 좀 특이한 편이라 지금 이해해놓지 않으면 나중에 조금이라도 어려운 step을 밟을때 큰 장벽으로 느껴질수도 있다.
배우는 입장인 초반에는
이걸 왜쓰지? 왜 있는거지? 할 수 있지만, 나중에 가면 제일 많이 쓰게된다.. 이해만 해두자.
1 2 3 4 5 6 7 8 9 10 11 | <?php $number = array('one' => 1, 'two' => 2, 'three' => 3); foreach($number as $num => $i) { echo <<<EOL $num = $i<br> EOL; } ?> | cs |
6행의 EOL은 긴 코드를 한꺼번에 출력하게 해주는 편한 출력문인데, 굳이 따로 볼 필요 없을정도로 쉽지만 그래도 지금 이해하고 오는게 좋다면 이곳을 클릭하자.
조금 심화된 foreach문이다. 배열에도 키값이 생겨 더욱 심화되었다.
하지만 전혀 어렵지 않다.
일단 3행을 보자.
$number이란 배열안에 키값이 존재하는 변수를 집어넣었다.
즉, 배열은 배열이지만 변수마다 값이 따로 있는 배열이라는 뜻이다.
배열의 첫번째 변수인 'one'은 1이라는 키값이 존재하는 배열변수다.
그래서 이 변수값과 키값을 따로 분리해주는 반복문이 바로 foreach라는 것이다.
7행을 보면
$num = $i <br>
EOL구문을 통해 heredoc을 사용했기때문에 평소 echo문과는 조금 다른데, 이걸 echo문으로 바꿔보면
echo $num . ' = ' . $i . '<br>';
이 된다.
$num에는 배열변수가 담겨있고, $i에는 변수의 키값이 담겨있으므로
첫 반복문의 값은
one = 1
이 되었고,
모든 출력값은
one = 1
two = 2
three = 3
이 되는것이다.
반복문은 엄청 중요하다. 조금이라도 이해가 되지 않는다면 다시 글을 찬찬히 읽어보도록 해야하며, 그래도 힘들면 댓글을 통해 물어보도록 하자.
다음글) break문을 통해 반복문 이탈하기