IDisposable이란 무엇인가!!
일단 Dispose의 단어 의미는 제거하다, 처분하다 라는 뜻을 갖고 있다.
여기에 가능하다는 의미인 able이 붙어 제거가능한, 사용후 버리게 되어있는, 일회용의 란 뜻!
C#에서 무엇을 사용하고 제거해야 할까?
바로 메모리다. 메모리를 사용하고 다 썼으면 할당된 메모리를 끊어줘야 한다.
그런데 C#은 Garbage Collector(가비지 컬렉터)를 가지고 있는데, 힙 메모리 영역에서 더이상 사용하지 않는 객체들을 소거하는 역할을 한다. 자동으로 소거하기 때문에 개발자는 소거하는 일 자체는 신경쓰지 않아도 된다.
그런데 왜 Dispose가 필요할까?
1. GC는 관리되지 않는 리소스들을 인식하지 못한다.
2. GC는 개발자가 동작을 지시하는 것이 아니기 때문에 어느 시점에 메모리 해제가 일어나는지 알 수 없다.
3. GC가 자주 발생하게 되면 오버헤드로 인한 비용이 증가한다.
public class TestClass : IDisposable
{
public void TestMethod()
{
Console.WriteLine("This is TestClass");
}
public void Dispose()
{
Console.WriteLine("Dispose");
}
}
위와 같이 IDisposable 인터페이스를 클래스에 상속 시켜 Dispose()를 구현하게 되면
이제 TestClass는 사용이 끝나면 Dispose()를 호출하고 메모리가 해제된다.
main에서 한번 테스트 해보자.
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과 함께 자주 사용된다.
중요 데이터와 메모리를 얼른 쓰고 돌려주어야 할 때, 다른 프로세스와의 교착상태를 방지하고자 할 때, 메모리 낭비를 방지하고자 할 때
유용 하게 사용 할 수 있다.
출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=94cogus&logNo=221539195761
'개발언어 > C#' 카테고리의 다른 글
[C#] Const와 Readonly의 차이점 #1 (0) | 2023.05.17 |
---|---|
[C#] 어떠한 경우에도 파일닫기 using, IDisposable (0) | 2023.05.17 |
[C#] Linq 정리하기 (0) | 2023.05.17 |
[C#] Var와 다이나믹(Dynamic)에 대해서 이해하기 (0) | 2023.05.17 |
[C#] Task.WhenAll() vs WhenAny() (0) | 2023.05.12 |