ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Exception (checked, unchecked)
    CS/DS & OOP 2021. 1. 10. 19:45

    ???: I/O 형은 나가있어(Exception..!?)..

    Exception

    말 그대로 예외입니다. 프로그램 실행 중에 발생하여 프로그램 명령의 정상적인 흐름을 방해하는 이벤트입니다.

     

    이러한 Exception들을 그냥 두면 정상적인 요청/응답을 하는 데 있어 문제가 생기겠죠?

    따라서 Exception을 처리, 즉 예외 처리를 진행해야 합니다.

    * 예외 처리라는 말에서 알 수 있듯 예외는 핸들링이 가능합니다.

     

    예외 처리 방법

    1. 예외 복구 - 다른 작업 흐름으로 유도.
    2. 예외 전환 - 예외의 원인을 명시적으로 나타내어 throw.
    3. 예외 회피 - 예외를 처리하지 않고 호출한 곳으로 넘겨줌(throw).

     

    또한, Exception은 두 종류로 나뉘는데 그것이 바로 'checked/unchecked Exception'입니다.

    각 예외의 종류와 특징 그리고, 어떻게 처리할 것인지에 대해 대략적으로 알아보겠습니다.

    그림 1. Checked & Unchecked Exception

     

    Checked/Unchecked Exception 특징

      Checked Unchecked
    시점 Compile Runtime
    처리 여부 Necessary Unnecessary
    트랜잭션 처리 Rollback x Rollback o (when ocurred)

     

    Checked Exception

    반드시 명시적으로 처리해야 하기 때문에 Checked Exception이라고 하며, try catch 또는 throws를 이용해 처리할 수 있습니다.

    자주 볼 수 있는 IOException을 예시로 보겠습니다.

     

    IOException

    그림 2. IOException (checked)

    보시는 바와 같이 complie 시점에 빨간색으로 예외를 표시해 줍니다.

    readLine에서 발생하는 IOException에 대한 원인은 해당 링크의 답변을 참고하시기 바랍니다.

     

    빨간 줄이 발생했기 때문에 프로그램이 실행될 수 없고, 따라서 예외 처리를 강제하게 됩니다.

    아래와 같은 두 방법으로 처리해줄 수 있습니다.

    그림 3. IOException 처리 (1), throws
    그림 4. IOException 처리 (2), try-catch

    Java Docs에서는 Checked Exception을 아래와 같이 설명합니다.

    If a client can reasonably be expected to recover from an exception, make it a checked exception.

    사용자가 해당 예외를 복구 가능할 것이라 예상되는 경우 checked를 발생시킨다.

    즉, 기본적으로 복구가 가능하다는 전제가 있기 때문에 Rollback 또한 진행하지 않는 것으로 보입니다.

     

    하지만, 일반적으로 Checked Exception이 발생하는 경우 이를 직접적으로 처리해주는 일은 드문데요.

    예를 들어 사용자가 'food'라는 파일을 찾아야 하는 경우, 'good'을 입력한다면 FileNotFoundException(checked)이 발생합니다.

    (good이란 파일명은 존재하지 않는다고 가정하겠습니다.)

     

    이러한 경우 일반적으로 사용자에게 단어 유사도를 통해 유사한 파일명을 찾아주는 기능을 제공(예외 복구) 하지 않습니다.

    해당 이름을 가진 파일이 없다.라는 것을 알려줄(예외 전환)이죠.

     

    Unchecked Exception

    명시적인 예외 처리를 강제하지 않는 특징이 있기 때문에 Unchecked Exception이라 하며, 즉 따로 처리하지 않아도 상관없습니다.

    Unchecked는 NumberFormat을 예시로 살펴보겠습니다.

     

    물론, Unchecked에서 따로 처리하지 않아도 상관없다는 것은 프로그램 작동에 문제가 없다는 뜻은 아닙니다.

    또한, Checked처럼 따로 빨간 줄이 발생하진 않습니다.

    해당 예외가 발생할 부분이 입력부인데, 컴파일 시점에는 해당 입력에 어떤 값이 들어갈지 정해지지 않았으니 당연한 결과입니다.

    그림 5 - 1. 정상 처리
    그림 5 - 2. 정상처리

    이와 같이 입력값에 정수형 데이터를 넣어준다면, 문제없이 작동합니다.

     

    하지만, 정수형 데이터가 아닌 경우엔 아래와 같이 예외가 발생합니다.

    즉, 따로 처리해주지 않아도 컴파일까진 가능하며, 런타임에 문제가 발생할 가능성이 존재할 뿐입니다.

    그림 6. NumberFormatException

     

    이러한 런타임에 발생하는 경우엔 미리 정보 제공을 통해 잘못된 동작을 막고

    잘못된 값이 들어온 경우 예외 복구/전환 등을 이용해 처리해주는 것이 일반적입니다.

    2번째 경우엔 예외 복구 및 전환을 위해 IOException은 throws로 회피시키도록 하겠습니다.

     

    그림 7 - 1. 예외 복구
    그림 7 -2. 예외 복구

    나누어 설명드렸으나, 위와 같이 두 가지 방식을 모두 적용해 처리하는 것이 일반적입니다.

    * 올바른 값을 유도하고, 그럼에도 잘못된 값이 들어온 경우 예외 처리

     

    Checked는 complie시점에 빨간 줄로 인해 실행조차 불가능했던 것과는 다르게 Unchecked는 위와 같은 차이점을 보입니다.

     

    Java Docs의 Uncheck에 대한 설명은 아래와 같습니다.

    If a client cannot do anything to recover from the exception, make it an unchecked exception

    예외에서 복구를 위해 어떤 작업도 할 수 없다면, Unchecked로 선언한다.

    위와 같은 경우에 Unchecked로 선언됨으로써 Roll-back이 진행된다고 보시면 되겠습니다.

     

    해당 설명에서 복구란 예외 복구와는 다른 의미를 가진다는 것을 생각하셔야 합니다.

    일관성 유지를 위한 복구를 의미하는데, 이를 하지 못하는 경우엔 Unchecked로 선언해 자동 Roll-back을 시켜준다로 이해하시면 되겠습니다.

     

     

    예외 처리는 가볍게 생각해서 필요 없는 행위라고 생각하실 수 있겠습니다.

    물론 고객을 만족시키기 위한 요구사항에 대해 잘 작동하는 것은 상당히 중요합니다. 하지만, 사용해선 안 되는 기능이 작동한다거나 접근 불가능한 정보에 접근할 수 있다는 것이 얼마나 위험한지, 왜 막아야 하는지 인지하시고 예외 처리를 진행하신다면 더욱 뜻깊게 다가갈 수 있을 것이라 생각합니다.

     

    기본에 필요한 정보는 어느 정도 제공드렸으나, 상세한 이해와 활용면은 조금은 부족한 것 같아 추후 포스팅으로 정리하도록 하겠습니다.

    잘못된 부분이나 질문에 대한 내용 남겨주시면 빠르게 피드백드리도록 하겠습니다. 감사합니다.

     

     

     

     

    참고 자료

    www.youtube.com/watch?v=8WTVLa1Xtsk (채널 Telusko, 10.1 Exception Handling in Java Theory)

    cheese10yun.github.io/checked-exception (Yun님의 블로그)

    www.geeksforgeeks.org/checked-vs-unchecked-exceptions-in-java (GeeksforGeeks)

    docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html (Java Docs)

    stackoverflow.com/questions/2629649/java-what-are-ioexceptions-in-bufferedreaders-readline-for (Stack Overflow)

    반응형

    'CS > DS & OOP' 카테고리의 다른 글

    JVM (Java Virtual Machine), GC (Garbage Collection)  (0) 2021.06.22
    Exception (try-with-resources)  (0) 2021.01.12
    Java 자료형과 String pool  (0) 2020.07.01
    객체지향 5원칙 (SOLID)  (0) 2020.06.24
    트리와 그래프  (0) 2020.03.05

    댓글

Designed by minchoba.