티스토리 뷰

JAVA

종료자 사용을 피하자

세댕댕이 2022. 7. 17. 23:00

* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다.

 

7. 종료자 사용을 피하라

종료자(finalizer)는 예측 불가능하고, 대체로 위험하고, 일반적으로 불필요하다.

 

근데 잠깐.. 종료자가 뭐지? 한번도 들어보지를 못했다.

GC 수행을 요청하는 메서드와 관련이 있는 것 같은데.. (System.gc(), System.runFinalization() 등..)

그런데 Finalizer는 자바 9에서는 Deprecated된 개념으로, Cleaner 라는 개념으로 대체되었다고 한다.

어차피 쓰지 않을 것이었다!

 

그래서 그냥 자원을 해제할 때에는 try-with-resources 구문을 사용하는 것이 깔끔쓰하다.

 

그러니 try-with-resources 문에 대해서나 알아보자

 

try-catch-fianlly 의 경우에는 try 블록에서 자원을 할당하고, 예외 유무에 상관없이 finally 블록에서 자원을 해제해주는 방식이었다.

-> try-finally 속 try-finally 문 중첩이 빈번하게 발생하고 if문 작성 등으로 코드가 길어지고, 가독성이 떨어진다.

try {
    Scanner scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}

이를 개선하기 위해 try-with-resources가 등장했는데, try 소괄호 내에 할당할 자원들을 지정해주고, try 블록을 벗어나면 자동으로 close() 를 호출해 개발자가 자원 해제에 대해 신경 쓸 필요없게 만들어준다.

(close()가 호출되는 것은 AutoCloseable 인터페이스를 구현한 객체에 한해서 지원)

try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} // 자동으로 close() 메서드 호출 후 자원 해제

//////

// Scanner 클래스는 Closable 인터페이스를 구현한다!!
public final class Scanner implements Iterator<String>, Closeable {
	...
}

-> catch에서는 예외처리만 담당할 수 있고, 자원 해제를 위해 사용되던 finally는 굳이 필요가 없어졌다

 

참고: https://www.baeldung.com/java-try-with-resources

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함