본문 바로가기
My Image
프로그래밍/Java

[JAVA] 자바 Exception 개념 및 예외 처리란?

by Lim-Ky 2020. 1. 8.
반응형

안녕하세요. limky 입니다.

 

오늘은 자바 Exception에 대해서 알아보겠습니다.

 

예외(Exception) 및 예외 처리 개념

 

Exception은 해석하면 '예외'라는 뜻을 가지고 있습니다. 예외는 error의 일종이며 프로그램이 수행시 또는 컴파일시에 불능상태를 만들어 버립니다. Exception이 발생하는 이유는 여러가지 입니다. 잘못된 프로그램 조작 및 개발자 실수 등 여러가지 요인으로 인해 Exception이 발생합니다.

 

근데 만약.. 금융시스템 또는 365일 24시간 항상 구동되어야 할 시스템이 Exception으로 인해 시스템이 불능이 되거나 프로그램이 죽어버리게 되면 상당히 곤란할 것 입니다. 따라서 이를 막기 위해! 자바에서는 Exception 예외처리라는 방법을 통해 Exception error를 처리합니다. (예외 처리의 필요성!!!)

 

그럼, 이 예외처리라는 것이 무엇일까요?? 예외 처리란 Exception 예외가 발생할 것을 대비하여 미리 예측해 이를 소스상에서 제어하고 처리하도록 만드는 것입니다. 이렇게 예외 처리를 하게되면 갑작스러운 Exception이 발생하여도 시스템 및 프로그램이 불능상태가 되지 않고 정상 실행 상태를 유지할 수 있습니다.

 

자 정리하겠습니다. 

에외란 error에 일종이며, 발생시 시스템 및 프로그램을 불능상태를 야기함..

하지만 이를 막기 위해 예외 처리를 통해, 시스템 및 프로그램을 정상실행 상태로 유지하도록 함

 

 

 

예외(Exception)의 종류(일반예외, 실행예외)

Exception에는 크게 2가지 종류가 있습니다. 

컴파일 시점에 발생하는 예외를 Exception(일반예외) 라고 하고,

프로그램 실행시에 발생하는 예외를 RuntimeException(실행예외) 라고 합니다.

즉, 예외가 발생하는 시점에 프로그램이 실행 전 후 상태에 따라 이를 구분하면 됩니다.

 

아무튼 이 2가지 종류의 Exception 을 처리하기 위해 자바에서는 java.lang.Exception 이라는 최상위 부모 클래스를 제공합니다. 따라서 모든 Exception 들의 조상은 결국  java.lang.Exception 입니다. 아래 그림을 보겠습니다.

 

보라색 java.lang.Exception 은 자바에서 예외처리를 할 수 있게 제공해주는 최상위 보무 클래스이며

하늘색 Exception들은 단순 Exception입니다. 즉 컴파일 시 발생하는 Exception입니다. (일반예외)

하지만 초록색 RuntimeException은 프로그램 실행시 발생하는 런타임 Exception 입니다. (실행예외)

 

 

예외처리 코드 및 실행 순서(Try-Catch-Finally)

이제 자바 Exception 개념 및 종류에 대해 알아봤으니 예외 처리코드에 대해서 알아보겠습니다.

 

예외 처리 코드 Try - Catch - Finally

 

앞서 말했듯이 예외 처리 코드는 갑작스러운 예외 Exeption 발생으로 인해 시스템 및 프로그램이 불능상태에 빠지지 않고 시스템 및 프로그램이 정상실행 되도록 유지시켜 줍니다.

예외 처리 코드에는 크게 3가지 블록이 존재하는데, 각각에 대해서 알아보겠습니다.

 

Try 블록 : 실제 코드가 들어가는 곳으로써 예외 Exeption이 발생할 가능성이 있는 코드

Catch 블록 : Try 블록에서 Exeption이 발생하면 코드 실행 순서가 Catch 쪽으로 오게됨. 즉 예외에 대한 후 처리 코드

Finally 블록 : Try 블록에서의 Exeption과 발생 유무와 상관 없이 무조건 수행되는 코드 (옵션이라 생략이 가능)

 

자 그렇다면! 예외 처리 코드에 실행 순서에 대해서 알아보겠습니다.

 

Exeption 발생!

Try 블록 수행 -> Catch 블록 수행 -> Finally 블록 수행 (생략가능)

 

Exeption 미발생!

Try 블록 수행 -> Finally 블록 수행 (생략가능)

 

아울러, 예외 처리 코드는 예외 종류(일반예외, 실행예외)에 따라 예외 처리 코드 (Try-Catch-Finally)의 강제여부가 갈린다! 다시 말해, 컴파일시 예외 검사 대상이 되는 일반예외는 예외 처리 코드에 반드시 감싸서 코드를 짜야합니다.. 반면 프로그램 실행이후 발생하는 실행예외는 따로 컴파일러가 예외 처리 코드를 강제하라고 하지 않기 때문에 온전히 개발자의 경험에 의해서 예외 처리 코드를 사용해야합니다.

 

