본문 바로가기

스터디/백엔드

[PHP] 연산자(Operator)

산술연산자

사칙 연산을 다루는 가장 기본적이면서도 많이 사용하는 연산자.

산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

 

$num_01 = 10;
$num_02 = 4;

 
echo "+ 연산자에 의한 결괏값은 ".($num_01 + $num_02)."입니다.<br>"; // 14
echo "- 연산자에 의한 결괏값은 ".($num_01 - $num_02)."입니다.<br>"; // 6
echo "* 연산자에 의한 결괏값은 ".($num_01 * $num_02)."입니다.<br>"; // 40
echo "/ 연산자에 의한 결괏값은 ".($num_01 / $num_02)."입니다.<br>"; // 2.5
echo "% 연산자에 의한 결괏값은 ".($num_01 % $num_02)."입니다.";     // 2

 

대입연산자

변수에 값을 대입할 때 사용하는 이항 연산자.

피연산자들의 결합 방향은 오른쪽에서 왼쪽입니다.

 

- 복합대입연산자

모두 두 개의 피연산자를 가지는 이항 연산자

$num_01 = 7;
$num_02 = 7;
$num_03 = 7;

echo "- 연산자에 의한 결괏값은 ".($num_01 = $num_01 - 5)."입니다.<br>"; // 2
echo "-= 연산자에 의한 결괏값은 ".($num_02 -= 5)."입니다.<br>";         // 2
echo "=- 연산자에 의한 결괏값은 ".($num_03 =- 5)."입니다.";             // -5

 

증감연산자

피연산자를 1씩 증가 혹은 감소시킬 때 사용하는 연산자.

피연산자가 단 하나뿐인 단항 연산자.

해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라집니다.

 

$num_01 = 7;
$num_02 = 7;

echo "++\\$num_01 에 의한 결과는 ".(++$num_01 - 5)."이고, 변수의 값은 {$num_01}로 변했습니다.<br>";
echo "\\$num_02++ 에 의한 결과는 ".($num_02++ - 5)."이고, 변수의 값은 {$num_02}로 변했습니다.";

위의 예제에서 첫 번째 연산은 변수 $num_01의 값을 먼저 1 증가시킨 후에 전체 연산을 수행합니다.

하지만 두 번째 연산은 먼저 모든 연산을 끝마친 후에 변수 $num_02의 값을 1 증가시킵니다.

따라서 두 번째 연산에서 변수 $num_02의 증가는 전체 연산에 어떠한 영향도 미치지 않습니다.

 

$x = 10;
$y = $x-- + 5 + --$x;
 
echo "변수 \\$x 의 값은 ".$x."이고, 변수 \\$y 의 값은 ".$y."으로 변경되었습니다.";

 

 

비교연산자

피연산자 사이의 상대적인 크기를 판단하여, 참(true)과 거짓(false)을 반환.

비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

 

$num_01 = 3;
$num_02 = 3.0;
$num_03 = 3;

var_dump($num_01 == $num_02);  // true
var_dump($num_01 === $num_02); // false
var_dump($num_01 != $num_03);  // false

 

- 다양한 타입의 비교

① var_dump(0 < true);           // true
② var_dump("123abc" == 123);    // true
③ var_dump("123abc" === 123);   // false

$arr_01 = array("a" => 10);
$arr_02 = array("a" => 5);
$arr_03 = array("a" => 5, "c" => 7);

④ var_dump($arr_01 >= $arr_02); // true
⑤ var_dump($arr_01 >= $arr_03); // false
⑥ var_dump("문자열" < $arr_01); // true

 

논리연산자

논리식을 판단하여, 참(true)과 거짓(false)을 반환.

and, or, xor 연산자는 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

! 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽입니다.

진리표(truth table)

$num_01 = true;
$num_02 = false;

var_dump($num_01 and $num_02);      // true and false -> false
var_dump($num_01 or $num_02);       // true or false -> true
var_dump($num_01 xor $num_02);      // true xor false -> true
var_dump( (3 < 5) or ("12" > 20) ); // true or false -> true

 

