일단, 프로그램에서 발생하는 오류에 대해 구분할 필요가 있습니다.
프로그램을 구현하기 위해 코드 작성 중 발생하는 문법적 오류를 컴파일 에러라고 합니다. 이 컴파일 에러는 개발자 대부분 IDE를 사용하고 있기 때문에 자동으로 탐지가 됩니다.
그리고 실행 중인 프로그램이 의도 하지 않은 동작을 하거나 프로그램이 중지 되는 오류를 런타임 에러라고 합니다. 이 런타임 에러같은 경우는 비정상적으로 종료될 수 있기 때문에 시스템의 심각한 장애를 발생할 수 있습니다.
프로그램의 비정상적인 종료를 방지하고 시스템의 원활한 실행이 되도록 예외 처리를 해줘야 할 필요가 있습니다. 또한 실행 오류가 발생한 경우 오류의 과정을 재현하는 것은 현실적으로 힘들기 때문에 오류가 발생한 경우 log를 남겨서 추후 log 분석을 통해 그 원인을 파악하여 에러를 수정하는 것이 중요합니다.
그래서 예외라는 것은 무엇일까요?
위에서 설명했듯이 실행 시간에 발생할 수 있는 에러를 뜻하며, 개발자들이 처리할 수 있는 에러를 의미합니다.
여기서 시스템 오류는 가상 머신에서 발생하며 프로그래머가 처리 할 수 없는 오류입니다.
자바에서는 예외를 하나의 객체로 취급합니다.
즉, 모든 예외는 자료형이 Throwable 클래스 또는 그 서브 클래스들 중에 하나로부터 확장된 클래스의 객체입니다.
Throwable 하위에는 Error와 Exception 클래스가 서브 클래스로 존재합니다.
일반적으로 Throwable의 서브 클래스인 Exception을 확장하여 새로운 예외 클래스를 만들어서 사용합니다.
Error 클래스는 정상적인 응용 프로그램에서는 수용할 수 없는 심각한 에러를 나타냅니다. 이러한 에러는 개발자들이 처리할 필요가 없고, 애초에 처리될 수도 없는 에러입니다.
반면에, Exception 클래스는 정상적인 응용 프로그램의 실행에서 발생 가능한 예외를 의미하며, 개발자들이 처리할 수 있습니다.
Exception의 서브 클래스에는 입출력 예외 처리에 관한 IOException
과 RuntimeException
등등 존재하며, RuntimeException
은 프로그램이 정상적으로 실행되는 동안 발생할 수 있는 예외로 다음과 같은 예외가 있습니다.
ArithmeticException : 정수를 0 으로 나눈 경우 발생합니다.
ArrayIndexOutOfBoundsException : 배열의 크기를 넘어선 위치를 참조하려는 경우에 발생합니다.
NegativeArraySizeException : 배열의 크기를 음수로 지정하였을 때 발생하는 경우에 발생합니다.
NullPointerException : null을 사용하여 객체를 참조할 때 발생하는 예외입니다.
이상으로 자바에서 의미하는 예외에 대해서 간단히 알아봤습니다.