10_자바 예외처리

  안녕하세요 Mr_ChooC(coding)AI 입니다

설명하는 큰 틀은 하기 tree구조를 확인해 주세요!!

예외 처리(Exception Handling)

예외 개념

1.     예외란?

2.     실습

try-catch-finally

1.     예외처리란?

2.     실습

3.     Finally

4.     실습

객체로서의 예외

1.     throwthrows

A.     설명

B.     실습

2.     사용자 정의 예외

A.     설명

B.     실습

 

예외 처리(Exception Handling)

이번 포스트에서는 코드가 에러가 발생 하였을 때 어떻게 다룰 것인지에 대해서 다룰 예정입니다. 코딩을 하다보면 에러가 많이 발생하죠~ 그럴 때마다 처리를 잘해야지 문제 없이 코드를 돌릴 수가 있습니다. 그리고 개발을 잘하는 사람 일수록 에러 처리와 해결을 잘 한다고 생각해도 과언이 아닙니다. 중요한 내용이니 집중해서 보시기를 바라겠습니다.

실습 코드는 github을 참조해 주세요

Github: https://github.com/Chooyoungjun/javastudy/tree/main/11_Exception

예외 개념

1.     예외란?

프로그램 실행 중 발생하는 오류 중에서 처리가 가능한 것을 의미합니다.

[종류]

-      에러: 개발자가 조치를 취할 수 없는 수준의 에러 ex) JVM 동작 이상, 메모리 부족

-      컴파일 에러: 컴파일 시 발생하는 에러 ex) 오타, 잘못된 자료형 등

-      런타임 에러: 프로그램이 종료될 정도로 치명적인 오류를 말합니다.

-      로직 에러: 프로그램이 의도와 다르게 실행되는 에러(로직을 다시 짜야함)

-       다양한 에러가 존재 합니다.

2.     실습

[산술 에러]

컴파일 에러의 종류의 산술 에러에 대해서 실습 해 볼 것 입니다. 0으로 나누면 무한한 값을 가지기 때문에 나누지 못하게 하고 있습니다. 이런 부분에 대해서 알아보면서 이해해 보도록 하겠습니다.



위의 snapshot과 같이 산술에러가 발생 하는 것을 알 수 있습니다.

[로직 에러]

평균값을 구하려고 하는데 코드가 어떻게 잘 못 되었는지 확인하시면 로직 에러가 있음을 알 수 있습니다.



위의 snapshot과 같이 1020을 더해서 2를 나누면 15가 나와야 합니다 하지만 15가 반환 되는 것을 알 수 있습니다. 여기에서 알 수 있듯이 에러는 발생하지 않지만 로직 적으로 문제가 있는 것을 알 수 있습니다. 이런 에러를 로직 에러라고 합니다.

try-catch-finally

위에서 발생한 에러를 처리할 수 있도록 도와주는 문법이 있다. 그러한 문법에 대해서 알아보도록 하겠습니다. (, 로직 에러는 이러한 방법으로 찾기는 힘든 것을 알 수 있습니다.)

1.     예외처리란?

예외가 발생했을 때 이를 적절히 처리 하여 프로그램이 비정상적으로 종료되는 것을 막는 방법을 말합니다. 즉 문제의 해결 방법을 제시를 하거나 아니면 문제가 발생 하는 지점을 알려 주기도 합니다. 이런 식으로 에러에 대해서 대응하고 처리하는 것을 예외 처리라고 말 할 수 있습니다.

[문법]

try {

            예외가 발생할 수 있는 명령;

            실행할 명령;

} catch (발생할 수 있는 예외 클래스명){

            예외 발생 시 실행할 명령;

            }

2.     실습

산술에러와 배열에러를 한번씩 발생시켜서 어떻게 catch를 하는지 확인해 보도록 하겠습니다.


위의 실습에서 보여 주듯이 2가지에러를 나누어서 각각 처리 하기 위해서는 catch구문을 두번 활용해서 처리하면 되는 것을 알 수 있습니다. 이렇게 종류 별로 에러를 나누어서 처리하면 나중에 에러를 조치하는 것이 훨씬 쉬워 지는 것을 알 수 있습니다.

3.     Finally

try-catch문은 선택적으로 실행이 되도록 하는 문법 입니다. 하지만 가끔씩 에러가 발생 하더라도 무조건 실행해야 하는 명령이 존재 할 수 있습니다. 그런 경우에 사용하는 문법이 finally문법 입니다.

[문법]

try {

            예외가 발생할 수 있는 명령;

            실행할 명령;

} catch (발생할 수 있는 예외 클래스명){

            예외 발생 시 실행할 명령;

} finally {

            예외가 발생하든 안하든 무조건 실행하는 명령;

}

