Language/Php

[Php] 연산자: 산술/대입/증감/비교/논리/비트/문자열/배열 합집합/instanceof

재초찡 2025. 10. 23. 23:42
반응형

산술 연산자(arithmetic operator)

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

http://www.tcpschool.com/php/php_operator_arithmetic

$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

연산자의 우선순위(operator precedence)와 결합 방향(associativity)

  • 우선순위가 빠른 연산자가 가장 먼저 실행되고, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 결합 순서에 따라 실행 순서가 결정된다.
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 , 쉼표 연산자 왼쪽에서 오른쪽으로

 

대입 연산자(assignment operator)

  • 대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.

복합 대입 연산자

  • PHP에서는 대입 연산자와 산술 연산자 등을 결합한 다양한 복합 대입 연산자를 제공한다.
  • 복합 대입 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 왼쪽의 피연산자에 대입함.
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 왼쪽의 피연산자에 대입함.
*= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 왼쪽의 피연산자에 대입함.
/= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 왼쪽의 피연산자에 대입함.
%= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.
.= 왼쪽 피연산자의 문자열에 오른쪽 피연산자의 문자열을 추가한 후, 왼쪽의 피연산자에 대입함.
<<= 왼쪽의 피연산자의 비트를 오른쪽의 피연산자만큼 전부 왼쪽으로 이동시킨 후, 그 결과를 왼쪽의 피연산자에 대입함
>>= 왼쪽의 피연산자의 비트를 부호를 유지하면서 오른쪽의 피연산자만큼 전부 오른쪽으로 이동시킨 후, 그 결과를 왼쪽의 피연산자에 대입함.
&= 왼쪽의 피연산자와 오른쪽의 피연산자의 논리식이 모두 true면 왼쪽 피연산자에 true을 대입하고, 그 외에는 false을 대입함.
|= 왼쪽의 피연산자나 오른쪽의 피연산자의 논리식 중 하나라도 true면 왼쪽 피연산자에 true을 대입하고, 그 외에는 false을 대입함.
^= 왼쪽 피연산자의 논리식과 오른쪽 피연산자의 논리식이 서로 다르면 왼쪽 피연산자에 true을 대입하고, 그 외에는 false을 대입함.
$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

 

증감 연산자(increment and decrement operator)

  • 증감 연산자는 피연산자를 1씩 증가 혹은 감소시킬 때 사용하는 연산자다. 이 연산자는 피연산자가 단 하나뿐인 단항 연산자로, 증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라다.

$num_01 = 7;
$num_02 = 7;

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

// ++\7 에 의한 결괏값은 3이고, 변수의 값은 8로 변했습니다.
// \7++ 에 의한 결괏값은 2이고, 변수의 값은 8로 변했습니다.
$x = 10;
$y = $x-- + 5 + --$x;

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

// 변수 \8 의 값은 8이고, 변수 \23 의 값은 23으로 변경되었습니다.

 

비교 연산자(comparison operator)

  • 비교 연산자는 피연산자 사이의 상대적인 크기를 판단하여, 참(true)과 거짓(false)을 반환한다.
  • 비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.

http://www.tcpschool.com/php/php_operator_comparison

  • !=와 <> 연산자는 정확히 같은 동작을 하며, 연산자의 우선순위에서만 차이가 발생한다.
$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

다양한 타입의 비교

피연산자1 피연산자2 비교 규칙
bool, null 모두 둘 다 불리언으로 변환한 후 비교함. (false < true)
string,
resource,
integer, float
string,
resource,
integer, float
숫자로 시작하는 문자열과 리소스는 숫자로 변환한 후 비교함.
object object 내장 클래스는 자신의 비교 함수를 정의할 수 있으나, 다른 클래스끼리 비교할 수는 없음.
array array 배열끼리의 비교는 같은 키를 가지는 값을 서로 비교함.
이때 피연산자1 배열의 키가 피연산자2 배열에 존재하지 않으면 비교할 수 없으며, 배열 요소의 수가 적은 쪽이 작은 거로 판단됨.
array 모두 배열이 항상 큰 거로 판단됨.
object 모두 객체가 항상 큰 거로 판단됨.
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, 배열이랑 다른 타입을 비교하면, 언제나 배열이 크다고 판단

 

논리 연산자(logical operator)

  • 논리 연산자는 논리식을 판단하여, 참(true)과 거짓(false)을 반환한다.
  • and, or, xor 연산자는 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
  • ! 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽이다.
  • and와 && 연산자, or와 || 연산자는 정확히 같은 동작을 하며, 연산자의 우선순위에서만 차이가 발생다.

http://www.tcpschool.com/php/php_operator_logic

$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

 

비트 연산자(bitwise operator)

  • 비트 연산자는 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 수행한다. 또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.

$num_01 = 15;
$num_02 = 8;

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

 

비트 연산자(bitwise operator)

  • 물음표(?) 앞의 표현식에 따라 결괏값이 참이면 반환값 1을 반환하고, 결괏값이 거짓이면 반환값 2를 반환다.
조건식 ? 반환값1 : 반환값2
$num_01 = 15;
$num_02 = 8;
$result = ($num_01 > $num_02) ? $num_01 : $num_02;

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

 

문자열 연산자(string operator)

  • PHP에서 문자열 연산자(.)를 사용하여 문자열을 연결할 수 있다. 이 연산자는 얼핏 보기에는 연산자가 아닌 것처럼 보이지만 양쪽에 위치한 두 문자열을 연결해 주는 역할을 한다.
  • echo() 함수에서는 쉼표 연산자(,)를 이용하여 문자열을 연결할 수 있다.
$str_01 = "PHP 수업";
$str_02 = "에 오신것을 환영합니다!";

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

// 두 문자열을 합친 문자열은 'PHP 수업에 오신것을 환영합니다!'입니다.
// PHP 수업에 오신것을 환영합니다!

 

배열 합집합 연산자(array union operator)

  • 배열 합집합 연산자(+)는 피연산자로 오는 두 배열의 합집합을 반환한다.
  • 왼쪽 피연산자로 오는 배열의 키값은 유지하면서, 거기에 맞춰 오른쪽 피연산자로 오는 배열을 덧붙이는 방식이다. 따라서 같은 키에 대한 값에는 왼쪽 피연산자로 오는 배열의 값이 저장된다.
$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 연산자

  • instanceof 연산자는 다음과 같은 사항을 확인하고자 할 때 사용할 수 있다.
    • 해당 변수가 어떤 클래스(class)에서 생성된 객체(object)인지를 확인할 때
    • 해당 변수가 부모 클래스(parent class)에서 상속받은 클래스인지를 확인할 때
    • 해당 변수가 클래스의 인스턴스(instance)인지 아닌지를 확인할 때
    • 해당 변수가 인터페이스(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

 

Reference

반응형