▼ Backend/자바 (JAVA)

JAVA | try-with-resource, 자원을 자동으로 해제

Valar 2021. 12. 13. 17:05
반응형

 

기존의 자원 해제 방법 try - finally

지금까지 개발을 해오면서 파일 관련 처리를 할 때면 자원 관련 객체인 InputStreamOutputStream을 사용하다 보니(꼭 파일 관련 처리가 아니더라도) 그럴 때마다 사용했던 자원에 대한 close() 처리를 finally 에서 해주고 있었다. 큰 문제는 없었지만 클린 코드, 리팩터링 관련해서 공부하다 보니 finally에서 자원을 해제하지 않고도 자원을 해제할 수 있는 방법이 있었다.

 

try - finally

BufferedInputStream in = null;
BufferedOutputStream out = null;

try {
    in = new BufferedInputStream(inputStream);

    try {
        out = new BufferedOutputStream(response.getOutputStream());

        byte[] buffer = new byte[4096];
        int byteRead = 0;

        while ((byteRead = in.read(buffer)) >= 0) {
            out.write(buffer, 0, byteRead);
        }
    } finally {
        out.close();
    }
} finally {
    in.close();
}

 

Java7 에서 부터 추가된 try-with-resource 방법

  • try () 소괄호에서 자원을 할당받는 단계를 진행한다.
  • 이 구조를 사용하려면 해당 자원이 AutoCloseable 인터페이스를 구현해야 한다.
try (BufferedInputStream in = new BufferedInputStream(inputStream); 
	BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream())) {
    
    byte[] buffer = new byte[4096];
    int byteRead = 0;

    while ((byteRead = in.read(buffer)) >= 0) {
        out.write(buffer, 0, byteRead);
    }
}

 

AutoCloseable

실제로 AutoCloseable 인터페이스를 직접 확인해 보기 위해서 Stream 객체를 계속 따라가 보았더니 아래 내용을 확인할 수 있었다.

 

Reference

 

반응형