개발하는 두부

[PHP] 기본 문법 정리 (2) (feat. 연산자, 제어문)

by 뚜부니

PHP

1. 연산자

연산자란 값에 대해서 어떤 작업을 컴퓨터에게 지시하기 위한 기호입니다.

1.1. 산술 연산자

사칙 연산을 다루는 가장 기본적인 연산자

산술 연산자 설명
+ 왼쪽의 피연산자에게 오른쪽의 피연산자를 더함.
- 왼쪽의 피연산자에게 오른쪽의 피연산자를 뺌.
* 왼쪽의 피연산자에게 오른쪽의 피연산자를 곱함.
/ 왼쪽의 피연산자에게 오른쪽의 피연산자로 나눔.
% 왼쪽의 피연산자에게 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함.
** 왼쪽 피연산자의 값에 오른쪽 피연산자의 값을 제곱함.

코드는 다음과 같은 형태로 작성합니다.

<?php
$num_01 = 10;
$num_02 = 4;

echo "10 + 4 = ".($num_01 + $num_02)."<br />"; // 14
echo "10 - 4 = ".($num_01 - $num_02)."<br />"; // 6
echo "10 * 4 = ".($num_01 * $num_02)."<br />"; // 40
echo "10 / 4 = ".($num_01 / $num_02)."<br />"; // 2.5
echo "10 % 4 = ".($num_01 % $num_02)."<br />"; // 2
echo "10 ** 4 = ".($num_01 ** $num_02)."<br />"; // 10000
?>

 

1.2. 대입 연산자

1.2.1. 대입 연산자

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

대입 연산자 설명
= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함.

1.2.3. 복합 대입 연산자

대입 연산자와 산술 연산자 등을 결합한 형태이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽입니다.

복합 대입 연산자 설명
+= 왼쪽의 피연산자에게 오른쪽의 피연산자를 더한 후, 왼쪽의 피연산자에 대입함.
-= 왼쪽의 피연산자에게 오른쪽의 피연산자를 뺀 후, 왼쪽의 피연산자에 대입함.
*= 왼쪽의 피연산자에게 오른쪽의 피연산자를 곱한 후, 왼쪽의 피연산자에 대입함.
/= 왼쪽의 피연산자에게 오른쪽의 피연산자로 나눈 후, 왼쪽의 피연산자에 대입함.
%= 왼쪽의 피연산자에게 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.
.= 왼쪽 피연산자의 문자열에 오른쪽 피연산자의 문자열을 추가한 후, 왼쪽의 피연산자에 대입함.
<<= 왼쪽의 피연산자의 비트를 오른쪽의 피연산자만큼 전부왼쪽으로 이동시킨 후, 그 결과를 왼쪽의 피연산자에 대입함.
>>= 왼쪽의 피연산자의 비트와 부호를 유지하면서 오른쪽의 피연산자만큼 전부 오른쪽으로 이동시킨 후, 그 결과를 왼쪽의 피연산자에 대입함.
&= 왼쪽 피연산자의 논리식과 오른쪽 피연산자의 논리식이 모두 true이면 왼쪽의 피연산자에 true를 대입하고, 그 외에는 false를 대입함.
!= 왼쪽 피연산자의 논리식이나 오른쪽 피연산자의 논리식이 중 하나라도 true이면 왼쪽의 피연산자에 true를 대입하고, 그 외에는 false를 대입함.
^= 왼쪽 피연산자의 논리식과 오른쪽 피연산자의 논리식이 서로 다르면 왼쪽의 피연산자에 true를 대입하고, 그 외에는 false를 대입함.

1.3. 증감 연산자

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

증감 연산자 설명
++$var 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 수행함.
$var++ 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 증가시킴.
--$var 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 수행함.
$var-- 왼쪽의 피연산자에게 오른쪽의 피연산자로 나눔.

1.4. 비교 연산자

1.4.1. 비교 연산자

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

비교 연산자 설명
== 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참을 반환함.
=== 왼쪽의 피연산자와 오른쪽의 피연산자가 같고, 같은 타입이면 참을 반환함.
!= 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환함.
<> 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환함.
!== 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않거나, 타입이 다르면 참을 반환함.
< 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 참을 반환함.
<= 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 참을 반환함.
> 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 참을 반환함.
>= 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 참을 반환함.

1.4.2. 다양한 타입의 비교

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

1.5. 논리 연산자

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

and, or, xor 연산자는 두 개의 연산자를 가지는 이항 연산자이며, ! 연산자는 피연산자가 단 하나뿐인 단항 연산자입니다.

