HiDevelop

쉽게 배우는 JAVA 2-7(예외 2) 본문

Java

쉽게 배우는 JAVA 2-7(예외 2)

꽃달린감나무 2021. 8. 19. 17:29
728x90

"이 글은 글쓴이가 부스트 코스의 쉽게 배우는 JAVA2를 통해 배운 점을 적는 공간입니다."

 

checked Exception vs unchecked Exception

예외 값을 따로 처리하지 않으면 컴파일 조차 실행되지 않는 예외 값들이 있다. 이러한 예외 값들을 checked Exception이라고 부른다. 이와는 반대로 예외를 따로 try cacth문이나 throw으로 처리하지 않아도 컴파일이 실행되는 예외 값들을 unchecked Exception으로 불린다. 그럼 왜 unchecked Exception은 따로 처리를 하지 않아도 컴파일이 될까? 궁금해서 여러 가지 정보를 찾아본 결과, checked Exception과는 다르게 발생하는 경우의 대부분이 개발자의 실수로 인해 생기고, 미리 예측하여 그 오류를 따로 처리할 수 있기 때문인 것 같습니다.(개인적인 의견입니다!)

 

checked Exception은 Throwable로 부터 상속된 Exception클래스에서 RuntimeException을 제외한 모든 예외들을 포함하고, 반대로 unchecked Exception은 RuntimeException클래스를 속하는 예외들을 포함한다.

Throwable의 상속관계도

Resource

자원에는 파일, 네트워크, 데이터베이스 등이 있습니다. 이러한 자원들은 외부의 자원이기 때문에 사용자가 온전히 제어를 하지 못할뿐더러, 다른 누군가도 사용할 수 있는 자원입니다. 그래서 사용할 때에는 누군가가 자원을 같이 사용하면 자원의 내용이나 자원을 갖고 하는 작업의 내용이 작업 중에 변질될 우려가 있기 때문에 자원을 사용할 때에는 독점(점유)을 하여야만 합니다. 또한 자원을 다 사용하였으면 반드시 작업을 놓아주는 과정이 필요합니다.

FileWriter f = new FileWriter("data.txt");
f.wrtie("hello"); 
f.close(); //작업을 놓아주는 명령문

Finally

import java.io.FileWriter;
import java.io.IOException;


public class CheckedExceptionApp {

	public static void main(String[] args) {
		FileWriter f = null;
		// try catch finally
		try {
		f = new FileWriter("data.txt");
		f.write("Hello");
		//예외발생!!!!!
		f.close();
		} catch(IOException e) {
			e.printStackTrace();
		}
		}
	}

위 코드 실행하다가 보면 중간에 예외발생!!이라는 문에서 예외가 발생하면 catch문으로 가지기 때문에 예외 자원을 놓아주는 f.close() 문이 실행되지 못하는 상황이 발생하게 됩니다. 이럴 땐 어떻게 해야 할까요? 바로 finally문을 사용하면 됩니다. finally문은 try문에서 예외가 발생해도, 발생하지 않아도 무조건적을 실행되기 때문입니다.

import java.io.FileWriter;
import java.io.IOException;


public class CheckedExceptionApp {

	public static void main(String[] args) {
		FileWriter f = null;
		// try catch finally
		try {
		f = new FileWriter("data.txt");
		f.write("Hello");
		//예외 발생!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		f.close();
		} catch(IOException e) {
			e.printStackTrace();
		}finally {
			
			if( f != null) {
				try {
					f.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 

try-with-resource 문
위 코드를 보면 예외처리로 인해 코드가 너무 복잡해졌습니다. 간단한 게 만들 방법은 없을까요? JAVA SE7 이전에는 없었지만 JAVA SE7 버전 후에는 try-with-resource문이 업데이트 되면서 위와 같은 코드를 더 간단하게 만들어졌습니다.

import java.io.FileWriter;
import java.io.IOException;

public class TryWithRecource {

	public static void main(String[] args) {
		//Try with resource statements
		try(FileWriter f = new FileWriter("data.txt")){
		f.write("Hello");
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

복잡한 코드를 try-with-resource문을 사용하여 이렇게 간단하게 바꿨습니다. 바꿀 수 있는 이유는 무엇일까요? 그것은 작업을 놓아주는 close()문을 자동적으로 실행해주기 때문입니다(단, AutoCloseable 인터페이스를 상속해야합니다.)

try-with-resource문에서 try를 사용할 때 괄호안에 사용할 자원을 정의할 수 있습니다. 여러개 자원을 정의할 수 있으며 여러개의 자원을 사용할 때에는 괄호안에 ;을 통해서 자원 간에 구분을 하고 마지막 자원에 ;를 붙이지 않으므로써 마지막 자원임을 알립니다. try문이 종료되면서 생성된 인스턴스는 자동으로 종료되기 때문에, 따로 close문을 사용하지 않아도 됩니다.

728x90

'Java' 카테고리의 다른 글

[Java]2차원 배열과 for each문  (0) 2021.11.04
Jave(Swtich문)  (0) 2021.10.23
쉽게 배우는 JAVA 2-6(예외 변수 e)  (0) 2021.08.19
쉽게 배우는 JAVA 2-5(예외1)  (0) 2021.08.19
쉽게 배우는 JAVA2-4  (0) 2021.08.15