티스토리 뷰
* 이펙티브 자바 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
'JAVA' 카테고리의 다른 글
equals를 재정의할 때는 hashCode도 같이 재정의하자 (0) | 2022.07.18 |
---|---|
equals 메서드 정의는 일반 규약을 따르자 (0) | 2022.07.18 |
더 이상 사용되지 않는 객체는 제때 처리하자 (0) | 2022.07.17 |
불필요한 객체를 만들지 말자 (0) | 2022.07.17 |
객체 생성을 막을때는 private 생성자 (0) | 2022.07.15 |