resource는 외부 데이터(DB, Network, File)를 말합니다.
이런 resource들은 자바 내부에 위치한 요소들이 아니기 때문에, 이러한 프로세스 외부에 있는 데이터에 자바 코드에서 접근하려고 할 때 문제(예외)가 발생할 수 있는 여지가 존재합니다.
입출력에 관련된 resource들에 접근해서 사용하고 나면 닫는 것이 굉장히 중요합니다.
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
FileWriter file = null;
try {
file = new FileWriter("data.txt");
file.write("Hello World");
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
// close()에서 발생하는 예외를 처리하기 위해서 아래와같이 바꿀수도 있지만 코드가 복잡해져서 좋지않다.
try {
file.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
외부 resource는 사용했으면 반드시 닫아주도록 file.close()로 처리했습니다.
또한 file.close() 동작도 잘못되면 IOException이 발생할 수 있기에 이 부분도 예외 처리를 해줘야 합니다.
이러면 예외처리를 하기 위해 try-catch문을 2번 여러 번 사용하게 됩니다. 그래서 이 부분을 편하기 사용하기 위해 try-with-resources문을 자바 7버전부터 내놓아습니다.
try-with-resources문은 주로 입출력(I/O)과 관련된 클래스를 사용할 때 굉장히 유용합니다.
try 블록에 파일을 열거나 자원을 할당하는 명령문을 명시하면, 해당 try 블록이 끝나자마자 자동으로 파일을 닫거나 할당된 자원을 해제해줍니다.
try() 이 괄호 안에 객체를 생성하는 문장을 넣으면, 따로 close()를 호출하지 않아도 try 블럭을 벗어나는 순간 자동적으로 close()가 호출됩니다.
그리고 다음에 catch 블럭 또는 finally 블럭이 수행됩니다.
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (FileWriter file = new FileWriter("data.txt")) { // 파일을 열고 모두 사용되면 자동으로 닫아준다
file.write("Hello World");
} catch (IOException e) {
e.printStackTrace();
}
}
}
여러개의 I/O 객체일 경우 문장을 2개 이상 넣기도 가능합니다.
// try 괄호 안에 두문장 이상 넣을 경우 ';'로 구분한다.
try(
FileInputStream fis = new FileInputStream("a.txt"); // 반드시 세미콜론으로 각 문장을 구분
DataInputStream dis = new DataInputStream(fis)
) {
while(true){
score - dis.readInt();
System.out.println(score);
sum += score;
}
} catch (EOFException e){
System.out.println("점수의 총합은 " + sum + "입니다.");
} catch (IOException ie){
ie.printStackTrace();
}
try-with-resources 문이 사용 가능한 이유는 AutoCloseable 인터페이스를 구현받기 때문입니다.
FileWriter 클래스 역시 클래스 정의문에 들어가면 AutoCloseable 이라는 인터페이스를 구현한 것을 볼 수 있습니다.

try- catch 사용의 경우
자원 관리가 필요 없는 경우 : 자원을 사용하지 않는 코드 블록에서는 try-catch 문을 사용할 수 있습니다.
여러 개의 자원이나 다양한 예외 처리가 필요한 경우, try-catch 문을 사용하여 더 세부적으로 예외를 처리합니다.
자원 해제 필요 없는 객체 : AutoCloseable 인터페이스를 구현하지 않는 객체의 겨우 try-with-resources를 사용할 수 없습니다.
정리
자원을 사용하는 경우 : 파일, DB 연결, 네트워크 소켓 등과 같은 자원을 다룰 때는 try-with-resources를 사용하는 것이 좋습니다.
자원 사용이 없는 경우 : 일반적인 예외 처리나 자원 관리가 필요 없는 경우 try-catch를 사용할 수 있습니다.