article thumbnail image
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
echo "<h4>후 증가</h4>";
$a 5;
echo 
" \$a++: " $a++ . "<br>\n";
echo 
" \$a : " $a "<br>\n";

echo 
"<h4>선 증가</h4>";
$a 5;
echo 
" ++\$a: " . ++$a "<br>\n";
echo 
" \$a : " $a "<br>\n";

echo 
"<h4>후 감소</h4>";
$a 5;
echo 
" \$a--: " $a-- . "<br>\n";
echo 
" \$a : " $a "<br>\n";

echo 
"<h4>선 감소</h4>";
$a 5;
echo 
" --\$a: " . --$a "<br>\n";
echo 
" \$a : " $a "<br>\n";
?>     



이름 결과
$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;
?>
결과는 $c = array("a" =>"사과", "b" => "바나나", "c" => "포도");
같은 a,b 키를 가지는 값은 덮어쓰여지지 않고 중복되지 않는 것만 추가가 되었습니다.
실행 연산자(` `)를 이용하여 서버에 쉘명령을 실행할 수 있습니다. 실행 연산자는 백틱으로 작은 따옴표가 아닙니다. 키보드의 Esc 아래키입니다.
<?$output = `ls -al`;echo "<pre>$output</pre>"; ?>
이 연산자는 shell_exec() 함수를 사용하는 것과 동일합니다. 보안문제로 인해 PHP가 안전모드로 동작하거나 shell_exec() 함수의 사용이 제한되었다면 이 연산자 또한 실행되지 않습니다.


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
복사했습니다!