이것은 굉장히 중요하다. 컴파일러가 실행예외를 컴파일 시점에 판단하여 검사할 수 없기 때문에 개발자가 실행예외가 발생할 가능성이 있는 코드에 예외 처리 코드를 적용해줘야 합니다.

 

즉, 개발자의 역량에 따라 실행 예외를 잘 막기도하고, 못 막기도 합니다. 이는 시스템의 안정성에도 영향을 주게 되는 것이지요. 또한 이는 다른 의미에서 일반예외보다 실행예외가 예외발생 시 더 치명적입니다. 아무튼! 우리가 알아야 할 것은 일반예외와 달리 실행예외는 컴파일러가 따로 체크해주지 않으니 알아서 예외 처리 코드를 사용해야 한다는 것!!

 

 

 

일반예외, 실행예외에 따른 예외처리 코드

 

자 이제 실제 구현된 코드를 보며 이해해봅시다.

일반예외와 실행예외를 나눠 예외처리 코드를 구현했습니다.

 

실행예외 : NullPointerException 

(NullPointerException : 실제 참조할 대상이 null인데 참조하려고 할때 발생하는 예외)

 

위 코드를 보면, array가 null인데 객체 참조를 시도하면서 발생하는 그 유명한...NullPointerException 입니다.

위 코드가 수행이 가능한 이유는 컴파일 할 때 컴파일러가 따로 예외 처리 코드를 사용하라고 강제하지 않았고 개발자가 null 참조를 수행한다는 것을 놓쳤기 때문에 가능했습니다. 결국..실행 예외가 발생하였고 이를 방어할 예외 처리 코드를 적용하지 않았기 때문에 11번 줄에 있는 println은 찍히지 않았다. 프로그램이 그전에 죽어버린 것!

 

그럼 이제 위 코드를 예외 처리 코드를 사용해서 실행 예외 방어를 해봅시다!

 

예외 처리 코드를 사용하니, 프로그램이 죽지 않고 수행되었습니다. 또한 Finally 블록 또한 수행되었다 만약 실행 예외가 발생하지 않아도 Finally 블록은 수행할 것 될 것 이다. 또 여기서 주목할 것은 catch (예외유형 e) 형태로 되어 있는 것을 확인할 수 있는데 발생한 실행예외 유형이 NulllPointerException 이기 때문에 catch블록에서 잡을 수 있었고 예외 관련된 객체 e를 반환 받았다는 것을 이해하면 됩니다. 또 e 객체의 getMessage 메서드를 통해 개발자가 이해하기 쉬운 예외 메시지를 얻어 처리함을 확인할 수 있습니다.

 

일반예외 : ClassNotFoundException

(ClassNotFoundException: 해당 클래스가 존재하지 않으면 발생하는 일반 예외)

(forName 메서드 : 파라미터로 클래스 정보를 넘겨주고, 해당 클래스가 존재하면 갹체를 리턴해주는 메서드)

위 코드에서 볼 수 있듯이..컴파일러는 자동으로 일반예외를 감지하고 예외 처리 코드를 사용하도록 강제합니다. 만약 예외 처리 코드를 구현하지 않으면 프로그램 실행 조차 할 수 없겠죠? 

이제 예외 처리 코드를 적용해서 다시한번 수행해봅시다.

 

예외 처리 코드를 감싸서 일반 예외에 대한 후처리를 수행하였습니다. 위 코드에서는 Finally 블록을 사용하지 않았습니다. 또한, Catch블록에 ClassNotFoundException 예외 유형을 명시하여 해당 일반 예외에 대한 에러 정보를 e 객체에 담았습니다. 추가로 e.printStackTrace() 메서드를 통해, 어떤 과정을 거치다가 에러가 발생했는지 print 합니다. StrackTrace()를 통해 찍힌 정보를 보면 ExceptionExample.java 7 Line에서 에러가 발생했음을 알 수 있습니다. 또한 에러 유형은 java.lang.ClassNotFoundExcepotion : java.lang.limky를 상단에 찍어줌으로써 limky라는 클래스를 찾을 수 없어서 발생한 일반 예외임을 알게합니다.

 

!!!오늘 자바 예외와 예외 처리가 무엇인지 알아보았습니다. 개념부터 실제 코드까지 살펴보았는데, 예외 처리는 실제 실무에서 예외처리는 굉장히 중요합니다. 예외 처리 유무에 따라 시스템 안정성이 확보되고 다양하고 급작스럽게 발생하는 예외에 대해 예외 정보를 로그에 남기면서 해당 예외 발생 케이스에 대한 대응을 할 수 있기 때문입니다. 마치..일종의 환자 병력? 사고? 기록을 남기게 하는 것이지요! 또 개발자는 예외 로그 등을 보고 예외 원인을 파악하고 예외 방어코드를 구현함으로써 문제를 해결합니다. 

 

다음 시간에는.. 자바에서 제공해주는 예외 말고! 개발자가 직접 정의한 예외를 통한 예외 처리 방법, 예외 떠넘기기(?)에 대해서 알아보겠습니다. 이 글이 도움이 되셨다면 댓글과 좋아요 ㅎㅎ 부탁드립니다. ^^

반응형

댓글