자바는 두 가지 객체 소멸자를 제공한다.
그 중 finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.
오동작, 낮은 성능 이식성 등 다양한 문제의 원인이 된다.
finalizer는 나름의 쓰임새가 있지만, 기본적으로 사용하지 말아야 한다.
그래서 자바 9에서는 finalizer를 deprecated API로 지정했다.
cleaner가 그 대안으로 소개되었다.
cleaner는 finalizer보다 덜 위험하지만, 예측할 수 없고 느려서 일반적으로 사용하지 않는다.
finalizer와 cleaner는 즉시 수행된다는 보장이 없다.
객체에 접근할 수 없게 된 후 실행되기 까지 얼마나 걸릴지 알 수 없다.
즉, 위 두가지로는 제때 실행되어야 하는 작업은 절대 할 수 없다.
파일 닫기를 finalizer와 cleaner에게 맡기게 되면 문제가 발생할 가능성이 크다.
시스템이 동시에 열 수 있는 파일 개수에 한계가 있기 때문이다.
시스템이 finalizer와 cleaner의 실핼을 게을리해새서 파일을 꼐속 열어둔다면
새로운 파일을 열지 못해 프로그램이 종료될 수도 있다.
자바는 finalizer나 cleaner의 수행 시점 뿐아니라 수행 여부도 보장하지 않는다.
따라서 상태를 영구적으로 수정하는 작업에서는 절대 위의 두가지를 사용하면 안된다.
이를 보완하기 위에선 AutoCloseable를 구현해주자.
클라이언트에서 인스턴스를 다 쓰고나면 close 메서드를 호출하면 된다.
일반적으로 예외가 발생해도 제대로 종료되도록 try-with-resources를 사용해야한다.
정리하자면, 되도록이면 위의 두가지는 사용하지 말자.
성능에도 어마무시하게 치명타임으로..!!
참고 : 책, 이펙티브 자바 3/E
'Backend > Java' 카테고리의 다른 글
싱글톤 패턴(Singleton Pattern) 예제 코드로 이해하기 (0) | 2022.03.08 |
---|---|
[이펙티브자바] try-with-resources를 사용하자. (0) | 2021.07.20 |
[이펙티브자바] 다 쓴 객체 참조를 해제하자. (0) | 2021.07.07 |
[이펙티브자바] 불필요한 객체 생성을 피하자. (0) | 2021.07.06 |
[이펙티브 자바] 의존 객체 주입을 사용하자. (0) | 2021.06.10 |