본문 바로가기
PHP

PHP operator

by FraisGout 2020. 7. 2.

연산자(operator)

PHP는 다양한 연산을 위해 많은 종류의 연산자를 제공하고 있습니다.

 

산술 연산자(arithmetic 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

 

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

연산자의 우선순위는 하나의 수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자가 먼저 처리될 것인가를 결정합니다. 연산자의 결합 방향은 수식 내에 우선순위가 같은 연산자가 둘 이상 있을 때, 먼저 어느 연산을 수행할 것인가를 결정합니다.

 

대입 연산자(assignment operator)

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

 

복합 대입 연산자

PHP에서는 대입 연산자와 산술 연산자 등을 결합한 다양한 복합 대입 연산자를 제공합니다.

 

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

 

)

$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

 

위의 예제에서 $num_03 =- 5 연산은 단순히 -5를 변수 $num_03에 대입하는 연산이 되었습니다.

 

이처럼 복합 대입 연산자에서 연산자의 순서는 매우 중요하므로 주의를 기울여야 합니다.

 

증감 연산자(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}로 변했습니다.";

 

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

 

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

 

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

 

증감 연산자의 연산 순서

증감 연산자는 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서가 달라집니다.

 

 

 

다음 예제는 증감 연산자의 연산 순서를 살펴보기 위한 예제입니다.

 

)

$x = 10;

 

$y = $x-- + 5 + --$x;

 

 

 

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

 

비교 연산자(comparison operator)

비교 연산자는 피연산자 사이의 상대적인 크기를 판단하여, (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

 

위의 예제에서 변수 $num_01$num_02의 값은 3으로 서로 같지만, 타입은 각각 정수와 실수로 서로 다릅니다.

 

따라서 동등 연산자(==, equal)와 일치 연산자(===, strict equal)의 결과가 다르게 반환됩니다.

 

다양한 타입의 비교

PHP에서는 다양한 타입의 값을 서로 비교해야 할 때 다음 규칙에 따라 비교합니다.

 

)

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

 

위 예제의 번 라인에서는 불리언 타입과 숫자 0을 비교하므로, 숫자 0은 불리언 false 값으로 변환되어 비교됩니다.

 

번 라인에서는 문자열과 숫자를 비교하므로, 숫자로 시작되는 문자열 "123abc"는 숫자 123으로 변환되어 비교됩니다.

 

이때 만약 문자열이 위의 예제처럼 숫자가 아닌 영문자나 언더스코어(_)로 시작하면, 숫자 0으로 변환되어 비교될 것입니다.

 

하지만 번 라인에서 알 수 있듯이 문자열이 숫자로 변환되어 비교된다고 해도 해당 타입까지 변하는 것은 아닙니다.

 

 

 

위 예제의 번 라인에서는 배열끼리 비교하므로, 배열의 길이가 같은 경우에는 같은 키를 가지는 값을 서로 비교합니다.

 

하지만 번 라인처럼 배열의 길이가 다른 경우에는 배열 요소의 수가 적은 쪽이 작다고 판단됩니다.

 

번 라인에서처럼 배열이랑 다른 타입을 비교하면, 언제나 배열이 크다고 판단됩니다.

 

논리 연산자(logical operator)

논리 연산자는 논리식을 판단하여, (true)과 거짓(false)을 반환합니다.

 

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

 

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

and&& 연산자, or|| 연산자는 정확히 같은 동작을 하며, 연산자의 우선순위에서만 차이가 발생합니다.

 

)

$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) 단위로 논리 연산을 수행합니다.

 

또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용합니다.

 

다음 예제는 비트 NOT 연산자(~)와 시프트 연산자(<<, >>)의 예제입니다.

 

)

$num_01 = 15;

$num_02 = 8;

 

 

echo "~ 연산자에 의한 결괏값은 ".(~$num_01)."입니다.<br>"; // 1의 보수

echo "<< 연산자에 의한 결괏값은 ".($num_02<<1)."입니다.<br>"; // 곱하기 2

echo ">> 연산자에 의한 결괏값은 ".($num_02>>1)."입니다."; // 나누기 2

위 예제의 번 라인에서는 왼쪽 시프트 연산자(<<)를 사용하여, 해당 데이터의 모든 비트를 왼쪽으로 1비트씩 이동시키고 있습니다.

그 결과 해당 데이터의 값은 처음 값에 2를 곱한 것과 같아집니다.

 

 

 

반대로 번 라인에서는 오른쪽 시프트 연산자(>>)를 사용하여, 해당 데이터의 모든 비트를 오른쪽으로 1비트씩 이동시키고 있습니다. 그 결과 해당 데이터의 값은 처음 값에 2를 나눈 것과 같아집니다.

 

삼항 연산자(ternary operator)

삼항 연산자는 유일하게 피연산자를 세 개나 가지는 조건 연산자입니다.

 

 

 

삼항 연산자의 문법은 다음과 같습니다.

 

문법

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

 

 

 

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

 

 

 

)

$num_01 = 15;

$num_02 = 8;

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

 

 

 

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

삼항 연산자는 짧은 if / else 문 대신 사용할 수 있으며, 코드를 간결하게 만들어 줍니다.

 

문자열 연산자(string operator)

PHP에서 문자열 연산자(.)를 사용하여 문자열을 연결할 수 있습니다.

 

이 연산자는 얼핏 보기에는 연산자가 아닌 것처럼 보이지만 양쪽에 위치한 두 문자열을 연결해 주는 역할을 합니다.

 

 

 

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

 

)

$str_01 = "PHP 수업";

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

 

 

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

 

echo $str_01, $str_02;

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 연산자는 다음과 같은 사항을 확인하고자 할 때 사용할 수 있습니다.

 

 

 

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

instancof 연산자의 사용 용도를 자세히 알기 위해서는 객체 지향 프로그램에 대한 기본 지식이 필요합니다.

따라서 지금은 그냥 넘어가도 상관없으며, 나중에 필요할 때 참고하는 것도 좋습니다.

'PHP' 카테고리의 다른 글

PHP function  (0) 2020.07.02
PHP array  (0) 2020.07.02
PHP expressions  (0) 2020.07.02
PHP 기초  (0) 2020.07.02
PHP 기본  (0) 2020.07.02

댓글