프로그램이 실행 중 오작동 하거나 비정상적으로 종료하게 하는 원인을 프로그램 에러, 오류 라고한다.
에러는 발생 시점에 따라 컴파일 에러, 런타임 에러로 나눌 수 있다.
이외에도 논리적 에러가 있는데 컴파일도 잘되고 실행도 잘되는데 의도와 다르게 동작하는 것을 의미한다.
컴파일 에러: 컴파일 시에 발생하는 에러
런타임 에러: 실행 시에 발행하는 에러
논리적 에러: 실행은 되지만, 의도와 다르게 동작하는 것
컴파일 에러 ex) 보통 문법에러로 int i="this is error",int형에 String타입 넣는 경우
런타임 에러 ex) 특정 객체가 매개변수로 값을 받아왔는데 값이 Null 인경우
논리적 에러 ex) 창고의 재고가 음수가 되는 경우, 게임 프로그램에서 비행기가 총알을 맞아도 죽지 않은 경우
.java 파일을 -> .class 파일로 변환하는 과정을 컴파일이라는 것을 앞 포스팅글에서 정리했었다.
이 과정에서 컴파일러가 소스 코드의 오타, 잘못된 구문, 자료형 체크등을 다 해준 후 컴파일 오류 여부를 알려준다.
주목할 점은 컴파일 에러 없이 .class파일이 만들어 졌어도 프로그램 실행 시에 에러가 발생하지 않는 것은 아니다. 컴파일러가 실행도중에 발생할 수 있는 잠재적인 에러까지 검사할 수 없기 때문이다.
따라서 자바 프로그램 실행 중 많은 에러가 발생할 수 있고 런타임 에러가 발생할 수 있는 모든 경우의 수를 고려하여 대비하는 것이 좋다.
자바 프로그램 실행 시 발생할 수 있는 오류를 두가지로 구분할 수 있다.
에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
Error가 발생하면 프로그램의 비정상적인 종료는 막을 수 없지만,
Exception은 발생하더라도 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓으면 프로그램의 비정상적인 종료를 막을 수 있다.
Error ex) 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverFlow) 같이 복구할 수 없는 오류
Exception ex) 특정 객체가 매개변수로 값을 받아왔는데 값이 Null 인경우
자바에서는 런타임 및 컴파일시 발생할 수 있는 Error,Exception를 클래스로 정의 했다.
모든 클래스의 조상은 Object 이고 Error,Exception역시 Object의 자손 클래스다.
Exception 클래스는 아래 두가지로 세분화 된다.
Exception 자손 클래스(Checked), RuntimeException 클래스(Unchecked)
이 둘은 프로그램에 실수에 의한 것인가 아니면 외부에 외부에 영향 영항으로 발생한 것이냐에 따라 구분한다.
또한 Checked / Unchecked Exception의 가장 핵심적인 차이는 '반드시 예외 처리를 해야 하는가이다.
프로그래머 실수에 의해 프로그램 내부에서 발생할 수있는 예외, 런타임시 발생한다.
특징
예시)
사용자 실수와 같은 주로 외부 영향으로 발생할 수 있는 예외들 , 컴파일시 발생한다.
특징
예시)
글 초입에 에러 종류를 컴파일 에러, 런타임에러, 논리적 에러가 있다고 설명했었다.
이후 예외 종류를 Checked Exception과 Unchecked Exception로 나누었을 때 에러,예외를 너무 쪼개서 머리가 혼잡했었다. 그래서 총 정리하면 다음과 같다.
Checked Exception은 컴파일 예외클래스들을 가리키는 것이고, Unchecked Exception은 런타임 예외클래스들을 가리키는 것으로 보면 된다
그냥 컴파일 / 런타임 예외로 분류하면 되지, 또다시 Checked / Unchecked Exception으로 재분류 한 이유는 코드적 관점에서 예외 처리 동작을 필수 지정 유무에 따라 나뉘기 때문이다.
즉 Checked Exception는 반드시 예외처리를 해야하고, Unchecked Exception는 명시적으로 처리를 안해도 되었기 때문이다.
인파- 자바 에러(Error) 와 예외 클래스(Exception) 💯 이해하기
✨New Wisdom✨·- [Java] Exception에 대하여
남궁성-자바의 정석 P414~P435