Exception 도 다 같은 Exception 이 아니다.

nGyu·2022년 3월 29일
3
post-thumbnail

프로그램을 작성하다 보면 우리는 여러 에러들을 마주하게 된다.🤮🤮
우리가 흔히 봤던 에러들이 다 같은 에러일까? 한번 지대로 알아보자 !


Java에서 예외는 3가지로 볼 수 있다.

  • Checked Exception
  • Error
  • UnChecked Exception

이렇게 총 3가지로 볼 수 있는데, 여기서 Checked ExceptionUnCheckedException을 흔히 Exception이라고 부른다.

프로그램을 제작하다보면 수없이 많은 오류가 발생을 하는데, 이러한 오류들을 try - catch 와 throw 를 이용하여 Exception 처리를 해준다.

하지만, OutOfMemory 혹은 ThreadDeath같은 에러는 try - catch로도 잡기가 힘든데, 이러한 문제 때문에 Checked Exception 혹은 UnChecked Exception이라는 개념이 중요하게 자리잡게 되었다.

Exception

위에서 설명했지만, 가볍게 Exception이 무엇인지 한번 알아보도록 하자.

Exception은 사전적 의미로 “예외” 라는 뜻을 품고있는데, 이는 코드를 짤때 “예외처리"에서 사용이 된다.

public void throwErr() throws Exception{
	try{
		int a = 'A';
	} catch(Execption err){
		throw new Exception(err);
	}
}

이와같은 형태로 try - catch, throws를 이용해서 사용할 수 있다.

위에 Exception은 예외처리를 위해 사용한다고 설명했다.

그리고 이 안에는 Checked ExceptionUnChecked Exception이 존재한다고 언급을 했는데, 이 두 Exception의 차이는 RuntimeException을 상속하느냐 안하느냐 그 차이이다.

Checked Exception

Checked Exception은 RuntimeException을 상속받지 않는다.

이게 무슨소리인가 한번 알아보자.

출처
이게 그림이 너무 잘 그려져 있어서 한번 가지고 와 보았다.

SQLException, IOException이 Checked Exception의 대표적인 예 이다.

이 두가지는 코드를 작성하다 보면 꼭 명시를 해주어야 한다.

public class inputTest {
	public static void main(String[] args) {
		System.out.println("Start");
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int age=0;
		
		try {
			System.out.print("나이=");
			age = Integer.parseInt(in.readLine());
		}catch(IOException ie) {		
			System.out.println("IOException occured.");
			System.exit(1);
		}
		System.out.println("나이:" + age);	
		
		System.out.println("End");
	}
}

이는 IOException을 예시로 들어보았는데, 이처럼 RuntimeException을 상속받지 않는 Exception은 try-catch만 이용하여 에러를 잡아주거나, throw까지 함께 사용해서 예외처리를 해줄 수 있다.

이것이 Checked Exception이다.

UnChecked Exception

Runtime Exception을 상속받지 않는다.

위에 첨부한 이미지를 확인하면 어느정도 이해는 가능할 것 같다.

프로그램을 만들거나 알고리즘 문제를 풀 때 IndexOutOfBoundsException 혹은 NullPointerExceptionr 과 같은 에러를 만난 적 있을것이다.

그런데 우리가 이러한 에러를 명시해준 적 있었는가? 아니다 우리는 이러한 에러를 예외처리해준적이 없다. 이들은 모두 런타임중에 생긴 에러이다.

예외 처리 방법

위에 Exception안에는 Checked와 UnChecked가 있다는 사실을 알게 되었다.

위에도 살짝 언급은 되어있지만, 이러한 Exception을 어떻게 처리해야할까?

예외복구

이는 예외 발생 시 해당 문제를 파악하고 정상으로 돌리는 방법이다. 흔히 try-catch-finally 를 사용하며, 아래 예제와 같이 사용된다

try{
	//...생략
}catch(IOException ie){
	// 에러처리 로직 작성
} finally{
	// try와 상관없이 무조껀 실행되어야 하는 코드 작성
}

예외처리 회피

이는 예외 발생 시 예외를 발생하는 그 자체가 담당하지 않고, 이를 호출하는 쪽에서 예외처리를 할 수 있도록 하는 방법이다. 흔히 throws와 같은 코드로 예외를 호출하는쪽에 던저벼리고, 아래와같이 사용된다.

public void thorwException() throws IOException{
	char[] c_arr = {'a' , 'b' , 'c'};
	System.out.write(c_arr[4]);
}

예외 전환

마지막으로 예외 전환이라는 방법인데, 이는 적절한 예외로 전환해서 자신을 호출할 쪽으로 던져버리는 방법이다. 이는 위에 언급한 복구, 회피 방법을 적절히 활용한다고 볼 수 있다.

try{
	//...생략
}catch(IOException ie){
	throw new RuntimeExecption(e.getMessage());
}

정리

Checked Exception 과 UnChecked Exception 이 두개의 차이점을 알겠는가?

프로그램을 제작하며 정말 다양한 오류를 만나고 해결해 왔었는데 이에 대해서 공부를 하며 예외처리는 단순히 예외처리라는 한 단어만 존재하는것이 아닌, Checked Exception과 UnChecked Exception이 존재하고, 내가 여태 마주했던 에러들이 어떤 종류의 에러인지 알게 되었다는것이 상당히 흥미로웠다.

마지막으로, 예외처리 방법에는 크게 3가지가 있다는 것도 알게 되었고, 앞으로 Spring을 공부할 때 혹은 어떠한 기술을 공부하고 이용할 때 예외처리를 어떤 방식으로 해야하는지도 알게되어 좋았다 :)

profile
지금보다 내일을, 모레를 준비하자

0개의 댓글