View on GitHub

programming-study

허원철의 개발 블로그

파이널라이저의 사용을 피하자

파이널라이저(finalizer)는 예측 불가에다가 위험하기도 하며 일반적으로 불필요하다. (C++ 소멸자와 다르다.)

단점1. 신속하게 실행된다는 보장이 없다.

파이널라이저의 빠르기는 주로 가비지 컬렉션 알고리즘에 달려있다.

단점2. 반드시 실행 될 것인지도 보장하지 않는다.

단점3. 객체의 상태가 불완전해질 수 있다.

단점4. 성능 저하가 발생한다.

파이널라이즈는 언제 사용하나?

1. 종료 메소드 호출이 누락된 객체 경우

2. 네이티브 피어 객체

네이티브란? 자바 외의 다른 프로그래밍 언어(C와 C++ 같은)를 의미하며, 플랫폼에 종속적인 기계어 코드를 만드는데 이를 네이티브 피어라 한다.

네이티브 피어 객체는 자바에서 객체가 소멸되어도 가비지 콜랙터가 알지 못 하며, 재사용할 수 없다.</br> -> 파이널라이저 필요

파이널라이저는 연쇄 호출이 되지 않는다.</br> -> 부모 클래스가 존재하는 서브 클래스에서는 try~finally를 활용하여 super.finalize()를 실행해준다.

파이널라이저 가디언: 해당 객체를 파이널라이즈를 호출 하면서 다른 객체의 파이널라이즈도 실행하는 방법