웹마스터 팁

6번째 시간입니다. ^^;; 나름대로 자세하면서도 혼자 공부하는 법을 익혔으면 하는 마음으로 쓰고 있는데, 잘 되나 모르겠어요. 기초 시간이 너무 길다고 지루해하시는 분들도 계시겠지만, 기초가 없는 응용은 그냥 베껴쓰기 수준을 벗어나기 힘들죠. 아... 게시판도 얼렁 만들어야 되는데... 흑...

이번 시간에는 연산자에 대해서 공부해보겠습니다. 연산자...라는 말은 많이 들어보셨는데 어떤 것인지 궁금하죠? 그냥 단순하게는 연산기호..라고 생각하셔도 되겠습니다. 1 + 2 = 3 이라는 수식에서 보면 +와 =가 연산자인 것이죠. 개념은 아시겠죠? 그럼 연산자의 순서대로 살펴보겠습니다. 매뉴얼에는 Language Reference -> Operators 에 있습니다.


1. 산술연산자(Arithmetic Operators)
머... 더하기(+), 빼기(-), 나누기(/), 곱하기(*)...는 말안해도 다들 아실테니 넘어갑니다.
그 중 좀 특이해서 기억해야 할 연산자가 하나 있는데 바로 나머지 연산자(%)입니다. 예를 들어 10 % 3 = 1 이 되는거죠. 10으로 3을 나눈 나머지를 정수형으로 반환해줍니다. 주의해야할 부분으로는 나누기 연산의 경우 절대로 몫이 남는 것이 아니라는 겁니다. 즉, 2.45/1.77 = 1.384180790.... 과 같은 결과가 내부적으로 나온다는 것입니다. 계산기로 계산하듯이요. ^^


2. 할당연산자(Assignment Operators)
할당연산자의 주가 되는 것은 이퀄(equal, =) 기호입니다.

$a = 3; // 이렇게 하면 a 라는 이름을 가진 변수에 3이라는 값이 들어갑니다.
$a += 3; //이것은 $a = $a + 3; 과 같은 의미입니다.
$a -= 3; //이것은 $a = $a - 3; 과 같은 의미입니다.
$a /= 3; //이것은 $a = $a / 3; 과 같은 의미입니다.
$a %= 3; //이것은 $a = $a % 3; 과 같은 의미입니다.
$a .= "Test"; //이것은 $a = $a."Test"; 과 같은 의미입니다. 점(.)은 문자열을 합치는 연산자입니다.

복합으로 쓰이는 연산자 보셨죠? 저렇게 쓰는 이유는... 일단 타이핑을 조금이라도 덜하려는 잔머리에서... 쿨럭~ 코드가 간결해지고 파일용량을 조금이라도 줄일 수 있어 효율적이죠. 그리고 오히려 더 직관적(척 보면 알 수 있는..)이잖아요 ^^;; 그럼 여기서 끝나느냐? 하면 절대로 아닙니다. 할당연산자의 특이한 쓰임에 대해서는 이제부터입니다. 다른 언어와 달리 PHP에서는 가능한 할당연산자의 쓰임새를 보자면...

$a = ($b = 3) + 4;

와 같은 구문입니다. $b값에 3이라는 값을 할당하면서 $a 값에 또 할당하는 거죠. 저렇게만 봐서는 감이 안오죠? 아직 제어문을 배우지는 않았지만, 만약 if 문을 사용하다고 하죠. 그리고 $true 의 값이 1이어야만 if문을 실행하는 구문이 있다고 했을때 보통은...

$true = 1;
if($true) ~~~

와 같은 식으로 사용하게 됩니다. 그러나!! 혼자 공부하기를 보신분이라면 조금 더 세련되게...

if($true = 1) ~~~

처럼 사용하시는 것이 좋습니다. 나중에 배우게 될 MySQL 관련함수를 볼 때 흔히 소스에서 볼 수 있는 것이

while($row = mysql_fetch_array($result)) ~~~

와 비슷한 구문이었을텐데, 순서는 $row 라는 값에 mysql_fetch_array($result) 라는 함수를 실행시킨 값을 할당받아서 그 다음에 그 값이 while 문에 쓰이는 것입니다. 이제는 이해되시죠? 당연히 저런 종류의 쓰임에는 할당연산자가 우선권을 가지게 됨도 알 수 있을 겁니다. 그렇다면 저렇게 밖에 안되느냐? 하는 것은 아니죠... ^^ +=, -=, ./= 등등의 연산자가 쓰일 수 있습니다.


