개발/Trouble Shooting

0으로 나눌 수 없습니다! ArithmeticException 완벽 가이드

ophelisis 2025. 12. 29. 10:15
반응형

1. ❓ ArithmeticException이란 무엇인가요?

ArithmeticException은 산술 연산 과정에서 예외적인 조건이 발생했을 때 던져지는 언체크드 예외(Unchecked Exception)입니다.

가장 대표적인 사례는 정수를 0으로 나누려고 할 때(/ 0) 발생합니다. 수학적으로 정의되지 않은 연산을 시도하면 JVM은 프로그램을 중단시키는 대신 이 예외를 발생시켜 우리에게 알려줍니다.


2. 🔍 왜 발생하나요? (주요 발생 사례)

✅ 1. 정수를 0으로 나누는 경우 (가장 흔함)

Java
 
int a = 10;
int b = 0;
int result = a / b; // 여기서 ArithmeticException: / by zero 발생!

✅ 2. 정수를 0으로 나머지 연산하는 경우

Java
 
int result = 10 % 0; // 이 경우에도 동일하게 발생합니다.

✅ 3. BigDecimal 연산 시 무한 소수 발생

BigDecimal을 사용하여 나눗셈을 할 때, 결과가 무한 소수(예: 1/3)인데 소수점 처리 방식(Rounding mode)을 지정하지 않으면 발생합니다.


3. 🛡️ 예외를 방지하는 실전 팁

1️⃣ 나누기 전 0인지 확인하기

가장 기본적이면서 확실한 방법입니다. 분모가 0이 될 수 있는 변수라면 사전에 조건문으로 체크합니다.

Java
 
if (b != 0) {
    int result = a / b;
} else {
    System.out.println("0으로 나눌 수 없습니다.");
}

2️⃣ 실수(Floating Point) 연산 활용

신기하게도 자바에서 **실수(double, float)**를 0으로 나누면 예외가 발생하지 않고 Infinity(무한대)나 NaN(Not a Number)을 반환합니다. 정확한 예외 처리가 필요 없다면 타입을 변경하는 것도 방법입니다.

Java
 
double result = 10.0 / 0.0; // 결과: Infinity (예외 발생 안 함)

3️⃣ BigDecimal 사용 시 Scale 지정

금융권 등 정밀한 계산이 필요한 곳에서는 반드시 반올림 정책을 명시해야 합니다.

Java
 
BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("3");
// 소수점 2자리까지 반올림하여 계산
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); 

💡 시니어의 조언: 예외는 '방어'보다 '예방'입니다

ArithmeticException은 런타임 예외이기 때문에 컴파일러가 잡아주지 않습니다. 특히 사용자로부터 입력받은 값을 계산기에 사용하거나, 통계 로직에서 데이터 건수(N)로 평균을 낼 때 데이터가 0건이면 이 에러가 튀어나오기 쉽습니다.

언제나 **"분모가 0이 될 가능성이 있는가?"**를 먼저 자문해 보세요. 예외 처리(try-catch)로 감싸는 것보다, 데이터의 유효성을 먼저 검증(if (n > 0))하는 것이 훨씬 깔끔하고 성능상 이점이 많은 '클린 코드'의 지름길입니다.

반응형