트랙
/
C#
C#
/
학습 과정
/
리소스 정리
리소

리소스 정리 에서 C#

2개의 연습 문제

리소스 정리 소개

IDisposable 인터페이스는 리소스 정리의 핵심이며, C#에서 두 가지 중요한 역할을 해요:

  • 구현 클래스를 사용하는 사람에게, 인스턴스가 더 이상 필요하지 않다는 사실을 Dispose() 메서드를 호출해 클래스에 알려야 할 책임이 있음을 나타내요. 그래야 클래스가 관리되지 않는 리소스를 해제하거나 필요에 따라 내부 상태를 초기화할 수 있어요. 이는 가비지 컬렉터가 모든 것을 정리(주로 메모리 해제)하도록 맡기는 일반적인 정리 방식과는 대조적이에요.
  • 컴파일러 및 런타임과 함께 IDisposable 인터페이스는 resource-lifetime 연습 문제에서 다루는 using문을 지원해요.

인터페이스를 통해 Dispose()가 일종의 범용 정리 루틴에서 호출되는 것이 가능하기는 하지만, 그럴 일은 거의 없어요.

IDisposable은 System.IO.Stream이나 System.IO.TextReader처럼 운영 체제(관리되지 않는) 리소스를 감싸는 라이브러리 클래스에서 가장 흔히 만나요. (Stream과 TextReader는 다른 연습 문제에서 다뤄요.)

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

사용 중인 클래스가 IDispoable 인터페이스를 구현한다면, 인스턴스가 더 이상 필요하지 않을 때 (catch와 finally 절을 사용해) Dispose()가 호출되도록 해야 해요. 어떤 클래스가 IDisposable을 구현하는 멤버를 가지고 있다면, 그 클래스 자체도 IDisposable을 구현해서 Dispose()를 호출해 IDisposble을 구현하는 멤버를 정리할 수 있도록 해야 할 수 있어요.

public class Activity : IDisposable
{
    private MyResource myResource;

    public Activity()
    {
        myResource = new MyResource();
    }

    public void Perform()
    {
        try
        {
            myResource.BeUseful();
        }
        catch (Exception)
        {
            myResource.Dispose();
        }
    }

    public void Dispose()
    {
        myResource.Dispose();
    }
}

관리되지 않는 리소스가 전혀 없어도 IDisposable 인터페이스가 유용할 수 있어요. 수명이 긴 객체가 있어서, 이 객체에 수명이 짧은 객체들이 자신을 등록했다가 더 이상 필요하지 않을 때 등록을 해제해야 한다고 해봐요. 수명이 짧은 객체에 IDisposable을 구현해 두면, 그 클래스를 사용하는 개발자에게 수명이 짧은 객체의 수명이 끝날 때 Dispose()를 호출해야 한다는 사실을 알려주는 셈이에요.

Dispose 패턴

문서에서 Dispose 패턴에 대한 언급을 보게 될 거예요. _Dispose 패턴_은 클래스의 종료자에서 Dispose()를 호출하고, 기본 클래스의 리소스 해제가 올바르게 처리되도록 보장하는 것을 포함해요. _Dispose 패턴_은 이후 연습 문제에서 다뤄요.

_Dispose 패턴_은 주로 관리되지 않는 리소스와 관련이 있어요. P/Invoke 메커니즘과 extern 메서드를 사용한다면, Dispose 패턴을 언제 어떻게 구현해야 하는지 이해해야 해요. 대부분의 C# 개발자는 이런 식으로 관리되지 않는 리소스를 직접 다룰 일이 거의 없어요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

리소스 정리 배우기

연습이 잠겨 있어요

리소스 정리 개념을 연습하려면 연습 문제 1개를 더 잠금 해제해요