JAVA7에서 추가된 try-with-resources 구문은 자원을 효율적으로 관리하기 위한 방법 중 하나이다. 이 구문은 파일, 네트워크 연결 또는 데이터베이스 연결과 같은 자원을 사용한 후 자동으로 해제하도록 설계되었다. 이전에는 'finally'블록에서 자원을 명시적으로 해제했어야 했는데, try-with-resources 구문을 사용하면 이 과정이 자동화되어 개발자의 실수를 줄이고 코드의 가독성을 높일 수 있다.
try-with-resources를 사용하기 위해서는 해당 자원 클래스가 'AutoCloseable'인터페이스를 구현해야 한다. 이 인터페이스는 'close()' 메소드를 포함하고 있으며, 이 메소드가 자원 해제의 핵심이다.
해당 구문을 사용한 파일을 읽는 간단한 예제다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public static void main(String[] args) {
// 파일 경로 지정
String path = "example.txt";
// try-with-resources 구문을 사용하여 파일을 열고 읽음
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("Error reading the file: " + e.getMessage());
}
}
}
/*
cat example.txt
test1
test2
test3
test4
*/
출력 결과
test1
test2
test3
test4
이 코드에서 BufferedReader는 AutoCloseable 인터페이스를 구현하고 있으므로 try() 구문 안에 선언될 수 있다. 파일 읽기 작업이 끝나면, BufferedReader의 close() 메소드가 자동으로 호출되어 자원이 해제된다. 이로써 개발자는 자원을 명시적으로 해제하는 코드를 작성할 필요가 없다.
이 구문의 도입으로 자바 개발자들을 자원 관리를 더 간편하고 안전하게 할 수 있게 되었다. 이러한 기능은 코드의 신뢰성을 높이고, 자원 누수 가능성을 줄이는 데 큰 도움이 된다.
위에서 처럼 try-with-resources 구문은 try() 괄호 안에 선언된 모든 자원에 대해 자동 해제를 보장한다. 하지만 여기서 주의할 점은, 자동으로 해제되는 자원은 try() 괄호 안에서 선언된 자원들만 해당된다는 점이 중요하다. 이 자원들은 모두 AutoCloseable 인터페이스를 구현해야하며, 이 인터페이스의 close() 메소드가 블록의 실행이 끝날 때 호출된다.
예를 들어, 다음과 같은 경우는 try-with-resources 자동 해제 대상이 아니다.
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("example.txt"));
// 여기서 파일을 읽는 작업 수행
} catch (IOException e) {
e.printStackTrace();
}
위 코드에서 BufferedReader 인스턴스 try() 구문 밖에서 선언되었기 때문에 자동으로 해제되지 않는다. 이 경우에는 여전히 finally 블록을 사용하여 close 메소드를 명시적으로 호출해야한다.
AutoCloseable 인터페이스를 구현하는 자원들은 주로 외부 시스템과의 연결이나 파일 시스템 리소스를 관리하는 클래스들이다.