,
반응형

프로그램의 기본은 "값"과 "변수"와 "구문"이라고 할 수 있다. 우선 구문 중에서도 가장 중요한 "제어 구문"에 대해 설명한다.



if 문에 의한 조건 분기

값과 변수의 기본이 알았으니, 이어서 "제어 구문"을 배워보자. 제어 구문은 프로그램의 흐름을 제어하기위한 구문이다.

프로그램이라는 것은 단지 써져 있는 문장을 처음부터 끝까지 순서대로 실행해서 끝나는 것이 아니다. 필요에 따라 수행할 작업을 바꾸거나, 여러번 원하는 만큼 처리를 반복하여 동작하는 것이다. 그러한 "어떻게 문장을 실행해 나갈 것인가"를 필요에 따라 제어하기 위한 구문이 제어 구문이다.

제어 구문에는 몇 가지 종류가 있다. 우선 가장 중요한 "if"문부터 설명하겠다.

if 문은 조건에 따라 양자 택일의 형태로 작업을 수행하기위한 것이다. 이것은 다음과 같은 형태로 작성한다.

조건이 맞으면 처리를 실행한다.

if (조건) {
    ...... 조건이 맞는 경우에 처리 ......
}

중괄호 대신 콜론(:)과 endif를 이용할 수도 있다.

if (조건 ):
    ...... 조건이 맞는 경우에 처리 ......
endif;

조건이 맞는지 아닌지에 다른 작업을 수행한다.

if (조건) {
    ...... 조건이 맞는 경우에 처리 ......
} else {
    ...... 조건이 잘못된 경우에 처리 ......
}

중괄호 대신 콜론(:)과 endif를 이용할 수도 있다.

if (조건 ):
    ...... 조건이 맞는 경우에 처리 ......
else:
    ...... 조건이 잘못된 경우에 처리 ......
endif;

여러 조건으로 다른 작업을 수행한다.

if (조건1) {
    ...... 조건이 맞는 경우에 처리 ......
} elseif(조건2) {
    ...... 조건2이 맞는 경우에 처리 ......

...... 필요한 만큼 elseif가 계속 ......     
        
} else {
    ...... 모든 조건이 잘못된 경우에 처리 ......
}

중괄호 대신 콜론(:)과 endif를 이용할 수도 있다.

if (조건1 ):
    ...... 조건1이 맞는 경우에 처리 ......
elseif (조건2):
    ...... 조건2이 맞는 경우에 처리 ......
        
...... 필요한 만큼 elseif가 계속 ......     
        
else:
    ...... 모든 조건이 잘못된 경우에 처리 ......
endif;

if는 ()부분에 "조건"을 설정한다. 조건이라고 하면 이해하기 어려울 수 있다. 이는 "옳고 그른지?"라는 형태로 나타낼 수 있는 식이나 값이라고 생각하면 된다.

컴퓨터의 세계에서는, 예를 들면 "변수 a의 값이 0인가?", "A의 값은 B보다 큰가" 등으로 값이나 변수를 확인하여 그 수식이 옳고 그른지에 따라 다른 처리를 실행시키거나 한다. 이것이 if의 "조건"이다.

이 조건의 () 다음에 수행할 작업을 작성한다. 한 문장 밖에 없을 때는 그대로 문장을 쓰고 되지만, 여러 문장을 작성하여 실행하고 싶을 경우에는 {}라는 기호를 둘려 쌓고 그 가운데 실행 문장을 작성한다.이렇게 함으로써 "여기에서 여기까지가 수행하는 작업"이라는 것을 명확히 할 수 있다. (이 {} 부분을 "블록(block)"이라고 한다.)

만약 잘못된 경우에는 다른 작업을 실행시키고자 하는 할 시에는, 옳은 조건의 경우에 수행할 작업 후에 "else"가 오고 잘못된 경우의 처리를 작성한다. 이것도 한문장이라면 바로 작성하겠지만, 여러 문장이라면 {} 기호를 붙여 블록으로 감싸준다.

여러 조건이 있이 있는 경우에는 "elseif"를 이용해서 다른 조건을 넣을 수도 있다. elseif는 여러 번 사용할 수 있다. else는 필수가 아니므로 사용하지 않아도 된다.

