2020-12-12
자바의 특징 중 하나는 자동으로 참조하지 않는 배열이나 객체를 Garbage Collector를 사용해 힙 영역에서 제거시킨다. 이러한 기능을 수행하는 메서드가 바로 finalize()이다. 자동으로 실행되는 해당 메서드를 사용자가 원할 경우 직접 오버 라이딩하여 사용할 수 있는데, 이와 같은 방법을 알아보도록 하자.
package Finalize;
public class check {
private int checkNum;
public check(int checkNum) {
this.checkNum =checkNum;
}
@Override
protected void finalize() throws Throwable {
System.out.println(checkNum + "에 있는 finalize()실행");
}
}
위의 코드는 finalize가 실행되는 모습을 콘솔창에 출력하기 위해 재정의한 클래스이다. 단순 checkNum이라는 변수를 활용해서 어떻게 동작하는지 알아보자.
package Finalize;
public class main {
public static void main(String[] args) {
for(int i = 0; i < 20; i++) {
check test = new check(i);
test = null;
//null 값을 넣어 기존에 있는 값을 쓰레기로 만듬
System.gc();
//가비지 컬렉터 실행
//재정의된 finalize가 실행됨 다만 순서대로 제거되지 않고 무작위로 제거된다.
//또한 쓰레기가 됬다고 해서 전부제거 되지는 않고 메모리의 용량여부를 체크하여 제거가 수행된다.
}
}
}
우선 for문을 돌면서 check클래스의 test라는 이름의 객체를 계속해서 만들어주고 이후 null값을 주어 해당 객체를 쓰레기 데이터로 만들어주었다. 이후 System의 정적 메서드의 gc() 통칭 가비지 컬렉터를 실행시키면, 구체적으로 쓸모없어진 쓰레기 데이터들이 어떤 순서로 어떻게 제거되는지 확인할 수 있다.
위의 결과를 보면 결코 쓰레기가 된 순서대로 데이터가 제거되는 것이 아닌 무작위로 제거되는 것을 확인할 수 있다. 또한 쓰레기가 된 데이터를 전부 삭제시키는 것이 아닌, 메모리의 용량에 따라 소멸 여부를 결정하게 되는 것도 확인할 수 있다. (무작위로 제거되기 때문에 실행마다 콘솔 창에 출력되는 값은 달라질 수 있다.)