Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 0으로 나누면? 무한대가 아닌 DivideByZeroException 예외 발생

C#에서 정수를 0으로 나누면 무한대(Infinity)가 반환되는 것이 아니라 System.DivideByZeroException 예외가 발생합니다. 이 예외 클래스는 피제수를 0으로 나누려 할 때 생기는 오류를 처리하는 전용 클래스입니다.

다음 예제를 통해 실제 동작 방식을 살펴보겠습니다.

예제

using System;
namespace ErrorHandlingApplication {
    class DivNumbers {
        int result;

        DivNumbers() {
            result = 0;
        }

        public void division(int num1, int num2) {
            try {
                result = num1 / num2;
            } catch (DivideByZeroException e) {
                Console.WriteLine("Exception caught: {0}", e);
            } finally {
                Console.WriteLine("Result: {0}", result);
            }
        }

        static void Main(string[] args) {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}

출력 결과

Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ErrorHandlingApplication.DivNumbers.division (System.Int32 num1, System.Int32 num2) [0x00000] in <a9b37148b4814c1a849bf4ee94fbe889> :0
Result: 0

위 코드에서 나눗셈 연산은 다음과 같이 num1을 num2로 나누는 형태로 수행됩니다.

result = num1 / num2;

여기서 num2 값이 0으로 설정되면, try-catch 블록으로 예외 처리를 미리 해두었기 때문에 프로그램이 비정상 종료되지 않고 DivideByZeroException이 catch 블록에서 안전하게 잡힙니다. finally 블록은 예외 발생 여부와 관계없이 항상 실행되므로, 계산된 result 값을 화면에 출력하게 됩니다.

참고: 부동 소수점 나눗셈은 예외가 아닌 무한대 반환

흥미로운 점은 DivideByZeroException이 발생하는 경우는 정수형(int) 나눗셈뿐이라는 것입니다. double이나 float 같은 부동 소수점 타입에서 0으로 나누면 예외가 발생하지 않고, 대신 양의 무한대(PositiveInfinity), 음의 무한대(NegativeInfinity), 또는 NaN(Not a Number)이 반환됩니다.

double a = 10.0 / 0.0;  // Infinity (양의 무한대)
double b = -10.0 / 0.0; // -Infinity (음의 무한대)
double c = 0.0 / 0.0;   // NaN (숫자가 아님)

따라서 제목의 질문에 대한 답은 "정수 나눗셈에서는 예외가, 부동 소수점 나눗셈에서는 무한대가 반환된다"입니다. 안정적인 프로그램을 작성하려면 정수 나눗셈 시 반드시 제수(divisor)가 0인지 검사하거나 try-catch로 예외를 처리하는 습관을 들이는 것이 좋습니다.