이런 분들이 읽으시면 좋습니다
- Checked, Unchecked를 처음 듣거나 긴가민가 하시는 분
- Error와 Exception을 왜 함께 다루는지 궁금하신 분
- 실습 이전에 이론적 개념이 필요하신 분
왜 Error와 Exception을 함께 다루는가?
Exception을 계속 타고 올라가다보면 최상위에 Throwable이 있습니다.
이 Throwable 하위엔 2가지 자식 클래스가 존재하는데, 각각 Error 클래스와 Exception 클래스입니다.
이미 다른 블로그 포스팅에 항상 Exception과 Error를 함께 설명하는 글이 많을텐데요, Throwable의 하위 자식이기 때문에 언급을 하고 넘어가는 것 같습니다.
Error Class
에러는 간단하게 짚고 넘어가겠습니다. 백준과 같은 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가 발생하게 됩니다.
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에는 정~말 많은 하위 클래스가 존재합니다.
이번 포스팅에서는 크게 두 가지 부류로 살펴보려 합니다.
Unchecked Exception과 Checked Exception
저는 이 Check라는 단어를 컴파일러 입장이라고 생각하며 이해했습니다.
컴파일러 입장에서 확인했는가? Checked Exception 즉, 충분히 예측 가능한 경우. 예외처리를 반드시 해줘야 합니다.
컴파일러 입장에서 확인하지 못했는가? Unchecked Exception, 예측하기 힘든 경우.
컴파일러가 확인한 것은 바로 빨간줄이 그이며 실행을 할 수 없게 되죠. 이것이 바로 Checked Exception입니다.
반대로 컴파일러가 확인할 수 없었던, 즉 실행을 해야만 알 수 있는 예외가 Unchecked Exception입니다.
Checked Exception
다들 입력을 받으실 때 BufferedReader를 사용하실 겁니다. 이 기능을 main에서 쓰면 항상 빨간줄이 그이고 throws IOException을 해줘야만 빨간 줄이 사라지죠. throws를 사용하지 않는다면 try-catch문으로 반드시 처리를 해줘야만 합니다. 따라서 Checked Exception에는 대표적으로 IOException이 있겠습니다.
Unchecked Exception
흔히 RuntimeException이라고도 합니다.