Java/11. 기본 API 클래스

Day 15 : Object 클래스 - finalize() : 객체 소멸자

pancakemaker 2021. 11. 8. 12:15

finalize() : Garbage Collector는 객체를 소멸하기 직전에 마지막으로 객체의 소멸자(finalize())를 실행

객체가 소멸되기 전에 마지막으로 사용했던 자원을 닫고 싶거나, 중요한 데이터를 저장하고 싶을 때 재정의

 

※ 사용 지양 : 무작위로 소멸, 호출 시점 명확하지 않음

 

finalize() 메소드 재정의

package sec03.exam06_finalize_YJ;

public class Counter {
	//필드
	private int no;
	
	//생성자
	public Counter(int no) {
		this.no = no;
	}
	
	//메소드
	@Override
	protected void finalize() throws Throwable {
		System.out.println(no + "번 객체의 finalize()가 실행됨");
	}
}

 

finalize() 메소드 실행 확인

package sec03.exam06_finalize_YJ;

public class FinalizeExample {
	public static void main(String[] args) {
		Counter counter = null;
		for(int i=1; i<=50; i++) {
			counter = new Counter(i);
			
			counter = null; //Counter 객체를 쓰레기로 만듦
			System.gc(); //쓰레기 수집기 실행 요청
		}
	}
}
21번 객체의 finalize()가 실행됨
2번 객체의 finalize()가 실행됨
3번 객체의 finalize()가 실행됨
4번 객체의 finalize()가 실행됨
5번 객체의 finalize()가 실행됨
6번 객체의 finalize()가 실행됨
7번 객체의 finalize()가 실행됨
1번 객체의 finalize()가 실행됨
23번 객체의 finalize()가 실행됨
24번 객체의 finalize()가 실행됨
25번 객체의 finalize()가 실행됨
26번 객체의 finalize()가 실행됨
27번 객체의 finalize()가 실행됨
29번 객체의 finalize()가 실행됨
28번 객체의 finalize()가 실행됨
8번 객체의 finalize()가 실행됨
9번 객체의 finalize()가 실행됨
10번 객체의 finalize()가 실행됨
11번 객체의 finalize()가 실행됨
12번 객체의 finalize()가 실행됨
13번 객체의 finalize()가 실행됨
14번 객체의 finalize()가 실행됨
15번 객체의 finalize()가 실행됨
16번 객체의 finalize()가 실행됨
17번 객체의 finalize()가 실행됨
18번 객체의 finalize()가 실행됨
19번 객체의 finalize()가 실행됨
20번 객체의 finalize()가 실행됨
22번 객체의 finalize()가 실행됨
46번 객체의 finalize()가 실행됨
30번 객체의 finalize()가 실행됨
31번 객체의 finalize()가 실행됨
32번 객체의 finalize()가 실행됨
33번 객체의 finalize()가 실행됨
34번 객체의 finalize()가 실행됨
35번 객체의 finalize()가 실행됨
36번 객체의 finalize()가 실행됨
37번 객체의 finalize()가 실행됨
38번 객체의 finalize()가 실행됨
39번 객체의 finalize()가 실행됨
40번 객체의 finalize()가 실행됨
41번 객체의 finalize()가 실행됨
42번 객체의 finalize()가 실행됨
43번 객체의 finalize()가 실행됨
44번 객체의 finalize()가 실행됨
45번 객체의 finalize()가 실행됨