본문 바로가기
백엔드(Back-End)/Java

[Java] - 자바의 Error와 Exception 이해하기

by TwoJun 2023. 11. 6.

[Programming Language] - Java

1. 프로그램의 오류

1-1. 오류가 발생했다는 것은 무슨 의미일까?

(1) 프로그램을 실행하다 보면 어떤 원인 때문에 프로그램이 비정상적인 동작을 일으켜 프로그램이 종료되는 것을 볼 수 있을 것이다. 이것을 프로그램이 실행 도중 오류가 발생했다고 말한다. 이러한 오류의 종류로는 크게 Error(에러)와 Exception(예외)가 존재한다.

 

(2) 우선 에러에 대해 알아보자.

 

 

 

 

 

2. Error

2-1. Error의 정의

(1) 위에서 에러에 대한 정의를 확인했다. 이러한 프로그램의 에러로는 크게 3가지 종류가 있다.

 

- 컴파일 에러(Compile Error) : 문법 오류 등 컴파일 타임에서 발생하는 에러

- 런타임 에러(Runtime Error) : 런타임(실행) 환경에서 발생하는 에러

- 논리적 에러(Logical Error) : 런타임까지 문제없지만, 런타임 과정에서 개발자가 의도했던 대로와 다르게 동작하는 에러

 

 

 

2-2. 컴파일 타임 에러(Compile-time Error)

(1) 컴파일 타임의 대표적인 예시로는 잘못된 문법으로 인한 문법(구문) 오류(Syntax Error)가 있다.

 

(2) 개발 시점에서 바로 확인할 수 있는 에러이기 때문에 크게 문제가 되지 않으며, 코드를 수정하는 등의 즉각적인 대처가 가능하다.

 

(3) 컴파일 타임 에러의 경우 작성한 코드 자체에 문제가 있기 때문에 클래스 파일 자체가 생성되지 않아 프로그램이 실행되지 않는다.

 

 

 

2-3. 런타임 에러(Runtime Error)

(1) 컴파일 타임에는 문제가 없어서 프로그램이 실행되었으나 실행 도중 비정상적인 에러가 발생하거나 또는 하드웨어와 같은 외부적인 요인으로도 프로그램이 비정상적으로 종료될 수 있는데 이를 실행 환경에서 발생한 런타임 에러라고 한다.

 

(2) 대부분 개발 시 설계 미숙으로 인해 발생하는 에러가 대부분이며 런타임 에러 발생 시 개발자가 직접 역추적해서 원인을 찾는 등의 작업이 필요하다.

 

(3) 이러한 잠재적인 런타임 에러를 방지하기 위해서 발생할 수 있는 경우의 수를 모두 계산해서 철저히 설계를 해야 한다.

 

 

 

2-4. 논리적 에러(Logical Error)

(1) 논리적 에러는 쉽게 버그라고 생각하면 된다. 프로그램이 실행되고 작동하는 데 전혀 문제가 없지만 특정 작업 수행 시 개발자가 예상했던 바와는 다르게 작동하거나 결과가 발생하는 에러를 말한다.

 

(2) 예를 들면 상품의 재고 수량이 0개 미만으로 떨어질 수 없는데 음수 재고가 발생했거나 게임 프로그램의 경우 캐릭터의 HP가 0이 되었는데도 캐릭터가 죽지 않는 에러 등을 예시로 들 수 있겠다.

 

(3) 이러한 논리 에러는 프로그램 입장에서는 프로그램이 정상적으로 동작하는 것이기 때문에 에러 메시지 등으로 전혀 알려주지 않는다.

 

(4) 이러한 런타임과 논리 에러는 프로그램 실행 도중에 발생하는 문제이기 때문에 심각한 에러로 구분된다. 직접적으로 개발자가 프로그램의 전반적인 흐름이나 로직 체크, 모든 경우의 수를 확실하게 계산해서 코드를 설계할 필요성이 있다.

 

 

 

 

 

3. 자바에서의 Error와 Exception

3-1. Error와 Exception의 차이점

(1) 자바에서는 실행 시 발생할 수 있는 오류를 두 가지로 구분했다. 바로 Error(에러)와 Exception(예외)이다.

 

(2) 에러(Error)는 프로그램 실행 도중에 발생하는 문제로, 수습될 수 없는 심각한 문제를 의미한다.

- 예를 들어 메모리 부족, 네트워크 연결 오류 등의 상황을 말한다.

- 에러가 발생하면 프로그램이 바로 종료되거나 시스템 레벨에서 처리되어야 한다.

 

(3) 예외(Exception)는 프로그램 실행 도중에 발생하는 문제로 에러보다 심각 수준은 낮고 수습 가능한 오류를 말한다.

- 예를 들어 사용자로부터 잘못된 값을 입력받았을 때, 배열의 범위를 초과했을 경우 등 다양한 상황을 말한다.

- 이러한 예외는 예외 처리(Exception Handling)를 통해 처리할 수 있고 이러한 예외 처리는 예외가 발생하더라도 프로그램의 정상적인 실행 흐름을 유지하기 위해 사용되는 방법이다.

 

 

 

3-2. 예외 처리(Exception Handling)

(1) 정의 

- 프로그램 실행 시 발생할 수 있는 예외 발생에 대비해 코드를 설계하는 작업을 말한다.

 

(2) 목적

- 프로그램의 비정상 종료를 방지하고 정상적인 실행 흐름을 유지하도록 하는 것이다.

 

 

 

 

 

4. Exception 클래스의 계층 구조

Exception의 계층 구조

 

(1) Exception, Error 클래스들은 모두 Throwable 클래스를 상속받는다. 이러한 Throwable 클래스는 이러한 예외들을 다룰 수 있는 최상위 클래스이다.

 

(2) 이러한 Exception 클래스는 다시 RuntimeException과 RuntimeException에 해당되지 않는 Exception으로 구분된다.

 

 

 

4-1. Exception 및 하위 클래스들

(1) 사용자의 실수와 같은 외적 요인에 의해 발생하는 예외이며, 대표적으로는 아래와 같은 예외가 있다.

 

(2) FileNotFoundException : 존재하지 않는 파일의 이름을 입력한 경우

 

(3) ClassNotFoundException : 클래스 이름 오기재 

 

(4) DataFormatException : 입력된 데이터의 형식이 잘못된 경우

 

 

 

4-2. RuntimeException 클래스들

(1) 개발자의 실수로 발생하는 예외를 말하며 아래와 같은 대표적인 예외들이 있다.

 

(2) IndexOutOfBoundException : 배열의 인덱스 범위를 벗어난 경우

 

(3) NullPointerException : 값이 null인 객체의 참조 변수를 호출한 경우

 

(4) ClassCastException : 클래스 간의 Type Casting이 잘못된 경우

 

(5) ArithmeticException : 정수를 0으로 나누는 등의 산술적 오류

 

예외 타입 설명
ArithmeticException 산술 연산 중 비정상적인 연산이 발생한 경우
NullPointerException 값이 null인 객체의 참조 변수를 호출한 경우
IllegalArgumentException 메서드의 전달 인자 값이 잘못된 경우 
IllegalStateException 특정 객체의 상태가 메서드 호출에는 부적합한 상태인 경우
IndexOutOfBoundException 인덱스 값이 지정된 범위를 넘어선 경우
UnsupportedOperationException 특정 객체가 메서드를 지원하지 않는 경우 
SecurityException 보안 정책 관련으로 위반이 발생한 경우
ProviderException 구성 공급자에서 오류가 발생한 경우
NoSuchElementException 구성 요소가 그 이상 존재하지 않는 경우
ArrayStoreException 객체 배열에 잘못된 객체 유형을 저장한 경우 
ClassCastException 클래스들 간의 타입 캐스팅이 잘못된 경우
EmptyStackException 빈 스택에서 요소를 제거하려고 하는 경우

 

 

 

 

 

5. Checked Exception & Unchecked Exception

Checked Exception & Unchecked Exception

 

(1) 자바의 예외는 다시 한 번 Checked Exception, Unchecked Exception으로 구분된다.

 

(2) Checked Exception의 경우 컴파일 예외 클래스를 가리키고 Unchecked Exception의 경우 RuntimeException의 예외들을 가리키는 것이다.

 

(3) Checked Exception, Unchecked Exception의 특징은 아래와 같다.

 

 

 

5-1. Checked Exception

(1) Exception handling을 강제하는 예외이다. 따라서 Checked Exception이 발생할 수 있는 메서드를 사용할 때는 반드시 Exception handling을 해 줘야 하며 그렇지 않을 경우 컴파일러가 에러를 발생시키게 된다.

 

(2) Exception의 하위 클래스 중  RuntimeException을 상속받지 않는 예외들을 가리킨다. 이러한 예외들은 반드시 개발자가 Exception handling을 해 줘야 한다.

 

(3) 대표적인 Checked Exception의 종류로는 IOException, SQLException 등이 있다.

 

 

 

5-2. Unchecked Exception

(1) Exception handling을 강제하지 않는 예외로써 직접 명시적으로 처리하지 않아도 되는 예외이다. 

 

(2) Unchecked Exception은 보통 프로그램의 논리 오류나 개발자의 설계 미숙으로 나타나는 예외들이며 RuntimeException 클래스와 그 하위 클래스를 포함한다.

 

(3) 대표적인 Unchecked Exception의 종류로는 NullPointerException, IndexOutOfBoundException, ArithmeticException, IllegalArgumentException 등이 있다.

 

 

 

5-3. 두 예외의 분명한 차이점은?

(1) Checked Exception의 경우 위에서 설명한 것처럼 예외 처리의 체크 시점이 컴파일 타임이기 때문에 예외를 처리하지 않는다면 컴파일 자체가 진행되지 않는다.

 

(2) Unchecked Exception의 경우 명시적인 예외 처리를 강제하지 않는 예외이다. 컴파일 시점에 예외 처리를 체크하지 않기 때문에 에러를 일으키는 코드가 존재하더라도 실행까지 가능하다. 이러한 이유는 개발자가 충분히 주의함에 따라 Unchecked Exception은 회피할 수 있는 경우가 많기 때문에 Checked Exception보다 다소 약한 예외로 구분되어 자바 컴파일러가 이 부분을 체크하지 않기 때문이다.

 

 

 

 

 

 

※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!

댓글