Java

[Effective Java] 2-8. 객체 생성과 파괴: 소멸자 사용을 피하라

noahkim_ 2024. 12. 27. 04:15

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.


1. 소멸자 사용 피하기

Finalizer

  • 자바에서 객체가 더이상 필요하지 않을 때 정리 작업을 수행하는 매커니즘
  • 권장되지 않음

 

예측 불가
  • GC가 객체를 회수한 후에만 실행됨
  • 실행 시점이나 실행 여부를 보장할 수 없음
  • GC 알고리즘에 따라 실행 타이밍이 달라질 수 있음

 

성능 문제
  • 추가적인 처리 비용 발생

 

대체 방안 존재
  • 명시적인 종료 메서드
  • try-with-resources 구문

 

2. Try-With-Resources

try (
    InputStream in = new FileInputStream("input.txt");
    OutputStream out = new FileOutputStream("output.txt")
) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
    }
}

 

자동 자원 해제

  • AutoCloseable 인터페이스를 구현한 객체는 블록이 끝날 떄 자동으로 닫힘
  • 명시적으로 자원을 닫을 필요 없음

 

예외 처리 개선

  • 모든 예외를 추적
  • 숨겨진 예외를 suppressed로 표시됨

 

명시적으로 예외 처리 가능
static String readFirstLine(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    } catch (IOException e) {
        return "Default Value";
    }
}