비트연산자

논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 수행.

비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용.

$num_01 = 15;
$num_02 = 8;

echo "~ 연산자에 의한 결괏값은 ".(~$num_01)."입니다.<br>";    // 1의 보수
① echo "<< 연산자에 의한 결괏값은 ".($num_02<<1)."입니다.<br>"; // 곱하기 2
② echo ">> 연산자에 의한 결괏값은 ".($num_02>>1)."입니다.";     // 나누기 2

[ 상세한 설명 ] www.tcpschool.com/php/php_operator_bitwise

기타

삼항 연산자

유일하게 피연산자를 세 개나 가지는 조건 연산자.

조건식 ? 반환값1 : 반환값2

물음표(?) 앞의 표현식에 따라 결괏값이 참이면 반환값 1을 반환하고, 결괏값이 거짓이면 반환값 2를 반환합니다.

$num_01 = 15;
$num_02 = 8;
$result = ($num_01 > $num_02) ? $num_01 : $num_02;

echo "둘 중에 더 큰수는 {$result}입니다.";

- 문자열 연산자

문자열 연산자(.)를 사용하여 문자열을 연결.

echo() 함수에서는 쉼표 연산자(,)를 이용하여 문자열을 연결할 수 있습니다.

 

$str_01 = "PHP 수업";
$str_02 = "에 오신것을 환영합니다!";

echo "두 문자열을 합친 문자열은 '".($str_01.$str_02)."'입니다.<br>";
echo $str_01, $str_02;

- 배열 합집합 연산자

피연산자로 오는 두 배열의 합집합을 반환.

왼쪽 피연산자로 오는 배열의 키값은 유지하면서, 거기에 맞춰 오른쪽 피연산자로 오는 배열을 덧붙이는 방식

  → 같은 키에 대한 값에는 왼쪽 피연산자로 오는 배열의 값이 저장

 

# 연관 배열(같은 키)
$arr_01 = array("1st" => "PHP", "2nd" => "MySQL");
$arr_02 = array("1st" => "HTML", "2nd" => "CSS", "3rd" => "JavaScript");

$result_01 = $arr_01 + $arr_02; // [PHP, MySQL, JavaScript]
var_dump($result_01);
$result_02 = $arr_02 + $arr_01; // [HTML, CSS, JavaScript]
var_dump($result_02);

# 나머지
$arr_01 = array("PHP", "MySQL");
$arr_02 = array("HTML", "CSS", "JavaScript");

$result_01 = $arr_01 + $arr_02; // [PHP, MySQL, JavaScript]
var_dump($result_01);
$result_02 = $arr_02 + $arr_01; // [HTML, CSS, JavaScript]
var_dump($result_02);

- instanceof  연산자

1. 해당 변수가 어떤 클래스(class)에서 생성된 객체(object)인지를 확인할 때

2. 해당 변수가 부모 클래스(parent class)에서 상속받은 클래스인지를 확인할 때

3. 해당 변수가 클래스의 인스턴스(instance)인지 아닌지를 확인할 때

4. 해당 변수가 인터페이스(interface)로 구현한 클래스의 객체 인스턴스(object instance)인지 아닌지를 확인할 때

 

interface Interface01

{
}
class Class01

{
}
class Class02 extends Class01 implements Interface01

{
}

/* 어떤 클래스(class)에서 생성된 객체(object)인지를 확인할 때 */
$var_01 = new Class01; // Class01 클래스 객체를 생성함.
var_dump($var_01 instanceof Class01);     // true
var_dump($var_01 instanceof Class02);     // false

 

/* 부모 클래스(parent class)에서 상속받은 클래스인지를 확인할 때 */
$var_02 = new Class02; // Class02 클래스 객체를 생성함.
var_dump($var_02 instanceof Class01);     // true
var_dump($var_02 instanceof Class02);     // true

 