아래 목록에 간단한 예제를 보도록 하자.

<?php
    $num = 12345;
    $namoji = $num % 2;
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <div>
            <?php
                if ($namoji == 0) {
                    echo "{$num}는 짝수입니다.";
                } else {
                    echo "{$num}는 홀수입니다.";
                }
            ?>
        </div>
    </body>
</html>

여기에서는 변수 $num의 값이 짝수인지 홀수인지를 판단하여 표시하고 있다. 짝수인지 홀수인지는 그 숫자를 2로 나누어, 나머지가 0인지 여부로 알 수 있다. $namoji = $num % 2;와 같이 나머지를 구해서, if문에서 그것이 0인가에 여부에 따라 표시 내용을 변경하고 있다.

부울과 비교

그런데 지금의 예제 if에서 사용된 조건식 좀 익숙치 않을 것이다.

if ($namoji == 0) {...... 중략 ......}

등호가 2개 줄선 "=="라고 하는 기호가 사용되고 있다. 이것은 "비교 연산자"라는 것으로, 우변과 좌변의 값을 비교위한 기호이다. 이 비교 연산자에 다음과 같다.

수식설명
A == BA와 B는 동일하다.
A != BA와 B는 다르다 (A <> B로도 사용할 수 있다)
A > BA가 B보다 크다.
A >= BA와 B는 A가 크거나 동일하다
A < BA는 B보다 작다
A <= BA와 B는 A가 작거나 동일하다

이러한 기호를 사용한 표현은 "그 표현이 맞는지"를 나타내는데 사용된다. 여기에서는 if ($namoji == 0)이 있었다. 이는 $namoji가 0과 동일한지(즉, $namoji가 0인가?)를 점검하고 그것이 맞다면(즉, 0이라면), 그 후에 처리를 수행한다.

컴퓨터에서는 이렇게 올바른지에 대해 나타내는 경우가 많다. 이러한 "올바른 여부를 나타내는 양자 택일의 상태"를 나타내는데 사용할 수 있는 것이 "부울"라는 값이다.

이는 "true"또는 "false"라는 예약어로 표시된다. 예를 들어 "A == B가 맞다"라고 할 때 "true"이고, 아닌 경우에는 "false"라고 한다. 여기에 올린 비교 연산자도 두 값을 확인하고, true나 false를 반환한다.

즉, if 조건은 "부울로 나타나는 것"이라는 것이다. () 조건식이 true라면 그 실행한다는 구조로 되어 있다.

이 논리 값이라는 것은 프로그래밍에서 매우 자주 등장한다. 조건 연산자와 같은 것을 사용할 수도 있고, 일반적으로 변수 등으로 사용할 수도 있다. 이를테면 "양자 택일의 값"이 필요한 경우는 대부분 이 진리 값이 사용되는 것이라고 생각해도 좋을 것이다.

숫자나 텍스트와 다르게 프로그래밍에 익숙하지 않은 경우, 별로 들어 본 적이 없는 값일 것이다. 지금 단계에서 꼭 기억해 두도록 하자!


switch 문에 의한 다수의 분기

if는 양자 택일(true, false)의 분기이었지만, 때로는 더 많은 처리가 분기 할 수 있다(물론 elseif를 사용하면 if문도 많은 분기 처리가 가능하긴 하지만 길어지면 코드가 복잡해 진다). 특히 숫자 등을 취급하는 경우, "결과가 1이면 이것, 2라면 이거, 3이라면 ......"라는 식으로 값에 따라 각각 다른 처리를 하고자하는 경우도 있다.

이러한 경우에 사용되는 것이 'switch'이라는 구문입니다. 이것은 다음과 같은 형태를 하고 있다.

switch (조건) {
case1 :
    ...... 값1 경우의 처리 ......
    break;
case2 :
    ...... 값2 경우의 처리 ......
    break;

    ...... 필요한만큼 case가 계속 ......

default :
    ...... 어떤 것도 아닌 경우에 처리 ......
}

중괄호 대신 콜론과 endswitch를 사용할 수도 있다.

switch (값1):
  case1:
    ...... 값1 경우의 처리 ......
    break;
  case2:
    ...... 값2 경우의 처리 ......
    break;
        
  ...... 필요한만큼 case가 계속 ......
    
  default:
    ...... 어떤 것도 아닌 경우에 처리 ......
