JAVA

Finally와 Try with Resource

🤖 Play with Android 🤖 2021. 7. 11. 17:39
728x90


 

FileWriter 객체의 경우 파일 작업이 다 끝나고 나면 close를 이용해서 파일을 닫아주는 작업을 했다.

하지만 만약 try 문에서 FileWriter 객체를 만들고, 닫는 작업까지 다 넣었을 때,

그 중간의 파일 작업에서 예외가 발생하게 된다면 어떻게 될까?

그럼 파일을 닫아주는 작업을 실행하지 못하고 그다음 작업을 수행할 때 문제가 발생하게 될 수도 있다.

 


이런 경우에 사용하는 형식이 finally 문이다

finally 문은 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();
				}
			}			
		}
	}

}

하지만 보는 것과 같이 finally 문 안에 조건문 그리고 또 다른 예외처리 문이 들어가게 되면서

코드가 굉장히 복잡해 지는 단점이 있다.

Java SE 7 이후부터는 이러한 문제를 해결하기 위한 Try with Resource 라는 기능이 생겨났다.


 

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-with-resource 문은 try 문에 괄호를 추가하여 그 안에 사용할 자원을 정의한다.

객체를 여러 개 선언할 수도 있고, 이러한 객체들은 세미콜론으로 구별한다.

(객체의 정의 마지막에는 세미콜론을 넣지 않는다.)

전체 try 문(try, catch, finally 등)이 종료되면 생성된 인스턴스는 자동으로 종료되기 때문에

명시적으로 f.close를 이용해서 자원을 놓아주지 않는다.