C#에서 비관리 리소스는 가비지 컬렉터가 직접 해제하지 못하므로 IDisposable 인터페이스를 구현하여 명시적으로 해제해야 합니다. 이번 글에서는 IDisposable 인터페이스를 구현해서 비관리 리소스를 안전하게 해제하는 방법을 살펴보겠습니다.
1. IDisposable 인터페이스 이해
IDisposable에는 Dispose() 메서드가 하나 있습니다. 이를 구현해 비관리 리소스를 명시적으로 해제하는 코드를 작성합니다.
2. 비관리 리소스 해제 사례
아래 예제는 윈도우 핸들 같은 비관리 리소스를 래핑한 MyResource 클래스입니다. Dispose 패턴과 함께 소멸자(finalizer)를 사용해 리소스를 안전하게 해제합니다.
using System;
using System.Runtime.InteropServices;
public class MyResource : IDisposable
{
private IntPtr unmanagedHandle; // 비관리 리소스 핸들
private bool disposed = false;
public MyResource()
{
// 비관리 리소스 할당 (예: 핸들 생성)
unmanagedHandle = CreateUnmanagedResource();
}
// 비관리 리소스 생성 예시
[DllImport("kernel32.dll")]
private static extern IntPtr CreateUnmanagedResource();
// 비관리 리소스 해제 예시
[DllImport("kernel32.dll")]
private static extern bool ReleaseUnmanagedResource(IntPtr handle);
public void DoWork()
{
if (disposed)
throw new ObjectDisposedException("MyResource");
// 작업 수행
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // 소멸자 호출 방지
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// 관리 리소스 해제 (있다면)
}
// 비관리 리소스 해제
if (unmanagedHandle != IntPtr.Zero)
{
ReleaseUnmanagedResource(unmanagedHandle);
unmanagedHandle = IntPtr.Zero;
}
disposed = true;
}
}
~MyResource()
{
Dispose(false);
}
}
3. 요약
비관리 리소스는 IDisposable 인터페이스 구현과 Dispose 패턴을 통해 명확히 해제하는 것이 중요합니다. 이를 통해 리소스 누수를 방지하고 안정적인 프로그램을 만들 수 있습니다.
'C#' 카테고리의 다른 글
| C# Dictionary의 커스텀 키 해싱 전략 구현 (0) | 2026.06.02 |
|---|---|
| C# DateOnly와 TimeOnly 타입 활용 (0) | 2026.06.01 |
| C# 암호화 해시(Checksum) 생성과 비교 (0) | 2026.06.01 |
| C# 종속성 주입(DI) 패턴과 IServiceProvider 활용 (0) | 2026.05.30 |
| C# System.FormattableString으로 다국어 문자열 처리 (0) | 2026.05.30 |