endswitch;

이 switch 문도 ()의 조건을 체크하여 분기를 한다. 그렇다고 해도 이 조건은 if와 같은 논리 값이 없다. 평범한 숫자나 텍스트 값으로도 상관없다.

이 switch는 ()의 조건 값을 확인하고, 그 값이 지정된 case로 점프하는 기능을 한다. 예를 들어, 거기에 있는 값이 '1'이라면, "case 1:"라는 것을 검색하고 거기로 점프한다는 것이다.

그러나 여기서 잊지 말아야 할 것은 "switch는 case로 점프할 뿐이고, 돌아가거나 필요한 구문을 종료하는 기능은 없다."는 것이다. 즉, 그대로 위에서 아래로 실행이 될뿐이다. 따라서 필요한 작업을 마치면 구문을 빠져 나오게 해야 한다.

이를 위해 준비되어 있는 것이 "break"라는 예약어이다. 이는 현재 실행중인 구문을 빠져나와 다음 동작을 한다. 각 case에 준비된 처리의 마지막에는 반드시 이 break를 붙이는 것이 기본이라고 기억해 두자.

만약, 값과 같은 case를 찾을 수 없는 경우, 마지막에 있는 "default:"이 선언된 처리로 이동을 한다. 이 default는 생략할 수 있다. 이 경우는 case가 발견하지 않았다면 그냥 아무것도하지 않고 구문을 빠져나와 계속 진행하게 된다.

이 switch를 사용하면 매우 복잡한 분기도 만들 수 있다. 아래에 간단한 예제를 보도록 하자.

<?php
    $b = "A"; // 혈액형 쓰기
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <div>
            <?php
                switch($b){
                case "A":
                    echo "당신은 꼼꼼하군요.";
                    break;
                case "B":
                    echo "당신은 자유 분방하네요.";
                    break;
                case "AB":
                    echo "당신은 복잡한 사람이네요.";
                    break;
                case "O":
                    echo "당신은 거물 이군요.";
                    break;
                default:
                    echo"당신은 인간이 아니군요.";
                }
            ?>
        </div>
    </body>
</html>

이것은 혈액형에 의해 표시 메시지를 바꾸는 예제이다. 첫 번째 "$b"에 혈액형을 입력하자. 그 혈액형에 메시지가 표시된다.

여기에서는 switch($b)로 분기를 준비하고 있다. 그리고 case "A": 등 각 혈액형의 텍스트의 case를 준비하고, 그걸로 echo를 실행하고 있다. 이런 분기가 많은 분기는 if로 하려고하면 많은 if 및 elseif문을 써야 한다. 이는 switch에 의해 상당히 깔끔하게 쓸 수 있게 되었다.

case문에 break;가 없다면

예제를 하나 더 보도록 하자.

<?php
    $var = 2; 
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <div>
           <?php
                $var = 2;
                switch ($var) {
                    case 1:
                      echo "A";
                      break;
                    case 2:
                      echo "B";
                    case 3:
                      echo "C";
                      break;
                    default:
                      echo "Z";
                 }
             ?>
        </div>
    </body>
</html>

위 예제에서 $var 값이 2이기 때문에 "A"와 "B"를 표시된다. 이는 case 2: 처리 안에 break;문이 없어서 "A"를 표시하고 이어서 case 3:에 있는 "B"도 같이 표시를 하게 된 것이다.




while과 do while 문

이어서 "반복"하는 구문을 살펴보자. 반복은 말 그대로 동일한 작업을 여러 번 실행하는 구문이다. 반복문도 여러 종류가 있지만, 가장 쉬운 방법은 "while"를 사용한 구문일 것이다.

먼저 조건을 확인

while (조건) {
    ...... 반복 처리 ......
}

중괄호 대신 콜론(:)과 endwhile을 사용할 수도 있다.

while (조건):
    ...... 반복 처리 ......
endwhile;

마지막으로 조건을 확인

do {
    ...... 반복 처리 ......
} while (조건);

