구성 요소의 초기화 및 종료
업데이트: 2007년 11월
구성 요소는 생성자(Visual Basic의 경우 SubNew)에 의해 초기화되고 소멸자(Visual Basic의 경우 SubFinalize)에 의해 소멸됩니다. 구성 요소의 생성자는 구성 요소의 인스턴스를 만들 때 호출되고 그 후에는 호출될 수 없습니다. 소멸자는 가비지 수집으로 구성 요소가 소멸되기 직전에 호출되며 해당 메모리는 재활용됩니다.
Visual Basic 정보: |
---|
이전 버전의 Visual Basic에서는 Initialize 이벤트와 Terminate 이벤트가 각각 생성자 및 소멸자로 사용되었습니다. |
가비지 수집 대기
가비지 수집에서 실행 코드로 구성 요소에 접근할 수 없다고 판단하면 공용 언어 런타임에서 구성 요소의 소멸자를 호출합니다. 이는 구성 요소에 대한 모든 참조가 해제되거나, 순환 참조의 경우와 같이 모든 실행 코드에서 접근할 수 없는 개체가 구성 요소에 대한 유일한 참조를 갖고 있는 경우에 발생합니다.
사용자가 구성 요소에서 작업을 마치는 시간과 소멸자가 호출되는 시간 사이의 간격이 지연될 수 있으므로 .NET Framework 구성 요소의 수명에 추가 단계가 도입됩니다. 구성 요소가 데이터베이스 연결 또는 Windows 시스템 개체에 대한 핸들과 같은 시스템 리소스를 가져오는 경우 구성 요소 사용자가 리소스 해제 시기를 선택할 수 있도록 IDisposable 인터페이스를 구현하고 Dispose 메서드를 제공해야 합니다.
구성 요소의 주기
유형 초기화: 구성 요소의 첫째 인스턴스가 만들어지면 모든 공유 초기화 코드가 우선적으로 실행됩니다. 공유 멤버에 대한 참조에 의해서도 공유 생성자가 실행됩니다. 여기에는 초기화되는 모든 공유 필드(멤버 변수)와 공유 생성자(SharedSubNew)가 포함됩니다. 다음 코드에서 전체 클래스에 대해 참조 글꼴이 만들어집니다.
참고: |
---|
Shared에 해당하는 C# 키워드는 static이며 Visual Basic의 Static 키워드와는 다릅니다. |
Dispose 메서드를 구현해야 하는 경우
구성 요소가 Component에서 상속되는 경우 Dispose가 기본적으로 구현됩니다. 이 구현 부분을 재정의하여 사용자 지정 정리 코드로 대체할 수 있습니다. IComponent를 사용자가 직접 구현하여 구성 요소를 빌드하는 경우 IDisposable을 구현하여 이 구성 요소에 Dispose 메서드를 제공해야 합니다.
구성 요소가 시스템 개체, 데이터베이스 연결 또는 기타 부족한 리소스를 할당하는 경우 사용자가 구성 요소에서 작업을 마침과 동시에 이러한 리소스를 해제할 수 있도록 Dispose 메서드가 있어야 합니다.
Dispose 메서드를 포함하는 다른 개체에 대한 참조가 구성 요소에 있는 경우에도 Dispose 메서드를 구현해야 합니다.
Dispose 메서드의 구현 목적
시스템 동작에 따라서 사용자가 구성 요소의 사용을 마친 시간과 가비지 수집이 구성 요소의 코드에 접근할 수 없다는 것을 감지한 시간 사이에는 예측할 수 없는 지연 간격이 생길 수 있습니다. Dispose 메서드를 사용하지 않으면 이 지연 간격 동안 구성 요소가 계속해서 리소스를 가지고 있게 됩니다.
피해야 할 경우
데이터베이스 연결을 사용하는 서버 구성 요소에 Dispose 메서드가 없다고 가정합니다. 메모리가 큰 서버에서는 사용 가능한 메모리의 양을 충분히 유지하면서 여러 구성 요소의 인스턴스를 만들고 해제할 수 있습니다. 이 경우 가비지 수집에서는 구성 요소에 대한 참조가 해제된 후 일정 시간 동안 구성 요소를 소멸시키지 않습니다.
결국 이렇게 해제는 되었지만 소멸되지 않은 구성 요소가 사용 가능한 데이터베이스 연결을 모두 점유하므로 서버에 메모리가 충분해도 사용자의 요청에 응답할 수 없게 됩니다.
참고 항목
작업
개념
Visual Basic에서 구성 요소 인스턴스 만들기의 변경 내용