3. 비트연산자(Bitwise Operators)
비트연산자인데... 이진수에 대해서 모르시는 분은 그냥 다음 항목으로 넘기기를 바랍니다. 별로 쓰이지도 않을 뿐더러 머리도 아파질텐데 이진수를 모르는 상태에서는 머리썩힐 필요가 없다고 보거든요.

&(And), |(Or), ^(Xor), ~(Not), <<(Shift Left), >>(Shift Right)

우선 이러한 연산자들의 기준은 이진수임을 알려드립니다. 예를 들어 12 ^ 9 로 나왔다고 해서 12와 9를 어떻게 한다고 생각하지마시고, 이진수 1100 과 1001을 가지고 연산한다고 생각하시면 됩니다. And는 둘 다 1이어야지 1이 나오며, Or는 둘 중에 하나라도 1이면 1이 나오고, Xor은 둘 중에 하나가 1이면 1이지만 둘 다 1이거나 둘 다 0이면 0이 나오며, Not은 무조건 반대로 바꾸고 시프트 연산자는 어떤 숫자의 비트를 얼마만큼 왼쪽 혹은 오른쪽으로 이동시키라... 라는 것입니다.

천천히 쓰임을 살펴보겠습니다.
$a = 12, $b = 3; 을 기본으로 하고 연산결과를 알려드립니다.

...$a & $b         $a | $b
   1100                 1100
& 0011               | 0011
--------         ---------
   0000                  1111

우선은 연산자 두개에 대한 것만 해봤지만 나머지에 대한 것은 해보시기 바랍니다.
참고로 Not 은 ~$a 와 같이 쓰는, 변수 하나에 대한 연산만 합니다.

조금 어려운 개념이 Shift 인데요, $a << $b 를 하게 되면 어떤 결과가 나올까요? 결과부터 말하면 96입니다.
$a = 12 이진수로는 1100입니다. 이것을 $b = 3만큼 왼쪽으로 미는 연산자라고 했습니다. 왼쪽으로 밀면...??
1100000 가 되겠죠? 이진수 연산이니까요. 빈 공간은 0이 채우죠. 그럼 그 수가 96이 됩니다. ^^ 오른쪽 Shift 에 관한 것도 해보세요.


4. 비교연산자(Comparison Operators)
$a == $b // $a와 $b가 같을 때 참
$a === $b // $a와 $b가 같을 때 참. 단, $a와 $b는 변수형이 같을 것. (PHP4 이상)
$a != $b // $a와 $b가 같지 않을 때 참 ( <>연산자와 같음 )
$a !== $b // $a와 $b가 같지않거나 변수형이 같지 않을 때 참
$a < $b // $a가 $b보다 작을 때 참
$a > $b // $a가 $b보다 클 때 참
$a <= $b // $a가 $b보다 작거나 같을 때 참
$a >= $b // $a가 $b보다 크거나 같을 때 참
$a?$b:$c // $a가 참이면 $b를, 거짓이면 $c를 대입

머... 대게는 설명이 필요없겠지만... == 와 ===의 경우에는 좀 더 확실히 하고 가는 것이 좋겠군요.
다음 소스를 각각의 경우에 맞춰서 실행시켜보세요.

$a = 3; $a = "3";
if($a == $b) echo "True";
?>

마지막의 ?: 연산자는 정말 많이 쓰이는 연산자입니다. if 문을 대체하는 방식으로 많이 쓰이는데, 한줄에 쓰일 수도 있고 깔끔하게도 쓰일 수 있어서 많이 사용하죠.

$a = 1;
echo $a?"True":"False";
?>

$a = 0;
echo $a?"True":"False";
?>

$a = 0;
echo $a+1?"True":"False";
?>

세가지 경우를 보시면 사용하는 법이 눈에 들어오시죠? ^^;;
이런게 있구나! 하는 정도만 아시면 나중에 응용편을 하면서 지겹도록 사용할 것이니 눈여겨 봐두세요. 가능하다면 개념도 잡고 가시는게 좋구요. ^^


5. 에러제어 연산자(Error Control Operators)
우선 연산자는 or 입니다. 많이 보신 소스를 하나 예로 들자면...

$connect = mysql_connect() or die("접속할 수 없습니다.");


