반응형

Java에서 리소스 사용을 위해 try catch문으로 감싸주어야 한다.

 

이때 source 사용이 끝나면 close를 해주어야하는데 간혹 사람이라면 놓칠 수 있는 부분이다.

 

이러한 close를 하지 않으면 결국 Memory leak이 생길 수 있다.

 

바로 예시를 통해 알아보자.

 

 

아래와 같이 openFile이라는 코드를 사용하고자 하는데 바로 try catch문을 잡으라고 경고 메세지가 나타난다.

이를 해결하기 위해 try catch문을 이용할 수 있다.

 

하지만 보통 실수한다면 여기서 그대로 끝낼 수 있지만 사실 해당 파일을 닫아주어야 한다.

 

이때 첫번째로 파일 닫는 것을 간과 할 수 있다.

 

하지만 닫으려 해도 close하는 상황에서 또 exception이 나타날 수 있으니 try catch가 필요하다.

 

또 이야기를 보니 close를하는데 null일 수 있기에 처리를 하라고 한다.

 

파일을 하나 열기 위해 너무 많은 코드가 소모되고 불필요한 것들이 나열된다.

 

 

try with resource

 

하지만 try with resource 구문을 이용하면 아래와 같이 한번에 해결할 수 있다.

 

아래와 같이 작성하면 try문에서 할당한 내용을 자동적으로 메모리 해제를 해주게 된다.

 

이러한 구문은 Java 1.7 이상이라면 try catch 구문에서 너무 유용하게 이용 할 수 있다.

 

 

사실 이러한 구문이 가능하기 위해서는 해당 객체가 AutoClosable를 impliment하고 있어야한다.

 

아래 코드는 실제 ParcelFileDescriptor 객체를 타고 들어가면 볼 수 있는 AutoClosable 구현체이다.

package java.io;

public interface Closeable extends AutoCloseable {
    void close() throws IOException;
}

 

 

AutoCloseable interface

 

try with resources 구문을 통해 자동 자원 반납을 지원하기 위해서는 해당 입출력 객체가 AutoCloseable 인터페이스를 구현해야 한다.

 

그 이유는 AutoCloseable은 다음과 같이 정의되어 있는데 예외가 발생하면 JVM이 구현된 close() 메서드를 호출하기 때문이다.  public interface AutoCloseable { void close() throws Exception; } 

반응형