자바 라이브러리에는 close 메소드를 호출하여 직접 닫아줘야 하는 자원이 많다.

ex) InputStream, OutputStream, Connection객체(DB)

😵 Try - Finally

자원이 둘 이상인 경우 try-finally방식은 다음 두가지 단점이 있다.

  1. try문의 중첩으로 인한 지저분한 코드
  2. 묻혀버리는 예외

아래 코드를 보자

static void copy(String src, String dst) throws IOException {
	InputStream in = new FileInputStream(src);
	try {
		OutputStream out = new FileOutputStream(dst);
		try {
			byte[] buf = new byte[BUFFER_SIZE];
			int n;
			while ((n = in.read(buf)) >= 0)
			out.write(buf, 0, n);
		} finally {
			out.close();
		}
	} finally {
		in.close();
	}
}

위 코드에서 try블록안에 다시 try블록이 생성되어, 코드는 길어지고 가독성이 떨어지게 된다.

또한 아래의 예시코드를 보자

Untitled

main문에서 try블록과 finally블록에서 모두 예외가 발생할 수 있다. 다만 이때, 두번째 예외가 첫번째 예외를 완전히 가려버릴 수도 있다.

스택 추적 내역에 첫번째 예외에 관한 정보가 남지않아, 디버깅을 어렵게 만들 수 있다.

따라서 다음과 같이 try-with-resource로 고쳐 주자

💎 Try-With-Resources

try-with-resources는 JDK7부터 추가된 기능으로, try에 자원 객체를 전달하면, try코드블록이 끝날때, 자동으로 자원을 종료해주는 기능이다. 즉, 따로 finally블록이나 catch블록에 별도 종료(close())처리를 하지 않아도 된다.

이 구조를 사용하려면 해당 자원이 AutoCloseable 인터페이스를 구현해야한다.

AutoCloseable은 단순히 void를 반환하는 close메서드 하나만 정의한 인터페이스이다.