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; }
'Basic > Java' 카테고리의 다른 글
Intellij 한글 깨짐 현상 및 해결 방법 (0) | 2019.12.29 |
---|---|
Java multi catch 구문 개념 및 이용 (0) | 2019.12.24 |
얕은 복사, 깊은 복사 개념 및 코드 (0) | 2019.12.15 |
Eclipse 자주 사용하는 단축키 모음 (0) | 2019.11.07 |
ReentrantLock이란? (0) | 2019.08.01 |