/* 클래스의 인스턴스(instance)인지 아닌지를 확인할 때 */
$var_03 = new Class01; // Class01 클래스 객체를 생성함.
var_dump(!($var_03 instanceof Class02));  // true

/* 인터페이스(interface)로 구현한 클래스의 객체 인스턴스(object instance)인지 아닌지를 확인할 때 */
$var_04 = new Class02; // Class02 클래스 객체를 생성함.
var_dump($var_04 instanceof Class02);     // true
var_dump($var_04 instanceof Interface01); // true

 

※ 연산자의 우선순위

우선순위 연산자 설명 결합 방향
1 new 객체의 생성 -
  clone 객체의 복제 -
2 [] 배열 왼쪽에서 오른쪽으로
3 ++ 증가 연산자 -
  -- 감소 연산자 -
4 (타입) 타입 캐스트 연산자 -
  ~ 비트 NOT 연산자     -
  - 음의 부호 (단항 연산자) -
5 instanceof 객체 -
6 ! 논리 NOT 연산자 오른쪽에서 왼쪽으로
7 * 곱셈 연산자 왼쪽에서 오른쪽으로
  / 나눗셈 연산자 왼쪽에서 오른쪽으로
  % 나머지 연산자 왼쪽에서 오른쪽으로
8 + 덧셈 연산자 왼쪽에서 오른쪽으로
  - 뺄셈 연산자 왼쪽에서 오른쪽으로
9 << 비트 왼쪽 시프트 연산자 왼쪽에서 오른쪽으로
  >> 비트 오른쪽 시프트 연산자 왼쪽에서 오른쪽으로
10 < 관계 연산자(보다 작은) -
  <= 관계 연산자(보다 작거나 같은) -
  > 관계 연산자(보다 큰) -
  >= 관계 연산자(보다 크거나 같은) -
  <> 관계 연산자(와 같지 않은) -
11 == 관계 연산자(와 같은) -
  === 관계 연산자(와 같고 같은 타입) -
  != 관계 연산자(와 같지 않은) -
  !== 관계 연산자(와 같지 않거나 다른 타입) -
12 & 비트 AND 연산자 왼쪽에서 오른쪽으로
13 ^ 비트 XOR 연산자 왼쪽에서 오른쪽으로
14 | 비트 OR 연산자 왼쪽에서 오른쪽으로
15 && 논리 AND 연산자 왼쪽에서 오른쪽으로
16 || 논리 OR 연산자 왼쪽에서 오른쪽으로
17 ? : 삼항 연산자 오른쪽에서 왼쪽으로
18 = 대입 연산자 오른쪽에서 왼쪽으로
  += 복합 대입 연산자(덧셈) 오른쪽에서 왼쪽으로
  -= 복합 대입 연산자(뺄셈) 오른쪽에서 왼쪽으로
  *= 복합 대입 연산자(곱셈) 오른쪽에서 왼쪽으로
  /= 복합 대입 연산자(나눗셈) 오른쪽에서 왼쪽으로
  %= 복합 대입 연산자(나머지) 오른쪽에서 왼쪽으로
  .= 복합 대입 연산자(문자열 추가) 오른쪽에서 왼쪽으로
  <<= 복합 대입 연산자(비트 왼쪽 시프트) 오른쪽에서 왼쪽으로
  >>= 복합 대입 연산자(비트 오른쪽 시프트) 오른쪽에서 왼쪽으로
  &= 복합 대입 연산자(비트 AND) 오른쪽에서 왼쪽으로
  |= 복합 대입 연산자(비트 OR) 오른쪽에서 왼쪽으로
  ^= 복합 대입 연산자(비트 XOR) 오른쪽에서 왼쪽으로
19 and 논리 AND 연산자 왼쪽에서 오른쪽으로
20 xor 논리 XOR 연산자 왼쪽에서 오른쪽으로
21 or 논리 OR 연산자 왼쪽에서 오른쪽으로
22 , 쉼표 연산자 왼쪽에서 오른쪽으로

 

 

 

[ 참조 ]  www.tcpschool.com/php/intro