면접 질문으로 try-with-resources에 대해 질문 받았으나 재대로 대답하지 못하였습니다.
이에 대한 대답을 준비하기 위해 블로그에 try-with-resources가 등장한 배경부터 사용 방법까지 정리하고자 합니다.
이전에는 파일이나 네트워크 연결과 같은 자원을 사용한 후에는 꼭 닫아줘야 했습니다. 이를 위해 try-catch-finally 구조를 사용했지만, 이러한 방식은 몇 가지 문제점을 가지고 있었습니다.
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream("data.txt");
bis = new BufferedInputStream(fis);
// 작업 수행
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bis != null)
bis.close();
if (fis != null)
fis.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
코드가 길어지고 복잡해지면서 가독성이 떨어진다.
예외 처리와 자원 반납 코드가 분리되어 예외 발생 시 적절한 대응이 어려워진다.
실수로 자원을 반납하지 않을 수 있고, 반대로 예외 발생 시 자원을 정상적으로 반납하지 못할 수 있다.
Java 7에서는 이러한 문제를 해결하기 위해 try-with-resources 문법이 도입되었습니다. 이를 사용하면 코드가 간결해지고 자원 관리에 대한 예외 처리가 효율적으로 이루어집니다.
try (FileInputStream fis = new FileInputStream("data.txt");
BufferedInputStream bis = new BufferedInputStream(fis)) {
// 작업 수행
} catch (IOException e) {
e.printStackTrace();
}
try-with-resources를 사용하려면 반납해야 할 자원을 try 구문의 괄호 안에 정의하면 되며 try 블록이 수행된 이후 알아서 자원을 닫아준다. 이런 식으로 try 블록에 소괄호로 선언되는 자원은 인터페이스인 AutoCloseable의 구현체여야 한다. 빈번하게 사용되는 BufferedReader나 Input/OutputStream, java.sql.Connection 등은 이미 이 인터페이스를 상속하고 있으며 AutoCloseable은 close 메서드 하나만 정의하면 되는 간단한 인터페이스다.
면접관이 "try-with-resources에 대해 어떻게 생각하고 있나요?"라는 질문을 한다면 다음과 같이 대답할 수 있습니다.
Java의 try-with-resources는 자원 관리를 효과적으로 할 수 있게 도와주는 문법입니다. 이전에는 try-catch-finally 구조를 사용하여 자원을 반납했는데, 이 방식은 코드가 복잡해지고 가독성이 떨어지며, 예외 처리와 자원 반납 코드가 분리되어 예외 발생 시 적절한 대응이 어려워지는 문제가 있었습니다.
try-with-resources는 이러한 문제를 해결하기 위해 도입되었습니다. 이를 사용하면 코드가 간결해지고 가독성이 향상됩니다. 괄호 안에서 자원을 초기화하면서, 이후에는 자동으로 자원이 닫히게 됩니다. 이렇게 하면 명시적으로 자원을 닫아주는 번거로움과 실수를 피할 수 있어 개발자들에게 많은 편의를 제공하고 있습니다.