본문 바로가기
프로그래밍/C#

C# IDisposable에 대해서

by bantomak 2023. 11. 3.

IDisposable이란?

Dispose의 단어의 뜻은 제거하다, 처분하다는 뜻의 사전적 의미를 가진다.

여기에 가능하다라는 의미의 able이 붙었으니 제거 가능한, 사용 후 버리게 되어있는, 일회용이라는 뜻이 된다.

 

C#에서 무엇을 사용하고 제거하려고 할까?

바로 메모리다. 메모리를 사용하고 다 썼으면 할당된 메모리를 해제해야 한다.

 

C#은 Garbage Collector(가비지 콜렉터)를 통해서 힙 메모리 영역에서 더 이상 사용하지 않는 객체들을 제거하는 역할을 한다. 자동으로 제거하기 때문에 개발자는 메모리 해제에 대해서 신경 쓰지 않아도 된다.

 

그러면 Dispose는 왜 필요할까?

  • GC는 관리되지 않는 리소스들을 인식하지 못한다.
  • GC는 개발자가 동작을 지시하는 것이 아니기 때문에 어느 시점에 메모리 해제가 일어나는지 알수 없다.
  • GC가 자주 발생하게 되면 오버헤드로 인한 비용이 증가한다.

 

public class TestClass : IDisposable
{
   public void TestMethod()
   {
      Console.WriteLine("This is TestClass");
   }
   
   public void Dispose()
   {
      Console.WriteLine("Dispose");
   }
}

 

위와 같이 IDisposable 인터페이스를 클래스에 상속시켜 Dispose()를 구현하게 되면 TestClass는 사용이 끝나면 Dispose()가 호출되며 메모리가 해제된다.

 

public class TestClass : IDisposable
{
   public void TestMethod()
   {
      Console.WriteLine("This is TestClass");
   }
   
   public void Dispose()
   {
      Console.WriteLine("Dispose");
   }
}

class Program
{
   static void Main(string[] args)
   {
      using (TestClass t = new TestClass())
      {
         t.TestMethod();
      }
   }
}

 

 

 

Dispose() 메서드는 호출하지 않았음에도 자동으로 실행된 것을 알 수 있다.

 

using()은 무엇인가?

class Program
{
    static void Main(string[] args)
    {
        TestClass t = new TestClass();
        t.TestMethod();
    }
}

 

이렇게 실행했다면 Dispose()가 실행될까?

답은 실행되지 않는다. TestClass의 객체인 t를 언제까지 사용할 것인지 컴파일러는 알지 못하기 때문이다.

 

해당 객체를 어디서부터 어디까지만 사용할 것인지 명시하는 것이 using()의 역할이다.

 

using (TestClass t = new TestClass())
{   // 객체 t 여기서부터
    t.TestMethod();
}   // 여기까지 사용하겠다!

 

그렇기 때문에 using() 문 이후부터는 객체 t를 사용할 수 없다.

할당된 메모리를 해제해 버렸고 그 때문에 Dispose()도 실행된 것이다.

 

이렇게 Dispose()와 using은 함께 자주 쓰인다.

 

중요 데이터와 메모리를 얼른 쓰고 돌려주어야 할 때, 다른 프로세스와의 교착상태를 방지하고자 할 때, 메모리 낭비를 방지하고자 할 때 유용하게 쓰인다.

 

출처

 

C# IDisposable

IDisposable이란 무엇인가!! 일단 Dispose의 단어 의미는 제거하다, 처분하다 라는 뜻을 갖고 있다. 여...

blog.naver.com

댓글