파이널라이저 그게뭐임 먹는거임? 우걱우걱..
일반적인 반응입니다(저를 기준으로).

제목 그대로 파이널라이저 쓰지말죠? 라는 내용입니다.

C++에서 소멸자 처럼 행동하는 녀석입니다.라고 생각하면 안된다고 합니다.
일반적으로 C++에서는 소멸자가 호출되는 즉시 객체가 뒈집제거됩니다.

근데 자바는 안그래요.
애당초 finalizer이라는놈은 protected 라는 범위제한을 받기 때문에 밖에서는 호출도 안됩니다.
그럼 파이널라이저는 어떻게 호출되느냐?
System.gc 라던가 System.runFinalization 이라던가 하는놈을 호출하면 된다고 합니다 만은..
저거 호출한다고 당장 GC가 실행되지도 않는다고 하네요. 게다가 일반적인 GC를 통해 정리되는거보다 몇백배 느리기까지 하다고합니다.

아니 그럼 대체 왜만들어둔거임?
필요하니까 만들었겠죠..

책에서 파이널라이저가 유용한 몇가지 상황을 설명하는데 가끔 InputStream이나 OutputStream 을 쓸때 close를 호출 안하고 끝나도 뭐 알아서 잘되는 경우가 많습니다.
왜그럴까요?

이건 finalizer에서 close 를 하기때문입니다.
혹시 close를 안하고 끝났는데 아무도 객체를 참조하지 않고 있다.  근데 객체는 제거되었다. 라고 한다면 프로그램이 종료될때까지 파일이 열린채로 있을겁니다. 그러면 동시에 자원을 접근하지 못하게되어있는 상황에서 프로그램이 끝날때까지 다른곳에서는 파일을 접근 할수가 없게됩니다.

이런 경우를 방지 하기 위해서 파이널라이저에서 열린 파일을 닫는 작업을 해주게 되는겁니다.
다시말해 안전장치라는거죠.

두번째 사용처는 JNI를 사용할때 쓴답니다.
native 메소드를 이용해서 접근하는 C나 C++함수에서 객체를 생성해서 유지한다면 java에서는 이놈이 있는지조차 알수가 없습니다. 이때 finalizer을 오버라이드 해서 native 함수에서 사용하던 객체를 해제해주는 과정을 포함시킬 필요가 있습니다.


정리. 파이널라이저 쓰지맙시다
Posted by 동적할당
: