finally에 close() 함수를 호출하지 않고,
자동으로 자원을 해제하는 방법을 알아보자!
Socket test = null;
try {
test = new Socket("host", 8888);
} finally {
if(test != null) {
test.close();
}
}
자바 7 이상 부터 사용 가능하다
try-with-resource 문법을 이용한다
try(Socket test = new Socket("host", 8080)) {
// example...
}
리소스 클래스가 AutoCloseable 이라는 인터페이스를 구현해야 한다
Socket 클래스를 살펴보자// AutoCloseable 인터페이스를 구현한 클래스는 자동으로 자원을 해제할 수 있다
public interface AutoCloseable
// Closeable 인터페이스는 AutoCloseable 인터페이스를 상속한다
public interface Closeable extends AutoCloseable
// 소켓 클래스는 Closeable 인터페이스를 구현한다. 따라서 소켓 클래스는 자동으로 자원을 해제할 수 있다
public class Socket implements java.io.Closeabletry(Socket test = new Socket("host", 8080); // 이렇게 세미콜론으로 구분하기
Socket test2 = new Socket("host2", 8080)) {
// example...
}
자원 해제를 실수로 누락하는 상황이 없다.
🧐 try-with-resource방식을 이용하면 명시적으로 close()함수를 호출할 필요없다.
코드 가독성을 높인다
🧐 try-finally 방식의 자원해제 과정은 어쩔 수 없이 많은 들여쓰기를 생성한다.
finally {
if(test != null) { // 1 indent
test.close(); // 2 indent
}
}