본문 바로가기
유니티 공부/C# 문법

C# 문법 - Dispose 패턴

by 코딩하는 돼징 2023. 11. 17.
반응형

예전에 using문에 대해서 공부해서 Dispose메서드에 알고 있기는 했지만 더 자세히 알고 싶어서 게시글을 적게 됐다.

 

using문

 

Unity - using문(using directive , using statement)

1. using directive 파일 상단에 namespace를 불러오는데 사용된다. using UnityEngine; using System.Collections; using System.Collections.Generic; 2. using statement using문을 사용하면 Resource를 사용한 후에 자동으로 정리 및

code-piggy.tistory.com


Dispose패턴

관리되는 리소스와 비관리 리소스를 효과적으로 관리하기 위한 디자인 패턴으로 주로 IDisposable인터페이스를 구현할 때 사용된다. 이 패턴은 명시적인 메모리 누수를 방지하고 프로그램의 안정성을 높이기 위해 사용된다.


구성 요소

01 public void Dispose() 메서드

IDisposable인터페이스에서 정의되는 메서드로 개발자가 명시적으로 Dispose메서드를 호출할때 실행된다.

public void Dispose()

코드 예시

관리되는 리소스와 비관리 리소스를 해제하고 finalizer호출을 방지하기 위해 GC.SuppressFinalize(this)을 호출한다.

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

 


02 protected virtual void Dispose(bool disposing) 메서드

Dispose내에서 호출되며 실제로 리소스를 해제하고 정리하는 로직이 포함된다.

protected virtual void Dispose(bool disposing)

코드 예시

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // 여기에서 관리되는 리소스를 해제
        }
        // 여기에서 비관리 리소스를 해제
        disposed = true;
    }
}

03 Finalizer(소멸자)

GC에 의해 객체가 수거될 때 실행되는 메서드로 개발자가 명시적으로 Dispose메서드를 호출하지 않을 경우에도 리소스를 해제할 수 있도록 한다. Finalizer에서는 Dispose(false)를 호출하여 비관리 리소스를 해제한다.

~ExampleDisposable()
{
    Dispose(false);
}

사용 예시

01 명시적인 해제

using문을 통해 명시적으로 Dispose메서드를 호출하면 해당 객체의 Dispose메서드가 실행되어 관리되는 리소스가 해제된다.

using (ExampleDisposable disposableObj = new ExampleDisposable())
{
    
} // 이 블록을 빠져나갈 때 Dispose메서드가 호출됨

02 Finalizer 활용

개발자가 명시적으로 Dispose를 호출하지 않을 경우 GC객체를 수거할때 Finalizer를 호출한다. Finalizer에서 Dispose(false)을 호출함으로써 관리되는 리소스는 해제하지 않고 비관리 리소스만 해제한다.

~ExampleDisposable()
{
    Dispose(false); // Finalizer에서 호출되는 Dispose 메서드
}

 

 

 

두 가지 방법으로 Dispose메서드를 사용할 수 있는데 using블록을 사용하는 것이 명시적이고 안전한 방법이며 특히 리소스를 즉시 해제 해야 하는 경우에 권장된다.

반응형

댓글