4.     실습

보통 DB와 네트워크 연결을 하면 connection을 형성해야 합니다. 그런데 DB에서 데이터 불러오던 도중에 에러가 발생하면 connection인 안 끊겨 있어서 프로세스가 남아 있는 경우가 있습니다. 이럴 때 finally문을 사용하시면 유용하게 사용 하실 수 있습니다.


위의 코드에서 보여 주듯이 Network로 접속 후 문제가 발생하였을 때 네트워크 강제 연결 해제 코드를 실행해 주어서 프로세스를 죽이는 작업을 해주는 코드 입니다.

객체로서의 예외

자바는 객체지향 언어이기 때문에 예외도 객체로서 상속을 받는 구조로 이루어져 있습니다 하기 SnapShot을 확인하시면 예외 클래스 상속관계를 아실 수 있습니다.


위와 같이 가장 위의 객체로부터 상속을 받아서 예외를 체계적으로 정리하고 있는 것을 알 수 있습니다. 그리고 모든 예외 클래스들은 Exception클래스를 상속 받기 때문에 exception으로 처리가 가능한 것을 알 수 있습니다. 그렇기 때문에 위의 설명에서는 Exception을 상속 받는 ArithmeticException을 사용하여 부분적으로 처리 하였습니다. 하지만 전체적으로 예외처리를 하기 위해서는 모든 예외의 부모 클래스인 Exception 클래스를 활용하면 됩니다.

예외 클래스가 들고 있는 메서들을 활용하여 예외처리를 수행 할 수 있습니다.

(ex) getMessage(), toString(), printStackTrace() ….등 등….

[구조]

try {

예외가 발생할 수 있는 명령;

           실행할 명령;

} catch (Exception e){

           예외 발생 시 실행할 명령;

           }

위와 같이 Exception e를 활용하면 모든 에러에 대해서 처리가 가능 한 것을 알 수 있습니다.

1.     throwthrows

[throw ?]

개발자가 고의로 에러를 발생시키려고 할 때 활용할 수 있는 방법 입니다.

[구조]

Exception e = new Exception(“Exception!!@#”);

throw e;

[실습]

고의로 예외를 만드는 코드를 실행해 보도록 하겠습니다.


Throw를 통해서 에러를 만들어 줍니다. Exception을 객체화 할 때 넣은 문자를 e.getMessage()를 통해서 부르게 되면 출력 할 수 있는 것을 확인 할 수 있습니다.

[throws ?]

throws를 다른 말로 예외 던지기라고도 말을 합니다. 그래서 예외 던지기란 예외가 발생 했을 경우 현재 메서드가 예외를 처리하지 않고 자신을 호출 한쪽으로 예외를 넘겨주는 메서드 입니다.

[구조]

Void method() throws Exception { … }

위의 구조가 실행이 되면 만약 누가 method()를 호출을 하고 method()내에서 에러가 발생 하면 호출한 쪽에 에러의 내용을 전달하는 것이 실행 됩니다.

[실습]

Throws를 활용하여 메서드를 정의를 하고 그 메서드를 다른 메서드에서 부르는 방식으로 코드를 구성하여 어디에서 에러가 처리되는지 확인해 보도록 하겠습니다.


위의 코드에서는 제일 상위 main 메서드에서 코드가 처리되고 있는 것을 알 수 있습니다. 이러한 코드 실습을 통해서 throws가 어떻게 실행되는지 확인 할 수 있습니다.

사용자 정의 예외

자바에서는 사용자가 예외 클래스를 직접 정의하는 것을 지원 합니다. 위에서 배운 상속과 class의 여러 기능들을 잘 활용하면 가능 하겠죠? 실습을 통해서 자세히 알아보도록 하겠습니다.

[실습]

티켓팅을 할 경우에 나이가 잘못 입력 되는 경우에 대한 예외처리를 Exception 클래스를 상속 받아서 AgeException을 따로 정리하여 예외를 처리하는 경우에 대해서 보여 드리도록 하겠습니다.


위의 실습코드를 확인해 보시면 나이에 대한 예외처리를 Exception이라는 클래스를 상속 받아서 처리 하는 것을 확인할 수 있습니다. 부모 객체를 정의 할 때 메시지를 저장 하는 방법에 대해서 super를 통해서 생성하였습니다. 그렇게 생긴 예러 메시지를 printStrackTrace를 통해서 호출 하고 있는 것을 알 수 있습니다.

이렇게 이번 포스트에서는 예외처리에 대해서 자세하게 알아 보았습니다. 긴 글을 읽어 주셔서 감사합니다. 부족한 부분이나 수정해야 할 부분이 있다면 언제든 댓글을 남겨 주십시오.

 

Comments