Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 타입 저글링(Type Juggling) 완벽 이해하기

정의 및 개념

PHP는 동적 타입(dynamic typed) 언어로 알려져 있습니다. C, C++, Java와 달리 PHP에서는 변수의 타입을 명시적으로 선언할 필요가 없으며, 애초에 타입 선언 자체가 지원되지 않습니다. PHP에서 변수의 타입은 변수에 할당된 값에 의해 결정되며, 그 반대가 아닙니다. 또한 이미 존재하는 변수에 다른 타입의 값이 새로 할당되면, 변수의 타입도 해당 값에 맞게 자동으로 변경됩니다.

이처럼 PHP가 변수의 타입을 값에 따라 유동적으로 처리하는 방식을 타입 저글링(Type Juggling)이라고 부릅니다.

$var = "Hello"; // 변수는 문자열(string) 타입입니다
$var = 100;     // 같은 변수가 이제 정수(int) 타입이 됩니다

표현식 평가 시 자동 형변환

타입 저글링은 단순히 변수에 값을 대입할 때뿐만 아니라, 표현식을 계산하는 과정에서도 발생합니다. 아래 예제에서 숫자로 구성된 문자열 변수는 덧셈 연산을 수행하기 위해 자동으로 정수로 변환됩니다.

예제

<?php
$var1 = 100;
$var2 = "100";
$var3 = $var1 + $var2;
var_dump($var3);
?>

출력 결과

int(200)

위 코드에서 문자열 "100"은 산술 연산 시점에 자동으로 정수 100으로 변환되어, 최종 결과는 정수형 200이 됩니다.

숫자로 시작하는 문자열의 처리

문자열이 숫자로 시작한다면, 산술 연산 수행 시 뒤따르는 비숫자(non-numeric) 문자들은 무시됩니다. 다만 이 경우 PHP 파서는 아래와 같이 Notice 경고를 발생시킵니다.

예제

<?php
$var1 = 100;
$var2 = "100 days";
$var3 = $var1 + $var2;
var_dump($var3);
?>

출력 결과

PHP Notice: A non well formed numeric value encountered in ...
int(200)

결과값은 여전히 int(200)이지만, 문자열 "100 days"가 완전한 숫자 형태가 아니기 때문에 경고 메시지가 함께 출력됩니다. 따라서 실무에서는 문자열과 숫자를 직접 연산하기보다 명시적인 형변환을 사용하는 것이 좋습니다.

타입 캐스팅(Type Casting)

타입 캐스팅은 변수를 특정 타입으로 강제하여 사용하도록 하는 기능입니다. PHP에서는 변수 앞에 괄호로 감싼 타입명을 붙여 캐스팅합니다. 다음 스크립트는 다양한 타입 캐스트 연산자의 사용 예를 보여줍니다.

예제

<?php
$var1 = 100;
$var2 = (boolean)$var1;
$var3 = (string)$var1;
$var4 = (array)$var1;
$var5 = (object)$var1;
var_dump($var2, $var3, $var4, $var5);
?>

출력 결과

bool(true)
string(3) "100"
array(1) {
   [0]=>
   int(100)
}
object(stdClass)#1 (1) {
   ["scalar"]=>
   int(100)
}

각 캐스트 연산자의 동작을 정리하면 다음과 같습니다.

  • (boolean): 0이 아닌 값은 true로 변환됩니다.
  • (string): 숫자가 문자열 "100"으로 변환됩니다.
  • (array): 스칼라 값은 첫 번째 요소가 해당 값인 배열이 됩니다.
  • (object): 스칼라 값은 scalar라는 속성을 가진 stdClass 객체가 됩니다.

큰따옴표를 이용한 문자열 변환

변수를 문자열로 캐스팅하는 또 다른 방법은, 해당 변수를 큰따옴표로 묶인 문자열 안에 삽입하는 것입니다.

예제

<?php
$var1 = 100.50;
$var2 = (string)$var1;
$var3 = "$var1";
var_dump($var2, $var3);
?>

출력 결과

string(5) "100.5"
string(5) "100.5"

두 방식 모두 동일하게 실수 100.50이 문자열 "100.5"로 변환된 것을 확인할 수 있습니다.

타입 저글링 사용 시 주의사항

타입 저글링은 편리하지만, 의도하지 않은 버그의 원인이 될 수 있습니다. 특히 값 비교 시에는 느슨한 비교 연산자 == 대신 타입까지 엄격하게 비교하는 === 연산자를 사용하는 것이 권장됩니다. 예를 들어 0 == "abc"는 PHP 7까지 true로 평가되는 등 예상치 못한 결과를 낳을 수 있으므로, 조건문에서는 항상 엄격한 비교를 습관화하는 것이 좋습니다.