try with resource
자원을 잡고, 놓아주는 작업을 try catch finally 문으로 만드는 과정은 상당히 복잡했다. 그래서 자원을 잡고, 놓아주는 작업을 간단한 형식으로 만들 필요성이 생겼다.
JAVA SE 7 이전에는 finally 문을 이용하여 자원을 놓아주는 작업을 진행했다. 하지만 JAVA SE 7부터 try-with-resource 문이 등장하여 자원 관리를 훨씬 단순하게 할 수 있게 되었다.
클래스가 AutoCloseable 인터페이스를 상속한다면 try-with-resource 문을 사용할 수 있다.
FileWriter로 만들어진 앱은 반드시 close를 해줘야 한다.
위 사진을 보면, FileWriter 클래스는 AutoCloseable 인터페이스를 상속하고 있음을 알 수 있다.
try 다음에 바로 중괄호가 아닌, 소괄호를 넣는다. 그리고 이 소괄호에 close를 시켜야 되는 것을 붙여넣는다. (세미콜론은 있으면 안 된다.) 그리고 실행할 코드를 try 문 중괄호 안에 넣고, 다음에 catch 문을 처리하면, 매우 간략하게 코드가 정리된다.
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");
// 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 with resource statements
try (FileWriter f = new FileWriter("data.txt")) {
f.write("Hello");
} catch (IOException e) {
e.printStackTrace();
}
}
}
이렇게 간략하게 정리된 것이다. try의 소괄호 안에 close가 필요한 클래스를 인스턴스화 시키는 코드를 넣었다. 자바는 이 모든 작업이 끝나고 나서 자동으로 f.close()를 내부적으로 수행해준다.
전체 try 문(try, catch, finally 등)이 종료되면 생성된 인스턴스는 자동으로 종료되기 때문에, 명시적으로 close를 이용해서 자원을 놓아주지 않는다.
try with resource 문이 활용된 코드가 훨씬 더 경제적이고 좋은 코드라고 할 수 있다.
[참고자료]
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
The try-with-resources Statement (The Java™ Tutorials > Essential Java Classes > Exceptions)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com