finalize() 메소드란?
JVM이 메모리 누수를 방지하기위해 실행하는 GC가 수행될 때 더 이상 사용하지 않는 자원에 대한 정리작업을 할 때 호출하는 메소드. 이러한 종료자의 치명적인 단점이 있다.
바로 즉시 실행되리라는 보장이 전혀 없다는 것.
종료자의 문제점은 이 뿐만이 아니다.
일반적으로는 uncaught 예외가 던져지면 스레드는 종료되고 StackTrace가 표시되지만, 종료자 안에서는 아니다. 경고문 조차 발생하지 않는다..
또한, 종료자를 사용하면 프로그램 성능이 심각하게 떨어진다. (객체 메모리 해제 등의 이유로..)
그럼 자원의 반환 / 삭제는 어떻게?
정말 정말 종료자는 쓸 곳이 없는 녀석인가..!? ( 이것도 1번 빼고 딱히..?)
1. 명시적 종료 메서드 호출을 잊을 경우에 대비하는 안전망의 역할. 종료자는 그런 자원을 발견하게 될 경우 반드시 경고 메세지를 로그로 남겨서 코드가 잘못되어있음을 알려야 한다.
2.네이티브 피어와 연결된 객체를 다룰 때 사용될 수도 있다.
3.하위 클래스에서 상위 클래스 종료자를 재정의 하면서 상위 클래스 종료자 호출을 잊으면, 상위 클래스 종료자는 절대 호출되지 않는다. 따라서 아래와 같이 처리할 수 있다.
위와 같이 상위 클래스의 종료자 호출을 하지 않았을 때의 문제를 방지하는 한 가지 방법은, 종료되어야 하는 모든 객체마다 여벌의 객체를 하나 더 만드는 것이다.
위와 같은 익명클래스를 종료보호자라고 부른다.
요약
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[모든 객체의 공통 메서드]규칙9.equals를 재정의 할 때는 반드시 hashCode도 재정의하라 (0) | 2017.04.19 |
---|---|
[모든 객체의 공통 메서드]규칙8.equals를 재정의할 때는 일반 규약을 따르라. (0) | 2017.04.18 |
[객체의 생성과 삭제]규칙6. 유효기간이 지난 객체 참조는 폐기하라. (0) | 2017.04.16 |
[객체의 생성과 삭제]규칙5. 불필요한 객체는 만들지 말라. (0) | 2017.04.16 |
[객체의 생성과 삭제]규칙4. 객체 생성을 막을 떄는 private 생성자를 사용하라 (0) | 2017.04.16 |