보통은 mysql_connect 에서 접속된 리소스 값을 $connect 라는 변수가 받아와야 정상이지만, 어디 사람일이 마음대로 되는겁니까... -_-;; 에러가 발생하는 경우가 있습니다. 즉 or 는 실행했던게 제대로 안될 경우에 알아서 or 뒤편으로 넘어가도록 해주는 거죠. ^^;; 차차 쓰면서 익혀보세요.


6. 실행연산자(Execution Operators)
Tab 키 위에 있는 기호(` - 백틱스라고 읽는군요)입니다. 다음의 소스를 실행해보세요.

리눅스
$output = `ls -al`;
echo $output;
?>

윈도우
$output = `dir`;
echo $output;
?>

단, php.ini 에서 safe_mode 옵션이 활성화 되어있다면 사용할 수 없습니다. ^^;;


7. 증가/감소 연산자(Incrementing/Decrementing Operators)
기호는 단 두개 뿐입니다. ++ 과 -- 뿐이죠. 그렇지만 이것이 어디에 위치하느냐에 따라서 또 의미가 틀려집니다.

$b = ++$a; // $a에 1을 더한 후에 $b 값에 대입한다.
$b = $a++; // $b값에 $a를 먼저 대입한 후에 $a 에 1을 더한다.
$b = --$a; // $a에 1을 뺀 후에 $b 값에 대입한다.
$b = $a--; // $b값에 $a를 먼저 대입한 후에 $a 에 1을 뺀다.

헛갈릴 수도 있지만... -_-;; 잘 익혀 두신다면 매우 편합니다. 간단하게 풀어써볼까요?


$b = ++$a; // 이것은...

$a = $a + 1; // 이것과 같은 의미입니다.
$b = $a
------------------------------
$b = $a++; // 이것은...

$b = $a;
$a = $a + 1; //이것과 같은 의미입니다.

이해되시죠? ^^


8. 논리연산자(Logical Operators)
$a and $b // $a와 $b의 값이 둘 다 참이어야 참
$a or $b // $a와 $b의 값 중 하나라도 참이면 참
$a xor $b // $a와 $b의 값 중 하나만 참이어야 참
!$a // $a의 값을 부정(Not)함. 즉, $a가 거짓이어야 참
$a && $b // and 와 같다.
$a || $b // or 와 같다.


9. 문자열연산자(String Operators)
기호는 점(.) 이며, 문자열 사이에 살포시~ 놔두면 알아서 해줍니다. -_-;;

$a = "Test";
echo $a." is Good"!;
?>

실행해보시면 알 것이라는... ^^ 아까 배웠던 .= 도 한번 연습해보세요. ^^


10. 배열연산자(Array Operator)
배열끼리 합치는 건데, 이전 배열에 없던 부분만 합칩니다. 예를 들어...

$a 라는 배열에 "a" 라는 키값으로 "사과" 라는 값이 있고, "b"라는 키값으로 "바나나" 라는 값이 있습니다.
$b 라는 배열에는 "b"라는 키값으로 "파인애플" 이라는 값이 있고, "c"라는 키값으로 "체리" 라는 값이 있습니다.

$a + $b를 실행하면...
키 : "a", 값 : "사과"
키 : "b", 값 : "바나나"
키 : "c", 값 : "체리"

라는 값을 가지게 되죠. + 연산자 앞에 있는 것을 기준으로 없는 부분만 +연산자 뒤에서 가지고 오는 겁니다. ^^



후아~ 연산자 부분이 끝났네요. 다른 곳에서도 많이 볼 수 있는 부분은 대강 다루고 안 했을 것 같은 부분만 좀 다루어 보았습니다. 제가 설명을 안한 나머지 연산자에 대해서도 꼭 예제를 만들어서 실행해보고 개념을 확실히 잡으세요. ^^ 그럼 다음시간에는... 응용편을 하려고 했는데... 생각해보니 제어문과 함수가 빠졌더군요. 흐흐.. -_-;; 대강이라도 짚고 넘어가야 될 것 같아서, 다음시간에는 제어문과 함수부터 하고 그 다음에 응용편으로 들어갑니다. 저도 응용편으로 얼렁 넘어가고 싶지만 흑흑...ㅠ_ㅠ


### 생각해볼 문제
나머지 연산자에 대해서 확실하게 개념을 잡기 위해 이번 시간에 배운 연산자들이 하나라도 들어가는 프로그램을 반드시 전부 작성해볼 것!