'소멸'에 해당되는 글 1건

  1. 2009.12.25 VB.NET - 개체가 만들어지고 소멸되는 방법

New 키워드를 사용하여 클래스의 인스턴스가 만들어질 때 개체의 수명이 시작됩니다. 새 개체의 경우 일반적으로 처음에 사용하기 전에 초기화 작업을 수행해야 합니다. 일반적인 초기화 과정에는 파일 열기, 데이터베이스에 연결 및 레지스트리 키 값 읽기 등이 포함됩니다. Microsoft Visual Basic .NET에서는 생성자라는 프로시저를 사용하여 새 개체의 초기화를 제어합니다.

개체는 해당 범위를 벗어나고 CLR(공용 언어 런타임)에 의해 해제되면 그 수명이 끝납니다. Visual Basic .NET에서는 소멸자라는 프로시저를 사용하여 시스템 리소스의 해제를 제어합니다. 또한 생성자(초기화를 제어할 수 있는 특수 메서드) 및 소멸자는 강력하면서 예측이 가능한 클래스 라이브러리의 생성을 지원합니다.

Sub New 및 Sub Finalize

Visual Basic .NET에서 Sub NewSub Finalize 프로시저는 각각 개체를 초기화하고 소멸시킵니다. 두 프로시저는 이전 버전의 Visual Basic에서 사용된 Class_InitializeClass_Terminate 메서드에 해당합니다. 그러나 Sub New 생성자는 Class_Initialize와 달리 클래스가 만들어질 때 한 번만 실행될 수 있으며 같은 클래스나 파생 클래스로부터 다른 생성자의 첫 번째 코드 줄을 제외한 다른 위치에서는 명시적으로 호출될 수 없습니다. 또한 Sub New 메서드의 코드는 항상 클래스의 다른 코드보다 먼저 실행됩니다. Visual Basic .NET에서는 사용자가 클래스에 대해 Sub New 프로시저를 명시적으로 정의하지 않는 경우 런타임에 Sub New 생성자를 암시적으로 생성합니다.

CLR는 개체를 해제하기 전에 Sub Finalize 프로시저를 정의하는 개체에 대해 Finalize 메서드를 자동으로 호출합니다. Finalize 메서드에는 파일을 닫고 상태 정보를 저장하는 것과 같이 개체가 소멸되기 직전에 실행해야 하는 코드가 포함될 수 있습니다. Sub Finalize를 실행할 경우 성능이 다소 저하되므로 개체를 명시적으로 해제해야 하는 경우에만 Sub Finalize 메서드를 정의해야 합니다.

Finalize 소멸자는 속한 클래스나 파생 클래스에서만 호출될 수 있는 보호된 메서드입니다. 시스템에서는 개체가 소멸될 때 자동으로 Finalize를 호출하므로 파생 클래스의 Finalize 구현 외부에서 Finalize를 명시적으로 호출하지 않아야 합니다. 개체가 nothing으로 설정되는 즉시 실행되는 Class_Terminate와는 달리 개체가 범위를 상실하는 시기와 Visual Basic .NET에서 Finalize 소멸자를 호출하는 시기 사이에는 약간의 차이가 있습니다. Visual Basic .NET에서는 언제든지 명시적으로 호출하여 리소스를 즉시 해제할 수 있는 명명된 Dispose라는 다른 종류의 소멸자를 사용할 수 있습니다.

IDisposable 인터페이스

클래스 인스턴스는 주로 Windows 핸들 및 데이터베이스 연결과 같이 CLR에서 관리하지 않는 리소스를 제어합니다. 가비지 수집 기능을 보완하기 위해 클래스에서는 IDisposable 인터페이스를 구현하는 경우 시스템 리소스를 능동적으로 관리하기 위한 메커니즘을 제공할 수 있습니다. IDisposable에는 개체 사용이 끝났을 때 클라이언트에서 호출해야 하는 Dispose 메서드가 포함되어 있습니다. Dispose를 구현하면 리소스를 해제하고 파일 닫기 및 데이터베이스 연결 끊기 등과 같은 작업을 수행할 수 있습니다. Finalize 소멸자와 달리 Dispose 메서드는 자동으로 호출되지 않습니다. 리소스를 해제하려면 클래스의 클라이언트에서 Dispose를 명시적으로 호출해야 합니다.

가비지 수집 및 Finalize 소멸자

.NET Framework에서는 사용되지 않은 리소스를 주기적으로 해제하는 참조 추적 가비지 수집이라는 시스템을 사용합니다. 이전 버전의 Visual Basic에서는 참조 횟수라는 다른 시스템을 사용하여 리소스를 관리합니다. 두 시스템이 모두 자동으로 같은 함수를 수행하지만 몇 가지 중요한 차이점이 있습니다.

CLR는 시스템에서 특정 개체가 필요 없는 개체로 확인되면 해당 개체를 주기적으로 소멸시킵니다. 개체는 시스템 리소스가 부족하면 좀 더 빠르게 해제되고 그렇지 않은 경우에는 해제되는 빈도가 적습니다. 이전 버전의 Visual Basic 개체와는 달리 개체가 범위를 상실하는 시기와 CLR가 해당 개체를 해제하는 시기 사이에는 차이가 있으므로 개체가 소멸되는 시기를 정확하게 알 수 없습니다. 이러한 경우 개체가 명확하지 않은 수명을 가지는 것으로 간주됩니다. 대부분의 경우 개체가 범위를 상실하는 즉시 Finalize 소멸자가 즉시 실행되지 않을 수도 있다는 사실에 유의한다면 명확하지 않은 수명으로 인해 응용 프로그램의 작성 방법이 변경되지는 않습니다.

가비지 수집 시스템 간의 다른 차이점은 Nothing의 사용과 관련된 것입니다. 참조 횟수를 이용하려는 경우 이전 버전의 Visual Basic을 사용하는 프로그래머는 해당 변수가 보유하는 참조를 해제하기 위해 경우에 따라 개체 변수에 Nothing을 할당합니다. 변수가 개체에 대한 마지막 참조를 보유하는 경우 해당 개체의 리소스는 즉시 해제됩니다. Visual Basic .NET에서도 이 프로시저를 계속 유용하게 사용할 수는 있지만 이로 인해 참조된 개체가 해당 리소스를 즉시 해제하지는 않습니다. 변수를 Nothing으로 설정해야 하는 유일한 경우는 해당 수명이 가비지 수집기가 고아 개체를 검색하는 데 걸리는 시간보다 긴 경우입니다.

Posted by 철냄비짱
,