프로그램 오류(Error)

프로그램이 어떤 상황에서 예기치 못한 상황이나 원인에 의해 오작동하거나 비정상적으로 종료되는 경우를 프로그램 에러 또는 오류라고 합니다.
오류는 크게 세 가지로 분류가 가능합니다.

1. 컴파일 에러 - 소스코드의 잘못된 문법 구문이나 오타, 잘못된 자료형 사용 등에 의해 컴파일 시점에 발생하는 에러로 자바를 예로 들자면 .java 소스파일을 .class파일로 컴파일 하는 과정에서 발생되는 에러라고 볼 수 있습니다.

2. 런타임 에러 - 컴파일이 제대로 된 이후 프로그램이 실행 중 발생하는 에러로 자바를 예로 들면 사용자가 이름을 입력하지 않았는데 그 값을 문자열 연산을 한다든가 할 때 발생하는 NullPointerException 같은 경우를 들 수 있습니다.

3. 논리적 에러 - 소스코드 레벨에서 발생하는 에러가 아닌 컴파일과 프로그램 실행상에도 문제가 없지만 개발자가 의도한 것과 다르게 동작하는 경우를 말합니다. 예를 들어 반복분이 30회 돌아갈 것을 예상하고 개발한 반복문이 실수로 계산을 잘못하여 20회만 돌아가는 경우 입니다.


자바에서의 오류
자바에서는 오류를 클래스로 관리하며 분류에 따라 크게 에러(Error)와 예외(Exception)로 나뉘고 예외는 또다시 그냥 예외(Exception)와 실행예외(Runtime Exception)로 나뉘게 됩니다.
에러와 예외 모두 Throwable을 상속 받습니다.
실행 예외 또한 Exception 클래스를 상속 받지만 특성의 차이에 따라 일반 예외와 구분지어 부르기 때문에 자바에서의 오류는 에러, 예외, 런타임 예외 이렇게 세 가지로 구분합니다.

 

 

 

1.에러(Error) - 프로그램 레벨에서 대비할 수 없거나 복구 불가능한 치명적인 오류를 말합니다.
java.lang.Error 클래스와 그 Error 클래스를 상속받은 서브 클래스들을 말하며 주로 JVM이 발생시킵니다.
에러는 JVM의 메모리가 꽉 차서 발생하는 OOM(Out Of MemoryError) 이나 스레드가 죽어서 발생하는 ThreadDeath 에러같이 try catch로 잡아도 대응할 수 없기 때문에 코드 레벨에서 처리가 불가능 합니다.

예외(Exception)
오류가 발생했지만 대처 가능한 경우를 말하며 Exception 클래스 및 Exception 클래스의 하위 클래스를 말합니다.
예외의 경우는 또 다시 다음과 같이 일반 예외 실행예외로 나뉩니다.

 

 

2. 단순 예외(컴파일시 체크)
특히 자바에서 단순히 '예외' 라고 하면 Exception 클래스를 상속 받으면서 RuntimeException 이 아닌 경우를 말합니다.
굳이 헷갈리게 나눈 이유는 예외의 특성에 따라 나눈 것인데, 해당 예외들은 주로 문법적인 오류, 데이터 베이스 서버에 연결 시 이상이 있거나 네트워크 연결이 이상해서 발생하는 SQLException, 컴파일 시 필요한 클래스 파일을 찾지 못해 발생하는 ClassNotFoundException과 같이 반드시 처리해주어야 하는 예외들 입니다.
컴파일 시 예외 체크를 하기 때문에 예외 처리를 하지 않을 경우 컴파일이 되지 않으며, 컴파일 시 체크한다고 해서 Checked Exception 이라고도 불립니다.


3. 실행 예외(Runtime Exception) - 실행예외는 Exception의 서브 클래스 중 RuntimeException을 상속 받는 예외입니다.
RuntimeException을 상속받는 예외들은 컴파일 시 체크하지 않기 때문에 Unchecked Exception이라고 하며 컴파일 시 발생하지 않고 프로그램 실행중(Runtime)에 발생하는 예외입니다.
이러한 예외들은 Checked 예외처럼 필수로 예외 처리를 강제하지 않는데, 이유는 if문같은 조건절이나 Validation(유효성 검증) 코드를 통해 충분히 피할 수 있기 때문입니다.
예를들어 null값을 참조하여 발생하는 NullPointerException 의 경우 if(value != null) 과 같은 처리로 방어할 수 있으며 개발자의 부주의가 아니라면 충분히 회피할 수 있기 때문에 예외 처리를 강제하지 않는 것입니다.
주의할 점은 예외처리를 강제하지 않기 때문에 개발자가 특별한 조치를 취하지 않았을 때 프래그램 실행 도중 실행예외가 발생하면 프로그램은 속수무책으로 종료 돼버린다는 점 입니다.


예외 발생 시
예외가 발생하면 JVM에서는 현재 실행중인 흐름을 멈추고 발생한 예외에 따른 예외 객체를 생성한 후 던지게 됩니다.
이 던져진 예외를 개발자는 그 예외에 맞게 처리하면 되며, 만약 의도적으로나 실수로 적절한 예외처리를 하지 않는 경우에는 프로그램은 비정상적으로 종료되며, 처리되지 못한 예외는 최종적으로 JVM의 예외처리기가 받아 예외 정보를 출력하게 됩니다.

 

 

참고글

[JAVA] 예외의 종류

 

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,