PHP의 타입
PHP의 타입 (Types)
PHP 프로그램을 짜다 보면 값마다 '종류'가 있다는 걸 자연스럽게 느끼게 돼요. 그 값의 종류를 타입(type), 우리말로는 '형'이라고 해요. PHP는 겉보기에 타입을 신경 쓰지 않는 것처럼 보이지만, 사실 내부에서는 모든 값이 어떤 타입인지 항상 알고 있어요. 이번 문서에서는 PHP가 다루는 타입에는 어떤 것들이 있는지, 또 타입이 왜 중요한지를 하나씩 살펴볼게요.
출처: PHP 매뉴얼
본문
값마다 타입이 있고, 실행 중에 정해져요
PHP에 있는 모든 표현식(expression)은 각자의 값에 따라 다음의 내장 타입(built-in type) 중 하나를 갖습니다.
nullboolintfloat(부동소수점 수)stringarrayobjectcallableresource
PHP는 동적 타입(dynamically typed) 언어라서, 기본적으로 변수의 타입을 미리 지정할 필요가 없어요. 타입이 실행 시점(runtime)에 결정되거든요. 다만 **타입 선언(type declarations)**을 쓰면 언어의 일부 측면을 정적으로 지정하는 것도 가능해요. PHP 타입 시스템이 지원하는 더 다양한 타입은 'Type System' 페이지에서 확인할 수 있어요.
타입은 곧 그 값으로 할 수 있는 연산의 종류를 제한해요. 만약 어떤 표현식이나 변수를 자기 타입이 지원하지 않는 연산에 사용하면, PHP는 그 값을 연산을 지원하는 타입으로 타입 저글링(type juggling) 하려고 시도해요. 이 과정은 값이 쓰인 문맥(context)에 따라 달라지고, 자세한 내용은 'Type Juggling' 섹션에서 다룬답니다.
팁 — 서로 다른 타입의 값을 비교한 다양한 예시가 정리된 '타입 비교표(type comparison tables)'도 유용하니 참고하면 좋아요.
참고 — **타입 캐스트(type cast)**를 쓰면 표현식을 특정 타입으로 강제로 평가시킬 수 있어요. 변수는
settype()함수로 제자리에서 타입을 바꿀 수도 있구요.
표현식의 값과 타입을 함께 확인하려면 var_dump() 함수를 쓰고, 표현식의 타입만 가져오려면 get_debug_type() 함수를 써요. 특정 타입인지 딱 확인하고 싶을 땐 is_int()처럼 is_* 계열의 타입 확인 함수를 사용합니다.
예제 #1 서로 다른 타입 (Different Types)
<?php
$a_bool = true; // a bool
$a_str = "foo"; // a string
$a_str2 = 'foo'; // a string
$an_int = 12; // an int
echo get_debug_type($a_bool), "\n";
echo get_debug_type($a_str), "\n";
// If this is an integer, increment it by four
if (is_int($an_int)) {
$an_int += 4;
}
var_dump($an_int);
// If $a_bool is a string, print it out
if (is_string($a_bool)) {
echo "String: $a_bool";
}
?>
PHP 8에서 위 예시를 실행한 출력:
bool
string
int(16)
참고 — PHP 8.0.0 이전에는
get_debug_type()이 없어서gettype()함수를 대신 쓸 수 있어요. 다만gettype()은 표준(canonical) 타입 이름을 사용하지 않는다는 점만 유의하세요.
PHP 매뉴얼의 Types 챕터가 다루는 범위
language.types.php 페이지는 이 챕터의 목차 역할을 하는데요, PHP의 타입 세계는 아래 항목들로 짜여 있어요.
- Introduction (소개)
- Type System (타입 시스템)
- NULL
- Booleans (불리언)
- Integers (정수)
- Floating-point numbers (부동소수점 수)
- Strings (문자열)
- Numeric strings (숫자 문자열)
- Arrays (배열)
- Objects (객체)
- Enumerations (열거형)
- Resources (리소스)
- Callables (호출 가능한 것)
- Mixed
- Void
- Never
- Relative class types (상대 클래스 타입)
- Singleton types (싱글턴 타입)
- Iterables (반복 가능한 것)
- Type declarations (타입 선언)
- Type Juggling (타입 저글링)
⚠️ 타입에 대한 보충 설명
⚠️ 아래 내용은
language.types.php페이지가 목차만 제공하는 관계로, Wikipedia의 PHP 문서(Data types)에서 보충한 항목이에요. 정확한 최신 동작은 각 타입의 개별 매뉴얼 페이지를 기준으로 삼는 게 좋아요.
PHP는 느슨한 타입(loosely typed) 언어예요. 정수는 플랫폼에 따라 32·64·128비트 부호 있는 정수로 저장되며, C 언어의 long 타입에 대응돼요. 부호 없는 정수는 특정 상황에서 부호 있는 값으로 변환되는데, 이는 다른 많은 언어와는 다른 동작이에요. 정수 변수는 십진수(양수·음수), 8진수, 16진수, 2진수 표기로 할당할 수 있어요.
부동소수점 수도 플랫폼 특정 범위로 저장돼요. 부동소수점 표기 또는 두 가지 형태의 과학적 표기로 지정할 수 있구요.
PHP는 Java·C++의 원시 부울 타입과 비슷한 네이티브 Boolean 타입을 가져요. Boolean 타입 변환 규칙에 따라 0이 아닌 값은 true, 0은 false로 해석돼요(Perl, C++와 같은 방식).
null 데이터 타입은 값이 없는 변수를 나타내며, 이 타입이 허용하는 유일한 값이 NULL이에요.
resource 타입 변수는 외부 소스로부터의 참조를 나타내요. 특정 확장(extension)의 함수로 만들어지고, 같은 확장의 함수로만 처리할 수 있어요. 파일·이미지·데이터베이스 리소스가 대표적인 예시예요.
**배열(array)**은 PHP가 다룰 수 있는 모든 타입의 요소를 담을 수 있어요. resource, object, 심지어 다른 배열까지 포함하죠. 값의 목록과 키-값 해시 모두에서 순서가 유지되며, 두 형태를 섞어 쓸 수도 있어요.