2009. 3. 24. 20:17
728x90
이번 강좌에서 배울 것이 바로 연산자입니다. 연산자는 우리가 흔히 사용하는 더하기 빼기와 같은 것에서부터 참과 거짓을 판단하는 등 여러 가지 연산을 하기 위한 기호를 의미합니다. 예를들어 더하기를 하기 위해서 "+" 기호를 사용하지요? 바로 "+" 기호가 더하기 연산자입니다. 즉, 합을 구하는 행위는 연산이고 그 연산을 구분짓고 표시하는 기호가 연산자입니다.
PHP에는 많은 연산자가 있는데 이렇게 많은 연산자들이 서로 섞여있는 경우, 어떤 순서로 계산하느냐에 따라서 결과가 달라질 수 있습니다. 예를들어 1 + 2 * 3 을 계산할 때, 순서대로 1과 2를 먼저 더하여 결과가 9를 얻을 수도 있고 곱하기를 먼저한다면 1+6 이 되어 7이 결과가 될 수도 있습니다. 프로그래밍 언어는 언제나 동일한 결과를 도출해야 하므로 이렇게 불명확한 것은 배척됩니다. 그래서 연산자들의 순서의 혼란을 없애고자 연산자간에 우선 순위를 만들었으며 그 순서는 다음과 같습니다.
http://www.php.net/manual/kr/language.operators.precedence.php
그렇다면 수식을 계산하기 위해서 연산자의 우선 순위를 모두 기억해야만 할까요? 당연히! 아니죠! 우선 순위를 외우기 보다는 괄호를 이용하여 순서를 명확히 하는 것이 중요합니다. 즉, 1 + 2 * 3 이라는 수식을 작성하는 것보다 1 + (2 * 3) 이라고 프로그래머가 원하는 수식을 명확히 하는 것이 좋습니다.
산술 연산은 흔히 우리가 접하는 더하기 빼기 곱하기 나누기를 말합니다. 어려운 말로 가감승제( 加減乘除 )
더하기 : + , 빼기 : - , 곱하기 : * , 나누기 : / , 나머지 : %
이 다섯가지 연산자들은 더 이상 설명이 필요없을 정도로 간단합니다. 다만 곱하기와 나누기 그리고 나머지의 기호가 수학에서의 기호와 사뭇 다르기 때문에 혼동의 소지가 있습니다. 곱하기를 x 가 아니라 * 기호를 사용하는 것은 영문자 X와 곱의 기호와 서로 혼동되지 않도록 하기 위함입니다.
대입 연산자는 대학가는 연산자가 아니라(-_-) 할당된 메모리 공간에 어떤 값을 입력하기 위한 연산자입니다. PHP에서 대입 연산자는 = 기호입니다. 일반적으로 수학에서 = 기호를 "같다"라고 생각하기 때문에 프로그래밍을 함에 있어서 많이들 혼동하곤 합니다. 그러나 a = b 는 a 와 b 가 서로 같다가 아니라.. (PHP에서 실제 같다는 == 입니다.) "b 의 값을 a 에다가 대입한다"라는 뜻입니다. 그래서 대입 연산자이지요. 결과적으로는 a 와 b 가 같지만.. 의미상 아주 다릅니다. 특히 프로그램에서는 치명적이죠.
예)
$a = 1;
if ($a = 5) { //$a가 5와 같다?
echo "변수 \$a는 5입니다.";
}
else {
echo "변수 \$a는 5가 아닙니다.";
}
if 구문을 아직 배우지 않았기때문에 문법 구조에 대해서는 일단 잘 모르셔도 됩니다. if 구문은 괄호 안이 참인경우 이어서 나오는 구문이 실행되는데 여기서는 "변수 $a는 5입니다."가 출력됩니다. 만약 참이 아닌 거짓이라면 else 구문이 수행됩니다. 그런데 분명 위에서 변수 $a에 1을 대입하여 $a가 1이 되어서 5가 아니기 떄문에 "변수 $a는 5가 아닙니다."라고 출력되어야 하나 이 코드를 실행해보면 변수 $a의 초기값에 상관없이 항상 "변수 $a는 5입니다."가 출력되는 것을 알 수 있습니다. 이는 프로그래머의 실수로 $a == 5라고 해야할 부분에 대입 연산자인 $a = 5 라고 해서 변수 $a에 5의 값이 대입되고 5는 참인 값이므로 if 문의 값은 항상 참입니다. 그래서 언제나 "변수 $a는 5입니다."가 출력되는 것입니다. 따라서 수학에서의 같다는 의미의 기호를 혼동하지 않기 바랍니다.
델파이(파스칼)의 경우 이러한 혼동을 없애기 위해서 대입 연산자를 ":=" 기호로 사용합니다. 그리고 수학에서와 마찬가지로 "=" 기호는 같다라는 의미를 같습니다.
비교 연산은 말 그대로 두 개의 값을 비교하는 것입니다
< | 작다 |
> | 크다 |
<= | 작거나 같다 |
>= | 크거나 같다 |
== | 같다 |
!= | 같지 않다 |
++ $a | $a를 1 증가후 $a를 반환 |
$a ++ | $a를 반환후 $a 에 1 증가 |
- - $a | $a를 1감소후 $a를 반환 |
$a - - | $a를 반환후 $a 에 1 감소 |
예제를 보면 이해가 갈겁니다.
1 |
<? |
예 | 이름 | 결과 |
$a and $b | And | 두 변수 모두 참일 때 TRUE. |
$a or $b | Or | 두 변수중 적어도 하나가 참이면 TRUE |
$a xor $b | Xor | 둘 중 하나만 참이면 TRUE, 둘이 같으면 FALSE |
! $a | Not | 변수가 거짓일 때 TRUE, 참이면 FALSE |
$a && $b | And | 두 변수 모두 참일 때 TRUE. |
$a || $b | Or | 두 변수중 적어도 하나가 참이면 TRUE |
&& 이나 and, || 나 or 는 같습니다. 그러나 따로 해놓은 이유는 우선순위가 서로 다르기 때문입니다.
문자열을 더할 때는 . (쩜) 연산자를 씁니다.
$a = " 안녕 ";
$b = " 하세요";
일 때 두 문자열을 더하고 싶으면 $c = $a . $b; 하시면 됩니다.
$c 에 한마디를 더 추가하고 싶을 때는..
$c .= " 반가워요~"; 하시면 됩니다.
$c .= ""; 는 $c = $c . ""; 와 같습니다.
결과적으로 $c = " 안녕 하세요 반가워요~"; 가 되겠네요.
배열을 서로 더하기 위해서는 "+" 플러스 기호를 이용하여 가능합니다.
왼쪽의 배열에 오른쪽 배열을 더하여 집니다.
<?
$a = array("a" => "사과", "b" => "바나나");
$b = array("a" =>"배", "b" => "딸기", "c" => "포도");
$c = $a + $b;
?>
결과는이 연산자는 shell_exec() 함수를 사용하는 것과 동일합니다. 보안문제로 인해 PHP가 안전모드로 동작하거나 shell_exec() 함수의 사용이 제한되었다면 이 연산자 또한 실행되지 않습니다.$c = array("a" =>"사과", "b" => "바나나", "c" => "포도");
같은 a,b 키를 가지는 값은 덮어쓰여지지 않고 중복되지 않는 것만 추가가 되었습니다.
실행 연산자(` `)를 이용하여 서버에 쉘명령을 실행할 수 있습니다. 실행 연산자는 백틱으로 작은 따옴표가 아닙니다. 키보드의 Esc 아래키입니다.
<?$output = `ls -al`;echo "<pre>$output</pre>"; ?>
PHP 표현식에서 에러가 발생할 수 있는 곳에 "@" 기호를 붙이므로해서 에러를 출력하지 않게 하는 연산자입니다.
<? @include "a.php"; ?>
만약 a.php 파일이 없을 경우 include 가 실패하여 에러를 표시하게 되지만 에러제어 연산자가 있기 때문에 에러를 표시하지 않고 넘어가게 됩니다. 에러가 발생해도 프로그램의 실행에는 상관없는 그러한 경우에 이 연산자를 사용하시면 됩니다.
비트 연산은 숫자를 2진수로 생각하여 각각의 비트별로 계산하는 연산입니다.
예 | 이름 | 결과 |
$a & $b | And | 양쪽의 비트가 모두 1인 자리를 1로 나머지는 0으로 세팅 |
$a | $b | Or | 둘중 적어도 하나의 비트가 1이면 그 자리를 1로 모두 0이면 0으로 세팅 |
$a ^ $b | Xor | 비트가 같으면 그 자리를 0으로 다르면 1로 세팅 |
~ $a | Not | 모든 비트를 0은 1로 1은 0으로 세팅 |
$a << $b | Shift left | 모든 비트를 왼쪽으로 $b자리씩 이동 (한번 이동은 2를 곱한 것과 같음) |
$a >> $b | Shift right | 모든 비트를 오른쪽으로 $b자리씩 이동 (한번 이동은 2를 나눈 것과 같음) |
실제 적용 예) 12는 2진수로 1100 이고 5는 2진수로 0101 입니다.
예 | 설명 | 결과 |
12 & 5 | 1100 과 0101에서 모두 1인자리만 1 따라서 0100 | 4 (0100) |
12 | 5 | 1100 과 0101에서 하나만 1이어도 1 따라서 1101 | 13 (1101) |
12 ^ 5 | 1100 과 0101에서 같으면 0 다르면 1 따라서 1010 | 10 (1010) |
~ 12 | 1100을 반대로 따라서 0011 | 3 (0011) |
12 << 2 | 1100을 왼쪽으로 두자리 이동 따라서 110000 | 48 (110000) |
12 >> 2 | 1100을 오른쪽으로 두자리 이동 따라서 0011 | 3 (0011) |
참고.
비트 연산자이나 실행 연산자는 PHP 프로그래밍에서 자주 사용하는 연산자는 아닙니다. 따라서 특별한 경우에만 사용하므로 자세히 모르셔도 괜찮습니다.
728x90