이 구문은 조건을 확인하고 반복을 하거나, 반복 부분을 실행한 후에 조건을 검사하거나 하는 그 2가지의종류가 준비되어 있다. 조건은 if와 마찬가지로, 논리 값(true 또는 false)으로 표시되는 수식이나 값이 설정된다.

아무튼, 일반적으로 "먼저 확인"하는 방법을 사용하는 경우가 많다. 나중에 체크하는 방식은 처음부터 조건이 false인 경우도 반복을 실행해 버리기 때문에 다소 특별한 경우에만 한정되어 사용된다.

이도 간단한 예제를 보도로 하겠다.

<?php
    $num = 1;
    $total = 0;
    while($num <= 100){
        $total += $num;
        $num++;
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <div>
            <?php echo "합계:" . $total; ?>
        </div>
    </body>
</html>

위 예제는 1~100까지의 정수를 모두 합한 결과를 표시한다. 여기에서는 while ($num <= 100)과 같이 조건을 설정하고 $num의 값이 100이하인 동안에 반복을 계속하도록 하고 있다.

대입 연산자

그리고 수행할 작업은 $total += $ num;라는 계산을 하고 있다. 이는 "$total에 $num더한다"라는 의미이다. 이는 등호(=)처럼 좌변의 변수에 값을 대입하는 "대입 연산자"라는 것이다. 대략 다음과 같은 기호들이 있다.

수식설명
A += BA에 B를 더하고 A에 대입한다.
A -= BA에서 B를 빼고, A에 대입한다.
A*= BA에 B를 곱하고, A에 대입한다.
A /= BA를 B로 나누고, A에 대입한다.
A %= BA를 B로 나눈 나머지를 A에 대입한다.

이 대입 연산자는 보통 등호(=)에 의한 대입식을 좀 더 쓰기 쉽게 한 것이다. 예를 들어, $ total += $ num; 수식은 $ total = $ total + $ num;와 같은 의미이다. 이를 비교하면 $total += $ num;가 더 깔끔하고 알기 쉽다.

증가 연산자

또한 여기에서는 $ num++;을 실행하고 있다. 이 "++"라는 기호로 1만큼 증가시키는 기능을 한다. 이를 "증가 연산자"라고 한다.

마찬가지로, '-'라는 기호로 "감소 연산자"라는 것도 있다. 이것은 변수의 값을 1만큼 줄이는 기능을 한다.

이들은 "++"와 "--"는 수식에도 포함할 수 있다. 지금의 예라면,

$total += $num++;

이렇게 쓸 수도 있다. 이렇게 하면 2행이 1개의 문장으로 끝난다.

또한 이러한 연산자는 변수 전에도 후에도 쓸 수 있다. 예를 들어, "++$num", ''$num++ '와 같은 식으로 작성한다. 이 2개는 동작이 미묘하게 다르므로 주의해야 한다.

변수 전에 연산자를 붙이면 변수가 수식 등에 이용되는 경우 1을 더하거나 뺀 후에 값이 식에서 사용된다. 변수 후에 연산자를 붙이면 먼저 값이 식에서 사용된 후에 1을 더하거나 뺄 수 있다. 즉, 변수를 사용할 때와 1을 더하거나 뺄 때의 타이밍이 차이가 나는 것이다.

 

아무튼, 이를 실제로 여러 번 이용하게 되면 자연스럽게 기억할 수 있을 것이다. 우선은 "이런 기호가 있다"는 것만 머리에 넣어 두자.




for문에 의한 복잡한 반복

반복 구문은 while보다 "for"라는 구문이 더 많이 사용된다. 이것은 단순한 조건의 설정뿐만 아니라 초기화 및 반복까지 한꺼번에 설정할 수있는 구문이다.

for (초기화 처리; 조건; 반복 후 처리) {
    ...... 반복 처리 ......
}

중괄호 대신 콜론(:)과 endfor를 사용할 수도 있다.

for (초기화 처리; 조건; 반복 후 처리):
    ...... 반복 처리 ......
endfor;

이 for 문은 다음 ()안에 3 개의 요소를 설명한다.

  • 첫 번째는 반복을 시작하기 전에 실행하는 것으로, 변수에 값을 할당하거나 반복을 위한 준비를 한다.
  • 두 번째는 반복 조건이다. 여기에 쓴 수식이나 값이 true이면 반복을 계속한다. false가되면 반복을 빠져 나온다.
  • 세 번째는 반복 부분의 처리를 실행한 후에 다음 반복으로 진행하기 전에 수행하는 처리이다. 이를테면 "반복 후 처리'라는 것이다. 반복마다 변수의 값을 증감하는데 주로 이용된다.

이 for 문은 작성 요소가 많기 때문에 실제로 몇번이나 써보고 하여 사용법에 익숙해지길 바란다.

아래에 예제를 보도록 하겠다.

<?php
    $total = 0;
    for($i = 1;$i <= 100;$i++){
        $total += $i;
    }
?>
 
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <div>
            <?php echo "合計:" . $total; ?>
        </div>
    </body>
</html>

이는 앞서의 while 샘플 for를 사용 형태에 다시 작성한 것이다. 여기에서는

for ($i = 1; $i <= 100; $i ++) {...... 중략 ......}

이런 식으로 for를 쓰고 있다. 먼저 반복에 들어가기 전에 $i = 1을 실행하여 변수 $i에 1을 대입해 둔다. 그리고 $i <= 100가 true인(즉 $i가 100 이하)동안 반복을 계속하도록 하고 있다. 그리고 반복되면 $i++을 실행하여 $i의 값을 1 증가시킨다.

이렇게 변수 $i가 1부터 순차적으로 2,3 ...... 이런식으로 늘리면서 반복을 계속하고 100을 넘으면 반복을 빠져 나가게 되어 있다.

for는 while보다 까다로운이지만, 이를 사용하면 반복을 위해 불필요한 일을 쓸 필요없이 스크립트를 깔끔하게 작성할 수 있게 된다.



foreach 문에 의한 배열의 반복

반복은 사실 또 하나가 있다. 그것은 배열과 연관 배열의 모든 요소를 처리하기위한 전용의 반복 구문이다. 이는 다음과 같은 형태로 작성한다.

배열의 경우

foreach ($배열 as $변수) {
    ...... 반복 처리 ......
}

연관 배열의 경우

foreach ($배열 as $변수1 => $변수2) {
    ...... 반복 처리 ......
}

배열과 연관 배열은 구문 작성이 약간 다르다.

  • 배열은 foreach 후에 "$배열 as $변수"과 같이 작성한다. 이것으로 반복마다 배열에서 값을 꺼내 as 뒤에 있는 변수에 할당하 가면서 반복 처리를 할 수 있다.
  • 연관 배열의 경우는 foreach 문에 "$변수" 대신에 "$변수 => $변수"라는 두 가지 변수를 작성한다. 그러면 첫 번째 변수에 키, 두 번째 변수에 키값이 각각 설정된다.

아래에 간단한 사용 예제를 보도록 하겠다.

<?php
    $arr1 =array("Hello","Welcome","Hi");
    $result1 = "";
    foreach($arr1 as $item){
        $result1 .= $item . " ";
    }
    $arr2 = array("ko"=> "하나", "ja"=> "いち","en"=>"one");
    $result2 = "";
    foreach($arr2 as $key=>$val){
        $result2 .= $key . ":" . $val . "<br/>";
    }
?>

<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p><?php echo $result1; ?></p>
        <p><?php echo $result2; ?></p>
    </body>
</html>

배열과 연관 배열을 만들고 그 안에 모든 요소를 한꺼번에 출력하는 예제이다. 배열과 연관 배열의 모든 요소가 어떻게 해서 얻어 내는지를 보면 foreach의 동작을 알게 될 것이다.

이 foreach는 배열, 연관 배열의 전용 반복 구문이다. 특히 연관 배열은 번호에서 값을 꺼낼 수 없기 때문에 보통의 for는 사용할 수 없다. foreach 있어야만 연관 배열을 반복할 수 있다는 것을 기억해 두자.



반응형

'php' 카테고리의 다른 글

[php] 텍스트 파일 이용  (0) 2017.12.09
[php] form 전송 기본  (0) 2017.12.09
[php] 제어 구문  (0) 2017.12.09
[php] 산술 연산자  (0) 2017.12.09
[php] 값, 변수, 배열 및 문법  (0) 2017.12.09
[php] 서버 준비  (0) 2017.12.09

+ Recent posts