구성 요소의 초기화 및 종료

구성 요소의 생성자에 의해 초기화 됩니다 (SubNew Visual Basic) 및 해당 소멸자가 소멸 (SubFinalizeVisual Basic). 구성 요소의 생성자는 구성 요소의 인스턴스를 만들 때 호출되고 그 후에는 호출될 수 없습니다. 소멸자는 가비지 수집으로 구성 요소가 소멸되기 직전에 호출되며 해당 메모리는 재활용됩니다.

Visual Basic 정보Visual Basic 정보

이전 버전의 Visual Basic에서는 Initialize 이벤트와 Terminate 이벤트가 각각 생성자 및 소멸자로 사용되었습니다.

가비지 수집 대기

가비지 수집에서 실행 코드로 구성 요소에 접근할 수 없다고 판단하면 공용 언어 런타임에서 구성 요소의 소멸자를 호출합니다. 이는 구성 요소에 대한 모든 참조가 해제되거나, 순환 참조의 경우와 같이 모든 실행 코드에서 접근할 수 없는 개체가 구성 요소에 대한 유일한 참조를 갖고 있는 경우에 발생합니다.

사용자가 구성 요소에서 작업을 마치는 시간과 소멸자가 호출되는 시간 사이의 간격이 지연될 수 있으므로 .NET Framework 구성 요소의 수명에 추가 단계가 도입됩니다. 구성 요소가 데이터베이스 연결 또는 Windows 시스템 개체에 대한 핸들과 같은 시스템 리소스를 가져오는 경우 구성 요소 사용자가 리소스 해제 시기를 선택할 수 있도록 IDisposable 인터페이스를 구현하고 Dispose 메서드를 제공해야 합니다.

구성 요소의 주기

유형 초기화: 구성 요소의 첫째 인스턴스가 만들어지면 모든 공유 초기화 코드가 우선적으로 실행됩니다. 공유 멤버에 대한 참조에 의해서도 공유 생성자가 실행됩니다. 여기에는 초기화되는 모든 공유 필드(멤버 변수)와 공유 생성자(Shared Sub New)가 포함됩니다. 다음 코드에서 전체 클래스에 대해 참조 글꼴이 만들어집니다.

참고

Shared에 해당하는 C# 키워드는 static이며 Visual Basic의 Static 키워드와는 다릅니다.

Public Class ADrawing
Shared ReadOnly ReferenceFont As New Font("TimesNewRoman", 14)
' Shared constructor does not overload other constructors.
Shared Sub New()
   ' There is no call to the base class's shared constructor.
   ' Insert code to initialize the shared data.
End Sub
End Class
class ADrawing
{
   static Font m_referenceFont = new Font("TimesNewRoman", 14);
   // Simply add the static keyword to create a static constructor.
   // Static constructors do not have any parameters.
   static ADrawing()
   {
      // There is no call to the base class's static constructor.
      // Code to initialize the font here.
   }
}

참고

