try-with-resources
- 에플리케이션 외부 자원을 사용하는 경우 반드시 외부 자원을 해제해야 한다.
- 따라서 finally 구문을 반드시 사용해야한다.
try{
} catch {
} finally {
}
- 위의 패턴이 반복 되면서 자바에서는 Try with Resources 라는 편의 기능을 자바 7에서 도입했다.
예시
package exception.ex4;
import exception.ex4.exception.ConnectExceptionV4;
import exception.ex4.exception.SendExceptionV4;
public class NetworkClientV5 implements AutoCloseable{
private final String address;
public boolean connectError;
public boolean sendError;
public NetworkClientV5(String address) {
this.address = address;
}
...
@Override
public void close() {
System.out.println("NetworkClientV5.close");
disconnect();
}
}
- AutoCloseable 인터페이스를 구현해야한다.
- 이 인터페이스를 구현하면 try가 끝나는 시점에 close()가 자동으로 호출된다.
- 구현하는 close()에서 Exception이 터지지 않는다면 삭제해준다.
try with resources 변경 전
package exception.ex4;
public class NetworkServiceV4 {
public void sendMessage(String data) {
String address = "http://example.com";
NetworkClientV4 client = new NetworkClientV4(address);
client.initError(data);
try {
client.connect();
client.send(data);
} finally {
client.disconnect();
}
}
}
try with resources 변경 후
package exception.ex4;
public class NetworkServiceV5 {
public void sendMessage(String data) {
String address = "http://example.com";
try (NetworkClientV5 client = new NetworkClientV5(address)) {
client.initError(data);
client.connect();
client.send(data);
}
}
}
- 위와 같이 사용하면 try with resources 구문이다.
- try with resources 구문은 try 괄호 안에 사용할 자원을 명시한다.
- 이 자원은 try 블럭이 끝나면 자동으로 AutoCloseable.close()를 호출해서 자원을 해제한다.
try with resource 장점
- 리소스 누수 방지
- 모든 리소스가 제대로 닫히도록 보장한다.
- 실수로 finally 블럭을 적지 않거나, finally 블럭 안에서 자원 해제 코드를 누락하는 문제를 예방 할 수 있다.
- 코드 간결성 및 가독성
- 명시적인 close() 호출이 필요 없어 코드가 더 간결하고 읽기 쉬워진다.
- 스코프 범위 한정
- 예를 들어 리소스로 사용되는 client 변수의 스코프가 try 블럭 안으로 한정된다.
- 따라서 코드 유지보수가 더 쉬워진다.
- 조금 더 빠른 자원 해제
- 기존에는 try -> catch -> finally 로 catch이후에 자원을 반납했다. 하지만 Try with resource 구문은 try 블럭이 끝나면 즉시 close()를 호출 한다.