Try-with-Resources는 Java 7에서 처음 도입된 기능으로, 사용이 끝난 자원(resource)을 자동으로 닫아주는 것이 핵심 목적입니다. 다만 초기 버전에는 제약이 있었는데, 자원은 반드시 try 문 이전에 선언되거나 try 문 내부에서 선언되어야 했고, 그렇지 않으면 컴파일 오류가 발생했습니다.
Java 9에서는 try-with-resources가 개선되어 더 이상 try 문 내부에서 객체를 새로 선언할 필요가 없습니다. try 블록 바깥에서 이미 선언된 final 또는 사실상 final(effectively final) 변수를 그대로 참조할 수 있어 코드가 한층 간결해지고 가독성도 좋아졌습니다.
아래 예제를 통해 try-with-resources 개념이 실제로 어떻게 구현되는지 확인해 보겠습니다.
예제
import java.io.*;
public class TryWithResourceTest {
public static void main(String[] args) throws FileNotFoundException {
String line;
Reader reader = new StringReader("tutorialspoint");
BufferedReader breader = new BufferedReader(reader);
try(breader) {
while((line = breader.readLine()) != null) {
System.out.println(line);
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
위 코드에서 볼 수 있듯이, BufferedReader 객체는 try 문 밖에서 미리 선언된 후 try(breader) 형태로 그대로 전달됩니다. Java 8까지라면 컴파일 오류가 발생했겠지만, Java 9부터는 이러한 작성 방식이 정상적으로 동작합니다. try 블록이 종료되면 자원은 여전히 자동으로 닫히므로, 명시적인 finally 블록 없이도 안전하게 리소스를 관리할 수 있습니다.
출력 결과
tutorialspoint