클래스 초기화는 만들어진 구성 요소 인스턴스가 없더라도 발생할 수 있습니다.예를 들어 공유 멤버 함수가 포함된 abstract(MustInherit) 클래스는 클래스의 인스턴스가 만들어지지 않은 경우에도 초기화되고 해당 함수를 응용 프로그램이 사용할 수 있습니다.

  1. 인스턴스 초기화: 구성 요소의 인스턴스가 만들어지면 초기화 코드가 포함된 데이터 멤버가 초기화되고 적합한 생성자 오버로드가 실행됩니다. 다음 코드에서는 전용 필드를 초기화하고 매개 변수가 없는 경우 호출되는 생성자와 사용자가 매개 변수를 지정한 경우 호출되는 생성자를 정의합니다.

    Class AShape
       Private answer As Integer = 42
       Public Sub New()
          ' Call another constructor with default initialization values.
          MyClass.New(System.Drawing.Color.Red, 5280, DefinedSizes.Large)
       End Sub
       Public Overloads Sub New(myColor As Color, myLength As Integer, _
                Size As DefinedSizes)
          ' Insert code to initialize the class.
       End Sub
       ' Defines the DefinedSizes enum
       Public Enum DefinedSizes
          Large
          Small
       End Enum
    End Class
    
    class AShape
    {
       private int m_answer = 42;
       // Forward to another constructor.
       public AShape() 
       : this(System.Drawing.Color.Red, 5280, DefinedSizes.Large)
       {
          // Additional initialization goes here.
       }
    
       public AShape(Color color, int length, DefinedSizes size)
       {
          // Code to initialize the class goes here.
       }
       // Defines the DefinedSizes enum
       public enum DefinedSizes
       {
          Large,
          Small
       }
    }
    
  2. 리소스 삭제: 구성 요소가 IDisposable 인터페이스를 구현할 경우에는 구성 요소 사용을 마쳤을 때 클라이언트가 호출해야 하는 Dispose 메서드를 제공해야 합니다. Component에서 상속되는 모든 구성 요소에는 추가 정리 코드를 제공하기 위해 재정의될 수 있는 Dispose의 기본 구현이 이미 포함됩니다. Dispose 메서드에서 구성 요소는 구성 요소가 할당했을 수 있는 모든 시스템 리소스를 비우고, 참조를 다른 개체로 해제하고, 구성 요소 자체를 사용할 수 없는 것으로 렌더링합니다. 또한 구성 요소가 구성 요소 자체의 Dispose 메서드를 호출하는 것이 적합한 인스턴스도 있을 수 있습니다. 다음 코드에서는 Dispose 메서드가 포함된 종속 개체를 삭제합니다.

    ' Assumes that the class implements IDisposable
    Public Sub Dispose() Implements IDisposable.Dispose
       myWidget.Dispose
       myWidget = Nothing
       ' Insert additional code.
    End Sub
    
    // Assumes that the class implements IDisposable
    public void IDisposable.Dispose()
    {
       mywidget.Dispose();
       mywidget = null;
       // Dispose of remaining objects.
    }
    
    

    Dispose를 호출한 후에는 가비지 수집으로 구성 요소의 메모리를 회수할 수 있도록 클라이언트가 구성 요소에 대한 남은 모든 참조를 해제해야 합니다.

  3. 인스턴스 소멸: 가비지 수집 참조가 없는 나머지 구성 요소는 검색 되 면 런타임에서 구성 요소의 소멸자를 호출 (FinalizeVisual Basic) 및 메모리를 해제 합니다. 사용자 고유의 정리 코드를 구현하려면 기본 클래스의 Finalize 메서드를 재정의하거나(Visual Basic의 경우) 소멸자를 구현해야 하지만(Visual C#의 경우), 기본 클래스의 소멸자 또는 Finalize 메서드에 대한 호출을 항상 포함해야 합니다.

    Protected Overrides Sub Finalize()
       m_Gadget = Nothing
       m_Gear = Nothing
       MyBase.Finalize()
    End Sub
    
    // In C#, a destructor is used instead of a Finalize method.
    ~ThisClass()
    {
       m_gadget = null;
       m_gear = null;
       // The base class finalizer is called automatically
    }
    

Dispose 메서드를 구현해야 하는 경우

구성 요소가 Component에서 상속되는 경우 Dispose가 기본적으로 구현됩니다. 이 구현 부분을 재정의하여 사용자 지정 정리 코드로 대체할 수 있습니다. IComponent를 사용자가 직접 구현하여 구성 요소를 빌드하는 경우 IDisposable을 구현하여 이 구성 요소에 Dispose 메서드를 제공해야 합니다.

구성 요소가 시스템 개체, 데이터베이스 연결 또는 기타 부족한 리소스를 할당하는 경우 사용자가 구성 요소에서 작업을 마침과 동시에 이러한 리소스를 해제할 수 있도록 Dispose 메서드가 있어야 합니다.

Dispose 메서드를 포함하는 다른 개체에 대한 참조가 구성 요소에 있는 경우에도 Dispose 메서드를 구현해야 합니다.

Dispose 메서드의 구현 목적

시스템 동작에 따라서 사용자가 구성 요소의 사용을 마친 시간과 가비지 수집이 구성 요소의 코드에 접근할 수 없다는 것을 감지한 시간 사이에는 예측할 수 없는 지연 간격이 생길 수 있습니다. Dispose 메서드를 사용하지 않으면 이 지연 간격 동안 구성 요소가 계속해서 리소스를 가지고 있게 됩니다.

피해야 할 경우

데이터베이스 연결을 사용하는 서버 구성 요소에 Dispose 메서드가 없다고 가정합니다. 메모리가 큰 서버에서는 사용 가능한 메모리의 양을 충분히 유지하면서 여러 구성 요소의 인스턴스를 만들고 해제할 수 있습니다. 이 경우 가비지 수집에서는 구성 요소에 대한 참조가 해제된 후 일정 시간 동안 구성 요소를 소멸시키지 않습니다.

결국 이렇게 해제는 되었지만 소멸되지 않은 구성 요소가 사용 가능한 데이터베이스 연결을 모두 점유하므로 서버에 메모리가 충분해도 사용자의 요청에 응답할 수 없게 됩니다.

참고 항목

작업

방법: 디자인 모드에서 구성 요소 만들기 및 구성

참조

Dispose

Finalize

개념

구성 요소 클래스의 특징

Visual Basic에서 구성 요소 인스턴스 만들기의 변경 내용