1. ❓ ArithmeticException이란 무엇인가요?
ArithmeticException은 산술 연산 과정에서 예외적인 조건이 발생했을 때 던져지는 언체크드 예외(Unchecked Exception)입니다.
가장 대표적인 사례는 정수를 0으로 나누려고 할 때(/ 0) 발생합니다. 수학적으로 정의되지 않은 연산을 시도하면 JVM은 프로그램을 중단시키는 대신 이 예외를 발생시켜 우리에게 알려줍니다.
2. 🔍 왜 발생하나요? (주요 발생 사례)
✅ 1. 정수를 0으로 나누는 경우 (가장 흔함)
int a = 10;
int b = 0;
int result = a / b; // 여기서 ArithmeticException: / by zero 발생!
✅ 2. 정수를 0으로 나머지 연산하는 경우
int result = 10 % 0; // 이 경우에도 동일하게 발생합니다.
✅ 3. BigDecimal 연산 시 무한 소수 발생
BigDecimal을 사용하여 나눗셈을 할 때, 결과가 무한 소수(예: 1/3)인데 소수점 처리 방식(Rounding mode)을 지정하지 않으면 발생합니다.
3. 🛡️ 예외를 방지하는 실전 팁
1️⃣ 나누기 전 0인지 확인하기
가장 기본적이면서 확실한 방법입니다. 분모가 0이 될 수 있는 변수라면 사전에 조건문으로 체크합니다.
if (b != 0) {
int result = a / b;
} else {
System.out.println("0으로 나눌 수 없습니다.");
}
2️⃣ 실수(Floating Point) 연산 활용
신기하게도 자바에서 **실수(double, float)**를 0으로 나누면 예외가 발생하지 않고 Infinity(무한대)나 NaN(Not a Number)을 반환합니다. 정확한 예외 처리가 필요 없다면 타입을 변경하는 것도 방법입니다.
double result = 10.0 / 0.0; // 결과: Infinity (예외 발생 안 함)
3️⃣ BigDecimal 사용 시 Scale 지정
금융권 등 정밀한 계산이 필요한 곳에서는 반드시 반올림 정책을 명시해야 합니다.
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))하는 것이 훨씬 깔끔하고 성능상 이점이 많은 '클린 코드'의 지름길입니다.
'개발 > Trouble Shooting' 카테고리의 다른 글
| 잘못된 인자 전달 금지: IllegalArgumentException 완벽 가이드 (0) | 2025.12.29 |
|---|---|
| 맞지 않는 옷을 입히지 마세요: ClassCastException 완벽 가이드 (0) | 2025.12.29 |
| 정해진 선을 넘지 마세요: ArrayIndexOutOfBoundsException 완벽 가이드 (0) | 2025.12.29 |
| 자바의 영원한 숙제: NullPointerException (NPE) 완벽 가이드 (0) | 2025.12.29 |
| 클래스가 어디로 사라졌을까? ClassNotFoundException 완벽 가이드 (0) | 2025.12.29 |