정답은 아니요입니다. 그 이유는 0123이 단순히 숫자 앞에 0이 붙은 값이 아니라, 8진수(octal) 표기법으로 해석되기 때문입니다. 8진수 0123을 10진수로 변환하면 83이 됩니다.
0으로 시작하는 숫자의 의미
PHP에서 숫자 앞에 0을 붙이면 해당 숫자는 8진수(base 8)로 간주됩니다. 이는 숫자 앞에 0x를 붙이면 16진수(base 16)로 해석되는 것과 같은 원리입니다.
다음 코드를 통해 직접 확인해 보겠습니다.
예제 1: 10진수와 8진수 비교
var_dump(123); var_dump(0123);
출력 결과
int(123) int(83)
위 출력 결과를 보면 123은 일반적인 10진수 정수로 처리되지만, 0123은 맨 앞의 0 때문에 8진수 표기법으로 인식되어 83이라는 값이 됩니다. 따라서 두 값은 서로 다른 숫자입니다.
8진수에서 유효하지 않은 숫자가 있으면?
흥미로운 점은 8진수에 사용할 수 없는 숫자(8 또는 9)가 포함된 경우입니다. 다음 예제를 살펴보겠습니다.
예제 2: 유효하지 않은 8진수
var_dump(79); var_dump(079);
출력 결과
int(79) int(7)
079는 8진수에서 존재할 수 없는 숫자인 9를 포함하고 있습니다. PHP는 유효한 부분까지만 해석하기 때문에 9 앞에서 파싱을 중단하고, 결과적으로 07, 즉 7이라는 값을 반환합니다.
정리
PHP에서 정수 리터럴을 다룰 때는 다음 사항을 기억하는 것이 중요합니다.
- 숫자 앞에
0이 붙으면 8진수로 해석됩니다. - 숫자 앞에
0x가 붙으면 16진수로 해석됩니다. - 따라서
123과0123은 전혀 다른 값(123 vs 83)입니다. - 8진수에 유효하지 않은 숫자(8, 9)가 포함되면 예상치 못한 결과가 나올 수 있습니다.
실무에서 의도치 않은 버그를 방지하려면 숫자 앞에 불필요하게 0을 붙이지 않도록 주의해야 합니다.