0은 a라고? IF문 주의사항 (동등비교/일치비교)

항해자·2023년 3월 26일
0

PHP

목록 보기
1/3

아래와 같은 조건문이 있다고 가정해 봅시다.

//변수 $data에 0을 대입한다.
$data = 0;

if ($data == 'a') {
	//$data가 문자 a라면 : 
	echo $data.' 은 a입니다.';
} else {
	//$data가 문자 a가 아니라면 :
	echo $data.' 은 a가 아닙니다.';
}

조건문의 기본만 알아도 어떤 내용이 화면이 뿌려질지 충분히 예상되는 간단한 분기 처리입니다.

하지만 위와 같은 코드는 전혀 예상밖에 결과를 초래하게되는데,

바로 0 은 a입니다 가 출력되게 됩니다.


그 이유가 무엇일까요? 그리고 어떻게 해결할 수 있을까요?

우선 PHP에선 비교연산자== 를 사용하여 문자타입과 숫자타입의 데이터를 비교할 때,
자동으로 데이터의 형변환(casting, type conversion)을 시도하게 됩니다.

즉 위의 예시와 같이 비교하려는 값이 서로 다른 데이터 유형인 경우 PHP는 값을 동등한 데이터 유형으로 변환하여 비교하게 되면서 아래과 같은 처리가 이루어집니다.

  1. $data와 'a'는 데이터 타입이 다름.
  2. 문자형 데이터인 'a'를 숫자형데이터로 형변환 시도 : (int)'a'
  3. 이때, 'a'가 숫자 0으로 변환됨.

결국 최종적으로 조건은 0 == 0으로 변경되면서 true를 리턴하게되고

이에따라 '0 은 a입니다. 라는 echo문이 실행되게 됩니다.

결국 작성자가 예상하지 못한 조건 결과가 나타나게 되는거고 만약 실제 서비스환경이었다면 매우 치명적인 결과를 가져올 수 있게될것입니다.


이와같은 오류를 피하기위한 방법은 무엇일까요?

바로 ==와 같은 '동등비교연산자'가 아닌, ===와 같은 '일치비교연산자'를 사용하면 됩니다.
동등비교 연산자는 비교값의 형변환을 실행하기 때문에 위와 같은 의도치않은 결과를 실행하게 되지만 비교값 간의 데이터형까지 비교하는 '일치비교연산자'를 사용한다면 자동형변환을 일으키지 않기 때문에 사용자가 예측한 올바른 결과를 얻게 됩니다.

즉 데이터 비교할땐 꼭 ===나 !==같은 일치비교 연산자를 사용해주세요.

var_dump(1 == '1');
//동등비교연산자 사용시, 두개의 데이터형이 다르므로 자동형변환을 적용한 후 값을 비교하므로 true리턴

var_dump(1 === '1');
//일치비교연산자 사용시, 두개의 값 모두 1이지만 데이터형이 숫자와 문자이므로 false리턴

profile
웹개발자

0개의 댓글