메모리 관리는 비주얼 베이직에서 객체를 다룰 때 중요한 요소입니다. 특히 애플리케이션이 수동 해제가 필요한 리소스(파일, 데이터베이스 연결 또는 외부 객체)를 사용하는 경우 더더욱 그렇습니다.
클래식 VB(VB6)에서 리소스는 Set obj = Nothing 호출로 수동으로 해제되었습니다. .NET(VB.NET)에서는 사용되지 않는 객체를 정리하는 자동 가비지 컬렉터가 구현되었습니다. 그러나 unmanaged 리소스의 경우 메모리가 자동으로 해제되지 않는 경우가 있습니다.
자동 가비지 컬렉터는 .NET 객체의 메모리를 해제하지만 외부 또는 수동 리소스를 적시에 확보하는 방법을 알지 못합니다(파일 핸들, 연결, 스트림). 이러한 세부사항을 무시하면 메모리 누수와 리소스 잠금이 발생합니다.
외부 리소스를 올바르게 해제하기 위해 IDisposable 인터페이스와 Using...End Using 표현식을 사용하여 결정적인 해제를 보장합니다.
코드 예시:
' 파일 핸들의 보장된 해제 Using reader As New StreamReader("data.txt") Dim content As String = reader.ReadToEnd() ' ... 데이터 처리 ... End Using ' IDisposable를 지원하지 않는 객체에 대한 수동 해제: Dim obj As SomeComObject = New SomeComObject() ' ... 사용 ... System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) obj = Nothing
주요 특징:
FileStream에 대해 Using을 사용하지 않으면 리소스는 여전히 GC 덕분에 해제될까요?
아니요, 해제는 불확실한 시점에 발생합니다. 파일 잠금 및 리소스 누수가 발생할 수 있습니다.
Set obj = Nothing 호출이 Dispose() 호출과 동등한가요?
아니요, Set obj = Nothing은 단지 참조를 제거할 뿐이며, 리소스를 즉시 해제한다고 보장하지 않습니다. Dispose() 또는 Using이 결정적인 해제를 위한 유일한 올바른 방법입니다.
DataSet/DataTable에서 상속된 객체에 대해 Dispose를 호출해야 하나요?
네, 비록 그들이 GC에 의해 해제되지만, 많은 관련 리소스(예: 데이터베이스 연결)는 수동으로 Dispose 또는 Using을 호출해야 합니다. 특히 DataAdapter, Connection, Command에 대해 그렇습니다.
Using도 Dispose도 없이 큰 파일에서 데이터를 읽음. 얼마 후 애플리케이션이 새 파일을 열 수 없음: "파일이 다른 프로세스에서 사용 중입니다".
장점:
단점:
Using을 통해 데이터베이스 또는 파일에 연결을 여는 것. 데이터 수집, 처리, 리소스의 자동 해제.
장점:
단점: