728x90
자바는 두 가지 객체 소멸자가 있다.
그 중, finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.
오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다.
기본적으로 '쓰지 말아야' 한다.
cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.
즉, 두 객체 소멸자는 제때 실행되어야 하는 작업엔 절대 사용하면 안된다.
상태를 영구적으로 수정하는 작업에서는 절대 두 객체 소멸자에 의존해서는 안 된다.
두 객체 소멸자는 심각한 성능 문제도 동반한다.
finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다.
그렇다면 파일이나 스레드 등 종료해야 할 자원을 담고 있는 객체의 클래스에서 두 객체 소멸자를 대신해줄 묘안은 무엇인가?
그저 AutoCloseable을 구현해주고, 클라이언트에서 인스턴스를 다 쓰고 나면 close 메서드를 호출하면 된다.
그럼 도대체 이 두가지는 언제 쓰나??
첫 번째는 자원의 소유자가 close메서드를 호출하지 않는 것에 대비한 안전망 역할이다.
두 번째는 네이티브 피어와 연결된 객체에서다.
핵심 정리
cleaner는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 물론 이런 경우라도 불확실성과 성능 저하에 주의해야 한다.
관련 코드
728x90
'도서 > 이펙티브 자바 - Joshua Bloch' 카테고리의 다른 글
아이템 10 - equals는 일반 규약을 지켜 재정의하라. (0) | 2022.01.27 |
---|---|
아이템 9 - try-finally 보다는 try-with-resources를 사용하라. (0) | 2022.01.27 |
아이템 7 - 다 쓴 객체 참조를 해제하라. (0) | 2022.01.27 |
아이템 6 - 불필요한 객체 생성을 피하라. (0) | 2022.01.26 |
아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2022.01.26 |
댓글