논리 연산자 설명
and 논리식이 모두 참이면 참을 반환함. (AND 연산)
or 논리식 중에서 하나라도 참이면 참을 반환함. (OR 연산)
xor 논리식이 서로 다르면 참을 반환함. (XOR 연산)
&& 논리식이 모두 참이면 참을 반환함. (AND 연산)
|| 논리식 중에서 하나라도 참이면 참을 반환함. (OR 연산)
! 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (NOT 연산)

다음은 논리 연산자에 대한 진리표입니다.

A B A and B (A && B) A or B (A || B) A xor B !A
true true true true false false
true false false true true false
false true false true true true
false false false false false true

1.6. 비트 연산자

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

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

비트 연산자 설명
& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산)
<< 지정한 수만큼 비트를 전부 왼쪽으로 이동시킴. (left shift 연산)
>> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)

1.7. 기타 연산자

1.7.1. 삼항 연산자

유일하게 피연산자를 세 개나 가지는 조건 연산자이며, 아래와 같은 형태로 씁니다.

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

조건식의 결괏값이 참이면 반환값1을 반환하고, 거짓이면 반환값2를 반환합니다.

<?php
$num_01 = 10;
$num_02 = 4;
$result = ($num_01 > $num_02) ? $num_01 : $num_02;
echo "둘 중에 더 큰 수는 {$result} 입니다.";
?>

실제로 실행한 결과는 다음과 같습니다.

1.7.2. 문자열 연산자

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

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

<?php
$str_01 = "Hello";
$str_02 = "World";

echo $str_01.$str_02."<br />";
echo $str_01,$str_02;
?>

실제로 실행한 결과는 다음과 같습니다.

1.7.3. 배열 합집합 연산자

배열 합집합 연산자(+)는 피연산자로 오는 두 배열의 합집합을 반환합니다.

왼쪽 피연산자의 배열의 키 값 유지하면서, 오른쪽 피연산자의 배열을 덧붙이는 방식을 취합니다.

실제로 수행시켜보는 것이 이해가 더 빠를 것 같네요! 😁😁

<?php
$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);
?>

수행 결과는 다음과 같습니다.

실제로 수행시켜보니 어떤 연산자인지 이해가 되시나요?

키 값이 동일한 연산자에 대해서만 다르게 처리된다고 보시면 됩니다.

그렇다면 키 값을 다르게 설정하면 어떻게 될까요? 🤔🤔

<?php
$arr_01 = array("1" => "PHP", "2" => "MySQL");
$arr_02 = array("3" => "HTML", "4" => "CSS", "5" => "JavaScript");

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

코드를 위와 같은 형태로 작성한 후 실행시켜보면, 다음과 같은 결과를 얻을 수 있습니다.

키 값 기준이라는 것 꼭 기억하세요!! 😎😎

만약 키 값에 대해 명시하지 않으면 어떻게 될까요? 🤔🤔

<?php
$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);
?>

실행시켜보면, 다음과 같이 0부터 시작한 번호를 자동으로 부여함을 알 수 있습니다.

1.7.4. instanceof 연산자

instanceof 연산자는 다음과 같은 사항을 확인하고자 할 때 사용할 수 있습니다.

  1. 해당 변수가 어떤 클래스(class)에서 생성된 객체(object)인지를 확인할 때
  2. 해당 변수가 부모 클래스(parent class)에서 상속받은 클래스인지를 확인할 때
  3. 해당 변수가 클래스의 인스턴스(instance)인지 아닌지를 확인할 때
  4. 해당 변수가 인터페이스(interface)로 구현한 클래스의 객체 인스턴스(object instance)인지 아닌지를 확인할 때

instanceof 연산자의 사용 용도를 자세히 알기 위해서는 객체 지향 프로그램에 대한 기본 지식이 필요하므로,

지금은 그냥 넘어가도 상관없어요! 참고만 하세요. 😁😁

<?php
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
?>

 

2. 제어문

표현식 중에서도 프로그램의 순차적인 흐름을 제어해야 할 때 사용하는 명령문을 제어문이라고 합니다.

2.1. 조건문

조건문이란 주어진 조건에 따라서 애플리케이션을 다르게 동작하도록 하는 것입니다.

2.1.1. if문

if문은 조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, 거짓(false)이면 아무것도 실행하지 않습니다.

if (조건식) {
    조건식의 결과가 참일 때 실행하고자 하는 명령문;
}

2.1.2. else문

if문과 같이 사용하며, if문의 조건식 결과가 거짓(false) 일 때 주어진 명령문을 실행합니다.

