Java의 소멸자

Hiten Kanwar 2023년10월12일
Java의 소멸자

소멸자는 생성자의 반대입니다. 한편, 생성자가 객체를 초기화하는 데 사용되는 경우 소멸자는 객체가 점유한 리소스를 해제하는 객체를 파괴(삭제)하는 데 사용됩니다.

이 자습서에서는 Java의 소멸자, 작업 및 메서드에 대해 설명합니다.

Java에는 소멸자가 없으며 이에 직접적으로 상응하는 것도 없습니다. 그럼에도 불구하고 강력한 언어이며 그 이유 중 하나는 가비지 수집기입니다. Java는 소멸자와 비슷하게 작동하는 가비지 수집기를 제공합니다. JVM(Java Virtual Machine)에서 실행되는 프로그램(Thread)인 Garbage Collector는 사용하지 않는 개체를 삭제하여 메모리를 자동으로 해제합니다.

Java에서 메모리 할당 및 할당 해제는 이 가비지 수집기에 의해 효율적으로 처리됩니다. 개체의 수명 주기가 완료되면 가비지 수집기가 나타나 해당 개체를 삭제하고 해당 개체가 차지하는 메모리를 할당 해제하거나 해제합니다. 이 방법은 비결정적 종료자라고도 합니다. 그러나 문제는 이 메서드(종료자)의 호출이 암시적으로 호출되기 때문에 보장되지 않는다는 것입니다.

Java에서 소멸자 및 finalize() 메서드 작업

Java에서 객체가 생성되면 힙에서 메모리를 차지합니다. 스레드는 이러한 개체를 추가로 사용하며 스레드가 개체를 사용하지 않으면 가비지 수집기에 의한 가비지 수집 대상이 됩니다. 따라서 이러한 개체가 차지하는 메모리는 이제 비어 있게 되며 모든 새 엔터티에서 추가로 사용할 수 있습니다. 가비지 수집기가 객체를 파괴하면 JRE(Java Runtime Environment)는 finalize() 메서드를 호출하여 네트워크 및 데이터베이스 연결과 같은 연결을 닫습니다.

우리는 가비지 수집기가 개체를 실행하고 파괴하도록 강제할 수 없습니다. 그러나 여기서 Java는 대체 방법을 제공합니다. 자바 객체는 소멸자와 유사하게 작동하는 finalize() 메소드를 제공합니다. 그러나 한 번만 호출할 수 있습니다.

이해해야 할 점은 finalize() 메서드는 소멸자가 아니지만 추가 보안을 제공하고 작업(프로그램)을 종료하기 전에 파일을 닫는 것과 같은 외부 리소스를 추가로 보장하고 소멸자와 매우 유사하게 작동한다는 것입니다.

아래 코드를 참조하십시오.

public class Dest_java {
  public static void main(String[] args) {
    Dest_java des = new Dest_java();
    des.finalize();
    des = null;
    System.gc();
    System.out.print("main() method ");
  }
  protected void finalize() {
    System.out.print("Destroyed ");
  }
}

출력:

Destroyed main() method Destroyed