원문 : http://csharpschool.github.io/2015/05/05/using-keyword-and-idisposable.html
C#에서는 가비지 컬렉터를 지원하므로, 메모리의 해제를 자동으로 해주지만
우리가 사용하는 리소스가 메모리만 있는 것이 아니다. 메모리와 별개로 최대한 열 수 있는 파일 개수에 제한이 존재한다.
(이 제한에 도달하면 메모리가 남아도 파일을 열 수 없다.) 따라서 사용하지 않는 파일을 수동으로 닫아줘야한다.
즉..
var reader = new StreamReader("file.txt");
var content = reader.ReadToEnd();
reader.Close();
이렇게 닫아주면 끝일 것 같지만, Close가 실행되기 전 ReadToEnd에서 예외가 발생할 경우.. close가 불리지 않고 넘어가는 경우가 발생한다.
이를 방지하기 위해서 finally 블록을 사용해야하는데..
var reader = new StreamReader("file.txt");
try
{
var content = reader.ReadToEnd();
}
finally
{
reader.Close();
}
이 처럼하게되면 어떤 상황에도 작동하는 finally 에 의해서 파일은 닫힐 것이다. 하지만 이런 과정은 불편하기 때문에..
C#은 using이라는 '키워드'를 제공한다.
using을 사용하면..
using(var reader = new StreamReader("file.txt"))
{
var content = reader.ReadToEnd();
}
이렇게 하면 위의 동일한 효과를 얻을 수 있다.
C#이 각 리소스를 해제하는 방법이 다 다를텐데, 어떻게 해제하는 것일까?
NET에 이런 목적으로 존재하는 인터페이스가 IDisposable 이며, Dispose 메소드를 정의하고 있는데,
IDisposable을 구현한 클래스가 using 블록을 빠져나갈 때, C#이 자동적으로 Dispose 메소드를 호출한다.
명시적인 리소스 해제가 필요한 클래스가 모두 IDisposable 인터페이스를 구현하고 있기 때문에
이런 클래스를 사용할 때는 되도록 using을 사용하자.
또 우리가 만드는 클래스도 명시적인 리소스 해제가 필요할 경우 IDisposable을 구현하는 것이 좋은 습관.
'프로그래밍 > C++++ (C#)' 카테고리의 다른 글
도구 상자가 보이지 않는다!!! (0) | 2016.02.26 |
---|---|
C#의 where (0) | 2016.01.22 |
delegate (0) | 2016.01.22 |
typeof (0) | 2016.01.22 |
c# using 키워드 (0) | 2016.01.21 |
댓글을 달아 주세요