강승현입니다
    • 홈
    • 태그
    • 방명록

    카테고리

    • 전체 글 (118) N
      • 후기 (38)
        • 경험 (15)
        • SSAFY (9)
        • 코딩테스트 (3)
        • 넥스터즈 (6)
        • 회고 (5)
      • Degrees (2)
      • Tech (33) N
      • OnlineJudge (45)
    Tech

    [Java] Error와 Exception에 대해

    CODe_byCODe_·2021. 2. 21. 22:05

    목차


      이런 분들이 읽으시면 좋습니다

      1. Checked, Unchecked를 처음 듣거나 긴가민가 하시는 분
      2. Error와 Exception을 왜 함께 다루는지 궁금하신 분
      3. 실습 이전에 이론적 개념이 필요하신 분

      왜 Error와 Exception을 함께 다루는가?

       

       

      Eclipse - Throwable 하위 클래스

       

      Exception을 계속 타고 올라가다보면 최상위에 Throwable이 있습니다.

      이 Throwable 하위엔 2가지 자식 클래스가 존재하는데, 각각 Error 클래스와 Exception 클래스입니다.

      이미 다른 블로그 포스팅에 항상 Exception과 Error를 함께 설명하는 글이 많을텐데요, Throwable의 하위 자식이기 때문에 언급을 하고 넘어가는 것 같습니다.

       


      Error Class

       

      Error 하위 자식 클래스

       

      에러는 간단하게 짚고 넘어가겠습니다. 백준과 같은 oj사이트에서 간혹 스택오버플로우, 메모리 초과 등의 에러를 보셨을겁니다.

      이 에러들이 바로 Error의 하위 자식 클래스입니다. 위 사진에서도 VirtualMachineError의 OutOfMemoryError, StackOverflowError가 정의되어 있는 것을 볼 수 있습니다.

       

      Error 원인과 해결방법

      스택오버플로우를 예로 들어보겠습니다. Online Judge 사이트의 경우 각 문제별로 메모리 제한, 스택이 제한되어 있습니다. 그렇다면 개발자는 해당 메모리에 맞게 로직을 구현해야 합니다. 엄청난 횟수의 재귀를 돌리거나 많은 변수를 선언하게 되면 스택오버플로우가 발생할 수 있습니다.

      이런 경우 try-catch로 해결될 문제가 아니죠. 로직 자체를 다시 구현해서 에러가 발생하지 않도록 하거나, JVM자체의 사양을 올려줘야 합니다. 하지만 저희가 자주 직면하는 문제는 보통 소스코드를 개선하는 경우가 대다수 입니다.

       

      public class Main {
      	static void StackOverFlow(int n) {
      		System.out.println(n);
      		StackOverFlow(n+1);		
      	}
      	public static void main(String[] args) {
      		StackOverFlow(1);
      	}
      }

       

      위의 코드를 볼까요? 종료조건을 따로 명시하지 않은 채 계속해서 함수를 호출하게 되면 해당 함수는 스택공간에 계속 적재됩니다.

       

      재귀함수 StackOverflowError

       

      그럼 계속해서 쌓이다가 위와 같이 StackOverflowError가 발생하게 됩니다.

       

      public class Main {
      	static void StackOverFlow(int n) {
          	if(n==100)return;
      		System.out.println(n);
      		StackOverFlow(n+1);		
      	}
      	public static void main(String[] args) {
      		StackOverFlow(1);
      	}
      }

       

      저희는 종료 조건을 명시하여 이 문제를 해결할 수 있습니다.


      Exception Class

      Exception에는 정~말 많은 하위 클래스가 존재합니다.

      Exception의 하위 클래스들..

       

      이번 포스팅에서는 크게 두 가지 부류로 살펴보려 합니다.

      Unchecked Exception과 Checked Exception

       

      저는 이 Check라는 단어를 컴파일러 입장이라고 생각하며 이해했습니다.

      컴파일러 입장에서 확인했는가? Checked Exception 즉, 충분히 예측 가능한 경우. 예외처리를 반드시 해줘야 합니다.

      컴파일러 입장에서 확인하지 못했는가? Unchecked Exception, 예측하기 힘든 경우.

       

      컴파일러가 확인한 것은 바로 빨간줄이 그이며 실행을 할 수 없게 되죠. 이것이 바로 Checked Exception입니다.

      반대로 컴파일러가 확인할 수 없었던, 즉 실행을 해야만 알 수 있는 예외가 Unchecked Exception입니다.


      Checked Exception

       

      Eclipse - IOException에 대한 2가지 해결방법 제시

       

      다들 입력을 받으실 때 BufferedReader를 사용하실 겁니다. 이 기능을 main에서 쓰면 항상 빨간줄이 그이고 throws IOException을 해줘야만 빨간 줄이 사라지죠. throws를 사용하지 않는다면 try-catch문으로 반드시 처리를 해줘야만 합니다. 따라서 Checked Exception에는 대표적으로 IOException이 있겠습니다.


       

      Unchecked Exception

      흔히 RuntimeException이라고도 합니다.

       

       

      우리가 수 없이 봐왔던 ArithmeticException, ClassCastException 등이 존재합니다. 컴파일러가 체크할 수 없는 예외들이죠? 수가 0으로 나누려 한다던가, 클래스의 캐스팅이 잘못되었다던가 등 이런 예외들은 실행하기 전에 알 수 없기 때문에 Unchecked라고 합니다.

       

      이런 예외들은 Try-Catch로 잡아낼 수는 있습니다. 하지만, Try-Catch로 잡아내기 보다는 직접적인 원인을 해결해야 합니다.

       

      0으로 나누는 상황은 0으로 나눠지지 않게 조건문을 명시하거나, 0으로 나눠지는 상황엔 넘어가게 하거나, 등 직접적인 조치를 하셔야 합니다.

       

      즉, 필요한 경우엔 이를 명시적으로 처리해야 합니다.

      반응형
      저작자표시 비영리 변경금지 (새창열림)
      'Tech' 카테고리의 다른 글
      • [STS] MAC Lombok 설치 오류
      • [Spring] HikariCP Dead lock 벗어나기
      • Python3 나누기연산(/)과 시프트연산(>>)의 속도 차이를 알아보자
      • 몸소 겪었던 Python과 PyPy의 차이(메모리,속도)
      CODe_
      CODe_
      개발과 관련된 다양한 정보를 몰입감있게 전달합니다.
      최신 글

      티스토리툴바