본문 바로가기
JAVA BASE/Exception(예외)

03. [자바] -try-with-resources문

by staticClass 2020. 12. 22.

-try-with-resources문?

try-catch문의 변형 이고 입출력(I/O)과 관련된 클래스를 사용할 때 유용하다.
꼭 close를 해주어야 하는 클래스들이 있는데 -try-with resources문을 사용하면
따로 close를 호출하지 않아도 try블럭을 벗어날때 자동으로 close가 호출된다.

try-catch-finally 코드를 보자

try {
        FileInputStream fis = new FileInputStream("score.dat");
        DataInputStream dis = new DataInputStream(fis);
    } catch (IOException ie) {
        ie.printStackTrace();
    } finally {
        //finally에 close를 넣어주었고 close에도 try-catch문이 필요해서 또 try-catch를 선언했다.
        try {
            if(dis != null) {
                dis.close();
            }
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

위와 같이 close를 처리 하기 위해 try-catch를 한번 더 사용했고 그로 인해 코드가 보기에 좋지 않다.
더 나쁜 것은 try블럭과 finally블럭에서 모두 예외가 발생하면 try블럭의 예외는 무시된다는 것이다.

try-with-resources 코드를 보자

//괄호() 안에 두 문장 이상 넣을 경우 ';'로 구분한다.
try ( FileInputStream fis = new FileInputStream("score.dat") ; 
      DataInputStream dis = new DataInputStream(fis) ) {
                ...    
    } catch (IOException ie) {
        ie.printStackTrace();
    }
}

try-with-resources문의 괄호()안에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close()를 호출하지 않아도
try블럭을 벗어날때 자동으로 close()가 호출된다. 그 후 catch블럭과 finally 블럭이 실행된다.

하지만 무조건적으로 close()가 실행되는건 아니고 클래스가 AutoCloseable 인터페이스를 구현한 것이어야만 한다.

public interface AutoCloseable {
    void close() throw Exception;
}

public static void main(String[] args) {
    try(ExamClass ec = new ExamClass()){
        ec.method();
    }catch (Exception e) {
    }
}

class ExamClass implements AutoCloseable{
    public void method() throws Exception {
        System.out.println("ExamClass... method ... ing");
    } 

    public void close() throws Exception {
        System.out.println("Exam close()..");
    }
}

이 코드를 실행하면, close()가 작동한 다는 것을 알 수 있다.

ExamClass... method ... ing
Exam close()..

댓글