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#' 카테고리의 다른 글
C# 8 : using 선언 (0) | 2023.11.10 |
---|---|
Json 작성 시 JavaScriptEncoder.UnsafeRelaxedJsonEscaping 옵션에 대해서 (1) | 2023.11.09 |
C# Convert 메서드 (0) | 2023.10.12 |
리터럴(Literal)과 상수(Constant)에 대해서 (0) | 2023.10.06 |
C# IEnumerable, IEnumerator에 대해서 (2) | 2023.10.05 |
댓글