728x90
반응형
0. 이 글의 목적
JAVA의 finalize에 대해 정말 간단하게 소개하기 위해
1. 일련의 가상 사례를 들어보자.
우리는 브들리(php-5년차, 급하게 java프로젝트 투입)와 찰스(java-3년차)라는 2명의 개발자를 예시로 이야기를 진행한다.
찰스 : 브들리? 이거 finalize는 왜 오버라이딩 했어요?
브들리 : java는 gc가 메모리 수거하잖아요. 로그를 좀 찍어두면 좋지 않을까 해서요.
찰스 : 아니... 이러면 답이 없는데... 하.. finalize가 뭐 하는 메서드인지는 알아요?
브들리 : 알죠? 객체 소멸자. c++에서는 직접 호출해야 하는데 java에서는 gc가 알아서 처리해 주는 거잖아요.
찰스 : ...
2. 일단 당장은 뭐가 문제인가
finalize에 대해 소멸자인 것까지는 알고 있는 것 같다. 하지만 java의 내부는 잘 모르는 것 같다.
finalize가 소멸자인 건 맞다. 이걸 gc와 같이 엮어서 생각을 했다면 다음과 같은 결론이 나올 수 있다.
언제 내 객체가 소멸(GC)되는지 모른다
3. 이건 그러면 어떻게 사용해야 하는가?
사용하지 말라. 그냥 내버려 두어라. 제발.
@Deprecated(since="9")
protected void finalize() throws Throwable { }
3-1. 심지어 jdk9부터 deprecated처리가 되었다.
3-2. finalize에서 에러가 발생하는 경우 그 아무도 핸들링할 수 없다.
그리고 finalize가 정상 수행되지 않은 경우 영영 이 객체는 메모리가 수거되지 않는다.
3-3. 2에서 언급했듯 언제 실행될지도 보장 못한다.
4. 마치며
생성은 자유며 소멸은 자유가 아니다. 제발 내버려두어라.
728x90
반응형
'JAVA' 카테고리의 다른 글
LinkedList와 ArrayList의 remove 연산 (0) | 2023.06.21 |
---|---|
Annotation과 동작 원리 (0) | 2023.01.24 |
f-lab 백엔드 면접 질문 답해보기(아직 만드는 중) (2) | 2022.12.01 |
내 자바 코드 스타일 바꿔보기, 근데 함수형을 곁들인 - filter (0) | 2022.05.07 |
자바 조금 더 잘 사용해보자 (1) (0) | 2022.03.03 |