일개미 : 일상과 개발의 미학

Java의 예외처리 구조 및 필요성 본문

Developments/Java

Java의 예외처리 구조 및 필요성

9low_28 2022. 12. 16. 20:52

출처 : shutterstock

 

살다보면 계획에 없던 예외 상황을 적어도 한번쯤은 마주한 적 있을 것이다. 그럴땐 그 상황을 파악하고 걸맞는 어떤 다른 계획이나 행동을 통해 헤쳐나가거나 빠져나가거나 할 것이다.

 

프로그래밍도 마찬가지다. 컴퓨터 혹은 시스템에서 설계된 그대로 실행되지 않고 예외의 상태에 빠질 수 있다. 그러나 프로그래밍은 지시한 내용이 없다면 사람과 달리 스스로 판단할 수 있는 사고력이 없거나 부족하다. 따라서 개발자는 사전에 프로그래밍에 예외상황에 관한 처리를 알려주고 실행하게 한다. 

 

 

예외처리를 이야기하면 누군가는 에러와 헷갈리기도 한다. 글쓴이도 한동안 제대로 알지 못해서 활용하지 못한 때가 있었다.🙄

 

 

그렇다면 먼저 예외와 에러의 차이는 무엇일까?

예외(Exception) : 개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생, 오류와는 달리 개발자가 미리 예측하여 사전 방지 가능

오류(Error) : 시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제, 개발자가 미리 예측하여 사전 방지 불가능

라고 비교되지만, 사실 예외는 프로그램의 정상 실행에서 벗어난 모든 상황을 가리키는 것으로 포괄적으로 에러 또한 예외 내에서의 한 범위로 볼 수도 있다. 

 


예외처리에 대한 필요성 : Exception Handling

 

자바에서는 프로그램(애플리케이션)의 실행 도중에 예외가 발생하면 그 시점에 종료시킨다. 상황에 따라 예외 발생시에는 종료시키는 것이 좋은 판단이 될 수 있다.

 

그러나 치명적이지 않은 비교적 가벼운 예외 혹은 충분히 예상되는 예외들이라면 프로그램의 종료보다는 해당 예외에 대해 걸맞는 처리를 사전에 알려주는 것이 효율적이다. 따라서 예외 처리를 통해 비정상적인 종료를 방지하고 정상적으로 프로그램이 실행될 수 있도록 해야한다. 

 

예외를 처리하는 방법에 대해서 알게 되면 보다 안전하고 유연한 프로그래밍을 구사할 수 있을 것이다. 이해를 돕기 위해 상속 관계를 간단히 그림으로 나타내 보았다. (좀 더 자세한 구조도 있지만 크게 분류해보았다.)

 

오류와 예외에 관한 상속 구조

 


 

Throwable, 이런게 있었다고?

자바로 프로그래밍을 하다보면 최상위 클래스인 Object가 보이지 않아도 상속받게 되어있다. 그리고 Object와 오류/예외 사이에는 Throwable이라는 클래스와 상속관계가 존재한다.

 

Throwable 클래스는 모든 예외의 최상위격인 Exception 클래스와 모든 오류의 최상위격인 Error 클래스의 부모클래스이며, Throwable 클래스 자체를 직접 사용하는 경우는 거의 없다. 

Throwable 타입과 이 클래스를 상속받은 타입들만이 JVM(자바 가상 머신)이나 throw 구문을 통해 던져질 수 있다.

 

 


 

예외 분류와 특징

자바에서는 try-catch, throw 등의 구문을 이용해 예외를 처리할 수 있다.

예외는 크게 두 가지로 구분할 수 있는데, Checked Exception Unchecked Exception 으로 나누어진다.

 

Checked Exception

반드시 코드에서 처리해야하는 예외에 해당한다. try-catch (+ finally) 구문을 사용해 메소드(함수) 내에서 예외 상황에 대한 처리를 하거나, throws 구문을 *메소드 시그니처에 붙여 해당 메소드가 실행될 경우 어떤 예외가 발생할 수 있는지 호출자에게 알려줘야한다. 메소드의 호출자 역시 동일하게 try-catch 구문이나 throws 구문을 통해 예외를 처리한다.

 

*자바 컴파일러는 메소드를 이름과 파라미터로 구분하는데, 메소드의 이름과 파라미터를 통칭하는 용어가 메소드 시그니처 (Method Signature)이다.

 

