try-with-resource 및 예외 기초

고라니·2021년 8월 11일
Java SE 7부터 try-with-resource 문이 등장하여 자원 관리를 훨씬 단순하게 할 수 있게 됨.
클래스가 AutoCloseable 인터페이스를 상속한다면 try-with-resource 문에 사용할 수 있다.
기존에 리소스 사용시 finally 문에 f.close(); 가 강제되면서 그것 또한 예외처리를 해줘야하는 더러운(?) 코드가 되는데, try 문에 괄호를 추가하여 그 안에 사용할 자원을 정의함으로써 간단하게 코드를 짤 수 있다.
import java.io.FileWriter;
import java.io.IOException;

public class CheckedExceptionApp {

	public static void main(String[] args) {
		FileWriter f = null;
		try {
			f = new FileWriter("data.txt");
			f.write("Hello");
			// close를 하기 전에 예외가 발생한다면 close가 실행되지 않음
			// f.close();
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			if (f != null) {
				try {
					f.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}			
		}
	}

}

위,아래 코드는 놀랍게도 같다...!

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

public class TryWithResource {

	public static void main(String[] args) {
		try (FileWriter f = new FileWriter("data.txt")) {
			f.write("Hello");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
객체를 여러 개 선언할 수도 있고, 세미콜론(;)으로 구별합니다.
객체의 정의 가장 마지막에는 세미콜론(;)을 넣지 않습니다.
전체 try 문(try, catch, finally 등)이 종료되면 생성된 인스턴스는 자동으로 종료되기 때문에 명시적으로 close를 이용해서 자원을 놓아주지 않습니다.
-출처: 생활코딩 쉽게 배우는 자바

Checked exception vs Unchecked exception

Checked exception은 try catch 또는 throws를 이용하여 잡지 않는다면 컴파일이 되지 않음. ( Throwable로부터 상속된 모든 클래스에서 RuntimeException을 제외한 모든 에러와 예외들에 해당함.)

반면 unchecked exception 은 RuntimeException 클래스로부터 상속된 예외들이며, 컴파일 가능 및 실행 할 수 있다. 그러나 프로그램 실행 중 예외가 발생할 수 있다.

왜 굳이 나눴을까? (더 공부 필요)
간단하게는 Unchecked exception은 사용자의 실수로 발생할 수 있는 것들이기 때문에 실행이 가능하게 했다라고 생각하면 된다.

profile
공부를 열심히 하는 학부생

0개의 댓글