상세 컨텐츠

본문 제목

Dispose

Programming/C#

by 양명 2019. 2. 14. 10:29

본문

1. Dispose란?

C#에서는 객체의 메모리를 해제하기 위해 IDisposable 인터페이스를 구현하고, Dispose()메소드를 통해 메모리를 해제합니다.


2. 왜 쓰는가?

1) 일반적인 메모리 해제 방법

일반적으로 메모리 해제를 하기 위해서는 try-finally 블록으로 finally 블록에서 메모리를 해제하는 구문을 작성하게 됩니다.

Char[] buffer = new Char[50];
//try-finally로 메모리 해제하는 표현
{
StreamReader s = new StreamReader("File1.txt");
try
{
int charsRead = 0;
while (s.Peek() != -1)
{
charsRead = s.Read(buffer, 0, buffer.Length);
//Process characters read.
}
}
finally
{
if (s != null)
{
((IDisposable)s).Dispose();
}
}

2) using 문을 사용한 메모리 해제

하지만 코드 라인을 너무 많이 차지하게 되고 매번 이러한 과정으로 메모리를 해제하기에는 비효율적이기 때문에

using문을 사용하여 메모리를 해제시켜줍니다.

// 위 처럼 try-finally로 메모리 해제를 직접 하지 않고, IDisposable 인터페이스가 구현된 클래스는 using문으로
// 간단하게 표현 가능
// 아래 예는 StreamReader.Dispose 메소드를 명시적으로 호출하지 않음
using (StreamReader s = new StreamReader("File1.txt"),
s2 = new StreamReader("File2.txt")) // using으로 여러 리소스를 가져올 수 있다. 두 개의 StreamReader 개체를 인스턴스화 함
{
int charsRead = 0;
while (s.Peek() != -1)
{
charsRead = s.Read(buffer, 0, buffer.Length);
//Process characters read.
}
}



3) 예외처리를 위한 try-catch-finally

경우에 따라서 catch 블록을 포함해야 하는 경우는 1)의 방법처럼 finally 블록에서 메모리를 해제시켜줍니다.

//catch 블록에서 예외 처리를 하기 위해 try블록을 포함해야 하는 경우는
// try-catch-finally 블록을 사용하며, finally에서 Dispose()메소드를 호출하여 메모리를 해제해주면 됨
StreamReader sr = null;
try
{
}
catch (FileNotFoundException fnfe)
{
Console.WriteLine(fnfe);
}
catch (IOException io)
{
Console.WriteLine(io);
}
finally
{
if (sr != null) sr.Dispose(); //널체크 필수
}


참고 : https://docs.microsoft.com/ko-kr/dotnet/standard/garbage-collection/using-objects


'Programming > C#' 카테고리의 다른 글

미리 정의된 형식 'System.ValueTuple`2'을(를) 정의하지 않았거나 가져오지 않았습니다.  (0) 2019.02.13
LINQ  (0) 2019.02.13
Lambda Expression  (0) 2019.02.12
EventHandler  (0) 2019.02.12
Delegate  (0) 2019.01.29

관련글 더보기