Checked Exception을 처리하는 과정이 없다면 컴파일 에러가 발생하며, 예외에 대한 처리를 해달라는 메세지를 받게된다.

 

자바에서는 RuntimeException 클래스와 이를 상속한 클래스들을 제외한 나머지 Exception들을 Checked Exception 으로 간주한다.

 

 

Unchecked Exception

반대로 Unchecked Exception은 컴파일 시점에 확인되지 않는 예외이다. 예외가 발생하더라도 컴파일에 문제가 나타나진 않는다. (try-catch 구문이나 throws 구문을 필수로 사용하지 않아도 된다. 즉, 예외처리를 강제하지 않음.) 흔히 오류보다는 버그라고 불리우는 예외들이다.

 

대표적으로는 RuntimeException을 상속한 NullPointerException(줄여서 NPE라 부르기도 한다.), IllegalArgumentException, IndexOutOfBoundException 등이 있으며, try-catch구문을 통해 처리하지 않아도 되므로 Unchecked라 말하는 것이다.

 

NullPointerException : 프로그램 내부에서 null객체를 사용하려 시도한 경우 발생한다. 즉, 존재하지 않는 객체를 사용하는 경우 발생한다.

IllegalArgumentException : 적합하지 않거나 적절하지 못한 인자를 메소드에 넘겨주었을 때 발생한다.

IndexOutOfBoundException : 배열이나 문자열 등 자료형에 접근할 때 인덱스의 범위를 벗어나 접근하는 경우에 발생한다.

 


 

예외처리 후에는 무엇을 해야할까?

예외를 잡았다면 반드시 처리해야한다. 정상적이지 않은 프로그램의 작동은 문제나 다름없다. 좋은 프로그래밍은 이를 개선하고 보수하는 또한 중요하다. 이는 로그를 통해 기록을 남김으로써 어떤 예외인지 구체적으로 알 수 있다. 로그는 개발자가 처리 상황을 판단할 수 있도록 하여 개선을 돕고 추후에 재발하지 않도록 참조할 수 있는 자료가 되기도 한다.

 

예외를 잡고 발견했다면 세밀한 예외를 던져 새 정보를 얻을 수도 있다. 예외 원인에 대해 정보가 부족할 경우에 예외를 좀 더 여러 상황으로 쪼개서(?) 해결가능한 구체적인 정보를 얻기도 한다.

 

큰 이상이 없다고 판단되는 경우 예외를 무시할 수도 있다. 하지만 이는 좋은 프로그래밍은 아니다. 예외들을 분석해서 더 안전한 프로그램으로 구동되도록 만드는 것이 아니라 예외처리로만 묻어버리고 마는 습관들은 이후에 큰 문제를 발생시키기도 한다.

 

 

예외처리를 하는 주된 목적은 시스템(프로그램)의 개선에 있다는 것을 명시해두자.

 

 

 

 

 

 

 

 

 

 

 

* 참고 문헌

 

# 예외처리 (1) - 예외처리의 중요성

예외처리에 대한 생각 프로그램에서 예외는 발생할 수 밖에 없고, 특히 예외로 인해 서버 프로그램이 작동을 멈춘다면 문제가 발생할 요소가 있다. 적어도 발생한 예외가 어떤 예외이며, 이것이

swiftymind.tistory.com

 

exception(예외) - 예외처리(Exception Handleing)에 대한 필요성과 이해, 예외처리 예, 예외 조치

예외(Exception)· 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의하여 발생하는 오류· 프로그래머가 예상하는 일외에 뜻하지 않은 일들이 생길 수 있습니다. 이렇게 예상하지 못한 일들을 ‘

codedragon.tistory.com

 

java.lang (Java SE 14 & JDK 14)

Provides classes that are fundamental to the design of the Java programming language. The most important classes are Object, which is the root of the class hierarchy, and Class, instances of which represent classes at run time. Frequently it is necessary t

docs.oracle.com

 

[Java] 예외처리 - Throwable, Exception, Error

1. 자바 예외처리(Exception Handling) 자바 프로그램이 동작하면서 다양한 문제들을 만나게 된다. 개발자의 로직에 헛점이 생겨서 발생하는 문제도 있고, 자바 프로그램이 실행되는 JVM에서 문제가 생

hbase.tistory.com