ArithmeticError란 무엇인가?
ArithmeticError 클래스는 PHP에서 Error 클래스를 상속받는 오류 클래스입니다. 이름 그대로 수학적 연산을 수행하는 과정에서 발생할 수 있는 오류를 나타냅니다.
대표적인 발생 시나리오는 다음과 같습니다.
- 비트 시프트(bitwise shift) 연산에서 음수만큼 시프트를 시도할 때
- intdiv() 함수 호출 결과가 정수의 유효 범위를 벗어나는 값이 될 때
이러한 상황에서 PHP는 ArithmeticError를 던지며, 적절히 처리하지 않으면 프로그램이 비정상 종료될 수 있습니다.
예제 1: 음수 비트 시프트로 인한 ArithmeticError
다음 예제에서는 비트 시프트 연산자에 음수 피연산자를 사용하려고 시도합니다. 이 경우 ArithmeticError가 발생하며, try-catch 블록으로 이를 잡아 오류 메시지를 출력할 수 있습니다.
<?php
try {
$a = 10;
$b = -3;
$result = $a << $b;
}
catch (ArithmeticError $e) {
echo $e->getMessage();
}
?>실행 결과
Bit shift by negative number
출력 결과에서 알 수 있듯이, "음수만큼 비트 시프트할 수 없다"는 의미의 오류 메시지가 반환됩니다. 비트 시프트 연산은 반드시 0 이상의 정수 값으로 수행해야 합니다.
예제 2: intdiv() 함수와 정수 범위 초과
intdiv() 함수는 정수 나눗셈을 수행하는 함수입니다. 그런데 PHP에서 허용되는 최솟값인 PHP_INT_MIN(64비트 환경 기준 -9223372036854775808)을 -1로 나누면, 결과값이 정수 표현 범위를 초과하게 됩니다. 이때도 ArithmeticError가 발생합니다.
<?php
try {
$a = PHP_INT_MIN;
$b = -1;
$result = intdiv($a, $b);
echo $result;
}
catch (ArithmeticError $e) {
echo $e->getMessage();
}
?>실행 결과
Division of PHP_INT_MIN by -1 is not an integer
오류 메시지는 "PHP_INT_MIN을 -1로 나눈 값은 정수가 아니다"라는 의미입니다. 수학적으로 PHP_INT_MIN ÷ (-1)은 PHP_INT_MAX보다 1 큰 값이 되어야 하지만, PHP의 정수형은 이 값을 표현할 수 없기 때문입니다.
정리 및 실무 팁
ArithmeticError는 컴파일 타임이 아닌 런타임에 발생하기 때문에, 사용자 입력값이나 외부 데이터를 다루는 코드에서는 반드시 방어적으로 작성해야 합니다.
- 비트 시프트 연산 전에는 시프트 양이 0 이상인지 검증하세요.
- intdiv()를 사용할 때는 피제수가 PHP_INT_MIN이고 제수가 -1인 조합을 사전에 확인하세요.
- try-catch 블록으로 ArithmeticError를 명시적으로 처리하면 프로그램의 안정성을 높일 수 있습니다.
이처럼 ArithmeticError의 발생 조건을 미리 이해하고 있으면, 디버깅 시간을 크게 줄이고 더 견고한 PHP 애플리케이션을 작성할 수 있습니다.