if (조건식) {
    조건식의 결과가 참일 때 실행하고자 하는 명령문;
}
else {
    조건식의 결과가 거짓일 때 실행하고자 하는 명령문;
}

2.1.3. else if 문

else if문은 if문처럼 조건식을 설정할 수 있으며,

if문과 else문 사이에서 여러 번 사용되어 다양한 조건을 설정할 수 있습니다. 

else if라고 적어도 되고, elseif라고 적어도 됩니다.

if (조건식1) {
    조건식1의 결과가 참일 때 실행하고자 하는 명령문;
}
else if (조건식2) {
    조건식2의 결과가 참일 때 실행하고자 하는 명령문;
}
else {
    조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문;
}

2.1.4. switch문

switch문은 if-else문과 마찬가지로 주어진 조건 값에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문입니다.

switch문은 if-else문보다 가독성 측면에서 더 좋습니다.

참고로 case절의 값은 일치 연산자(===)가 아닌 동등 연산자(==)를 사용하여 느슨하게 비교합니다.

그리고 어떠한 case 절에도 해당하지 않을 경우 default 절이 실행됩니다.

각 case절 및 default 절은 반드시 break 키워드를 포함하고 있어야 합니다. (switch 탈출을 위해!)

switch (조건 값)
{
    case 값1:
        조건 값이 값1일 때 실행하고자 하는 명령문;
        break;
    case 값2:
        조건 값이 값2일 때 실행하고자 하는 명령문;
        break;
    ...
    default:
        해당 case가 없을 때 실행하고자 하는 명령문;
        break;
}

2.2. 반복문

반복문이란 프로그램 내에서 같은 명령을 일정 횟수만큼 반복하여 수행하는 명령문입니다.

2.2.1. while문

while문은 조건식이 참(true)인 경우에만 내부의 명령문을 실행합니다.

while (조건식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}

2.2.2. do-while문

do-while문은 먼저 명령문을 한 번 실행한 후 조건식을 검사하며,

조건식이 참(true)인 경우 명령문을 다시 실행합니다.

즉, 조건식 결과와 상관없이 무조건 한 번은 명령문을 실행합니다

do {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while (조건식);

2.2.3. for문

for (초기식; 조건식; 증감식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
}

2.3.4. foreach문

foreach문은 배열의 모든 요소를 손쉽게 순회할 수 있도록 해줍니다.

이 반복문은 루프마다 배열의 각 요소를 지정된 변수에 대입합니다.

이렇게 대입받은 변수를 이용하면 루프 안에서 배열의 각 요소에 순차적으로 접근할 수 있습니다.

따라서 foreach문은 배열의 길이만큼 반복됩니다.

foreach (배열 as 값을 저장할 변수) {
    실행하고자 하는 명령문;
}

2.3. 기타 제어문

일반적으로 조건식 검사를 통해 루프로 진입하면, 다음 조건식을 검사하기 전까지 루프 안의 모든 명령문을 실행합니다.

이러한 일반적인 루프 흐름을 continue문과 break문을 통해 직접 제어할 수 있습니다.

2.3.1. continue문

continue문은 루프 내에서 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어갑니다.

보통 반복문 내에서 특정 조건에 대한 처리를 제외하고자 할 때 사용됩니다.

<?php
$var = 2;
for ($i = 0; $i < 10; $i++) {
    if ($i % 2 == 0) // 짝수 제외
        continue;
    echo "{$i}<br />";
}
?>

결과는 다음과 같습니다.

2.3.2. break문

break문은 루프 내에서 해당 반복문을 완전히 종료시키고, 반복문 다음에 위치한 명령문으로 이동시킵니다.

<?php
$var = 2;
$i = 0;
$sum = 0;
while (true) {
    if ($i == $var)
        break;
    $sum += $i;
    $i++;
}
echo $sum;
?>

위의 코드를 보면 $i가 $var와 동일 해지는 순간 반복문이 끝나기 때문에 $sum의 값은 1이 될 수밖에 없는 구조입니다.

실행 결과를 보면, 1이 출력되는 것을 확인할 수 있습니다.

2.3.3. goto문

goto문은 프로그램의 흐름을 지정된 레이블로 무조건 변경하는 명령문입니다.

goto는 다른 제어문과 다르게 아무 조건 없이 제어를 옮겨주기 때문에, 프로그램 흐름을 매우 복잡하게 만들 수도 있습니다. 이러한 단점으로 인해 현재는 거의 사용하지 않습니다. (그래서 사용법을 쓰지 않았어요!)

 

 


🔗Reference

 

블로그의 정보

개발하는 두부

뚜부니

활동하기