본문 바로가기
  • soobinhand의 기술 블로그
도서/이펙티브 자바 - Joshua Bloch

아이템 8 - finalizer와 cleaner 사용을 피하라.

by soobinhand 2022. 1. 27.
728x90

자바는 두 가지 객체 소멸자가 있다. 

그 중, finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.

오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다.

기본적으로 '쓰지 말아야' 한다.

 

cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.

 

즉, 두 객체 소멸자는 제때 실행되어야 하는 작업엔 절대 사용하면 안된다.

상태를 영구적으로 수정하는 작업에서는 절대 두 객체 소멸자에 의존해서는 안 된다.

 

두 객체 소멸자는 심각한 성능 문제도 동반한다.

 

finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다.

 

그렇다면 파일이나 스레드 등 종료해야 할 자원을 담고 있는 객체의 클래스에서 두 객체 소멸자를 대신해줄 묘안은 무엇인가?

그저 AutoCloseable을 구현해주고, 클라이언트에서 인스턴스를 다 쓰고 나면 close 메서드를 호출하면 된다.

 

그럼 도대체 이 두가지는 언제 쓰나??

첫 번째는 자원의 소유자가 close메서드를 호출하지 않는 것에 대비한 안전망 역할이다.

두 번째는 네이티브 피어와 연결된 객체에서다.

 

핵심 정리

cleaner는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 물론 이런 경우라도 불확실성과 성능 저하에 주의해야 한다.

 

관련 코드

 

GitHub - Soobinhand/effective_java: 이펙티브 자바

이펙티브 자바. Contribute to Soobinhand/effective_java development by creating an account on GitHub.

github.com

 

728x90

댓글