Checked Exception와 Unchecked Exception

이승주·2024년 3월 24일
0

자바

목록 보기
2/2

📌 프로그램 오류

프로그램이 실행 중 오작동 하거나 비정상적으로 종료하게 하는 원인을 프로그램 에러, 오류 라고한다.

에러는 발생 시점에 따라 컴파일 에러, 런타임 에러로 나눌 수 있다.
이외에도 논리적 에러가 있는데 컴파일도 잘되고 실행도 잘되는데 의도와 다르게 동작하는 것을 의미한다.

에러 종류

컴파일 에러: 컴파일 시에 발생하는 에러

런타임 에러: 실행 시에 발행하는 에러

논리적 에러: 실행은 되지만, 의도와 다르게 동작하는 것

컴파일 에러 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의 자손 클래스다.

Error,Exception 클래스

Exception 클래스 (세부)

Exception 클래스는 아래 두가지로 세분화 된다.
Exception 자손 클래스(Checked), RuntimeException 클래스(Unchecked)

이 둘은 프로그램에 실수에 의한 것인가 아니면 외부에 외부에 영향 영항으로 발생한 것이냐에 따라 구분한다.
또한 Checked / Unchecked  Exception의 가장 핵심적인 차이는 '반드시 예외 처리를 해야 하는가이다.


RuntimeException (Unchecked Exception)

프로그래머 실수에 의해 프로그램 내부에서 발생할 수있는 예외, 런타임시 발생한다.

특징

  • 어떤 상황에서 발생되는지 예측할 수 없기에, 어떻게 복구해야할지 전혀 알 수 없다.
  • 그래서 로그를 되게 잘 남겨야한다. 그게 Unchecked Exception 처리의 가장 근본, 원칙
  • 명시적으로 에러 처리하지 않아도 됨
  • 따라서 에러를 일부러 일으키는 코드가 있더라도 try - catch 처리하지 않더라도 컴파일도 되고 실행까지 가능함

예시)

  • Arrayindexoutofboundsexception: 배열의 범위를 벗어남
  • Nullpointerexception: 실제 값이 아닌 null을 가지고 있는 객체/변수를 호출할 때 발생
  • Arithmeticexception: 정수를 0으로 나눌 때

Exception 자손 클래스(Checked Exception)

사용자 실수와 같은 주로 외부 영향으로 발생할 수 있는 예외들 , 컴파일시 발생한다.

특징

  • 충분히 예상가능한 에러이기에, 콕 집어 복구가 꼭 필요한 예외
  • Checked Exception예외는 처리 안 하면 IDE에서 빨간색 라인이 생기면서 컴파일 자체가 안됨
  • 따라서 Checked Exception는 반드시 예외 처리를 해줘야함

예시)

  • IOException : 휴먼은 충분히 이상한걸 입력할 수 있다.
  • FileNotFoundException: 존재하지 않는 파일의 이름을 입력
  • SQLException : 데이터베이스 접속은 충분히 갑자기 끊길 수 있다.

📌 헷갈렸던 개념

글 초입에 에러 종류를 컴파일 에러, 런타임에러, 논리적 에러가 있다고 설명했었다.
이후 예외 종류를 Checked Exception과 Unchecked Exception로 나누었을 때 에러,예외를 너무 쪼개서 머리가 혼잡했었다. 그래서 총 정리하면 다음과 같다.

Checked Exception은 컴파일 예외클래스들을 가리키는 것이고, Unchecked Exception은 런타임 예외클래스들을 가리키는 것으로 보면 된다

그냥 컴파일 / 런타임 예외로 분류하면 되지, 또다시 Checked / Unchecked Exception으로 재분류 한 이유는 코드적 관점에서 예외 처리 동작을 필수 지정 유무에 따라 나뉘기 때문이다.

즉 Checked Exception는 반드시 예외처리를 해야하고, Unchecked Exception는 명시적으로 처리를 안해도 되었기 때문이다.


참고자료

인파- 자바 에러(Error) 와 예외 클래스(Exception) 💯 이해하기

✨New Wisdom✨·- [Java] Exception에 대하여

남궁성-자바의 정석 P414~P435

profile
반복되는 실수를 기록을 통해 줄여가보자!

0개의 댓글

관련 채용 정보