문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문
이 설명서는 보관되지만 유지 되지 않습니다.

Object.Finalize 메서드

업데이트: 2010년 12월

가비지 수집에서 회수하기 전에 개체에서 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다.

네임스페이스:  System
어셈블리:  mscorlib(mscorlib.dll)

protected virtual void Finalize()

Finalize 메서드는 현재 개체를 삭제하기 전에 현재 개체에서 보유하고 있는 관리되는 리소스에서 정리 작업을 수행하는 데 사용됩니다. 메서드는 보호되었기 때문에 이 클래스 또는 파생 클래스를 통해서만 액세스할 수 있습니다.

GC.SuppressFinalize 를 호출했지만 개체가 종료에서 제외되지 않은 경우, 이 메서드는 해당 개체에 액세스할 수 없게 되었을 때 자동으로 호출됩니다. 응용 프로그램 도메인이 종료되는 동안 종료에서 제외된 개체를 액세스할 수 있다고 하더라도 해당 개체에 Finalize가 자동 호출됩니다. GC.ReRegisterForFinalize 와 같은 메커니즘을 사용하여 개체가 재등록되지 않고 이후에 SuppressFinalize가 호출되지 않는다면 주어진 인스턴스에서 Object.Finalize을 자동으로 한번만 호출합니다.

파생 형식에서의 Finalize 구현은 해당 기본 형식의 Finalize 구현을 호출해야 합니다. 이 경우에만 응용 프로그램 코드에서 Finalize를 호출할 수 있습니다.

참고참고

C# 컴파일러에서는 Finalize 메서드를 직접 구현할 수 없으므로 C# 소멸자는 해당 기본 클래스의 소멸자를 자동으로 호출합니다.

Finalize 작업은 다음과 같이 제한됩니다.

  • 가비지가 수집될 때 종료자가 실행되는 시간은 정의되어 있지 않습니다. Close 메서드나 Dispose 메서드를 호출했을 때만 특정 시간에 리소스가 해제됩니다.

  • 한 개체가 다른 개체를 참조하는 경우에도 두 개체의 종료자가 실행되는 순서는 지정되어 있지 않습니다. 다시 말해, 개체 A가 개체 B를 참조하고 두 개체 모두 종료자를 가졌다면, 개체 A의 종료자가 시작될 때 개체 B가 이미 종료되었을 수 있습니다.

  • 종료자가 실행되는 스레드도 지정되어 있지 않습니다.

다음과 같은 예외적인 경우에는 Finalize 메서드가 완전하게 실행되지 않거나 아예 실행되지 않을 수 있습니다.

  • 다른 종료자에서 무한 루프를 실행하거나 잠글 수 없는 경우에도 계속 시도하여 무기한 차단하는 경우. 런타임에서는 종료자를 완전히 종료하려고 하기 때문에 한 종료자가 프로세스를 무기한 차단하면 다른 종료자가 호출되지 않을 수 있습니다.

  • 런타임에서 정리할 시간 없이 프로세스가 종료되는 경우. 이때 런타임에서 프로세스 종료에 대해 보내는 첫 번째 알림은 DLL_PROCESS_DETACH 알림입니다.

런타임에서는 종료할 개체 수가 줄어드는 경우에만 개체를 계속 Finalize합니다.

Finalize 또는 Finalize의 재정의에서 예외를 throw하고 기본 정책을 재정의하는 응용 프로그램에서 런타임을 호스팅하지 않으면 런타임에서 프로세스를 종료하고 활성화된 try-finally 블록이나 종료자가 실행되지 않습니다. 따라서 종료자가 리소스를 해제하거나 소멸시킬 수 없는 경우 프로세스 무결성이 보장됩니다.

구현자 참고 사항

Object.Finalize 는 기본적으로 아무것도 수행하지 않습니다. Finalize 작업을 실행하는 경우에는 가비지를 수집하는 동안 회수하는 데 시간이 더 오래 걸리기 때문에 필요한 경우에만 파생 클래스에서 재정의해야 합니다.

Object 에서 다른 리소스를 참조하는 경우에는 파생 클래스에서 Finalize를 재정의하여 가비지를 수집하는 동안 Object가 삭제되기 전에, 참조되는 리소스를 해제해야 합니다.

파일 핸들 또는 데이터베이스 연결과 같이 관리되지 않는 리소스는 이들 리소스를 사용하는 관리되는 개체가 회수될 때 해제되어야 하는데, 이러한 리소스를 사용하는 형식은 Finalize를 구현해야 합니다. 리소스를 삭제하는 다른 방법에 대해서는 IDisposable을 참조하십시오.

Finalize 는 가비지를 수집하는 동안 개체가 정리된 상황에서도 개체를 되살려 액세스가 가능하도록 만드는 등 여러 가지 작업을 수행할 수 있습니다. 그러나 개체는 한 번만 되살릴 수 있으며 Finalize는 가비지를 수집하는 동안에는 되살린 개체에 대해 호출될 수 없습니다.

C#에서는 소멸자를 사용하여 정리 작업을 수행합니다. 소멸자는 기본 형식의 소멸자를 자동으로 호출하는 등의 적절한 보호 수단을 제공합니다. C# 코드에서는 Object.Finalize를 호출하거나 재정의할 수 없습니다.

다음 예제는 Finalize를 재정의하는 개체가 삭제될 경우 Finalize 메서드가 호출됨을 확인합니다. 프로덕션 응용 프로그램에서 개체가 보유하는 관리되지 않는 리소스를 해제하려면 Finalize 메서드를 재정의해야 할 수 있습니다. 또한 C# 예제에서는 Finalize 메서드를 재정의하는 대신 소멸자를 제공합니다.


using System;
using System.Diagnostics;

public class ExampleClass
{
   Stopwatch sw;

   public ExampleClass()
   {
      sw = Stopwatch.StartNew();
      Console.WriteLine("Instantiated object");
   } 

   public void ShowDuration()
   {
      Console.WriteLine("This instance of {0} has been in existence for {1}",
                        this, sw.Elapsed);
   }

   ~ExampleClass()
   {
      Console.WriteLine("Finalizing object");
      sw.Stop();
      Console.WriteLine("This instance of {0} has been in existence for {1}",
                        this, sw.Elapsed);
   }
}

public class Demo
{
   public static void Main()
   {
      ExampleClass ex = new ExampleClass();
      ex.ShowDuration();
   }
}
// The example displays output like the following:
//    Instantiated object
//    This instance of ExampleClass has been in existence for 00:00:00.0011060
//    Finalizing object
//    This instance of ExampleClass has been in existence for 00:00:00.0036294


.NET Framework

4, 3.5, 3.0, 2.0, 1.1, 1.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

에서 지원

Windows 7, Windows Vista SP1 이상, Windows XP SP3, Windows XP SP2 x64 버전, Windows Server 2008(Server Core는 지원되지 않음), Windows Server 2008 R2(Server Core는 SP1 이상에서 지원됨), Windows Server 2003 SP2

.NET Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

날짜

변경 내용

이유

2010년 12월

C# 소멸자는 기본 클래스 Finalize 메서드를 호출함을 명시했고 예제를 추가했습니다.

고객 의견

표시: