본문 바로가기

프로그래밍/C#

using 을 통한 리소스 해제 기법

이번 포스팅에서는 using 을 통한 Dispose 에 대해 알아보겠습니다.

 

Dispose 메서드의 사용이 필요한 객체의 경우 자원을 반납하거나 메모리에서 반드시 소멸시켜야할 대상 입니다.

 

스트림의 경우 자원을 열었다면 반드시 닫아주는게 원칙 이라는 점은 아실것이라 판단됩니다.

 

코드를 통해 예제를 살펴 보겠습니다.

 

우선 텍스트 파일 하나를 StreamReader 를 통해 열고 작업을 종료하고 명시적으로 Close 하는 예제 입니다.

 

 

            
            StreamReader file = new StreamReader("../../test.txt");

            while ((line = file.ReadLine()) != null)
            {
                System.Console.WriteLine(line);
            }

            file.Close();

 

사용에 문제 없는 코드 입니다.

 

스트림을 통해 텍스트 파일을 읽고 작업을 종료하고 난 이후 Close 해주는 정석적인 코드 입니다.

 

C# using 을 사용하면 이런 Close 같은 명시적인 작업을 자동으로 리소스를 해제해줄수 있습니다.

 

단, 중요한것은 해당 객체가 IDisposable 인터페이스를 구현하는 객체 이어야만 using 을 통해 해제해줄수 있습니다.

 

예제 코드로 살펴보겠습니다.

            using (StreamReader sr = new StreamReader("../../test.txt"))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    System.Console.WriteLine(line);
                }
            }

 

using 구문에 StreamReader 객체를 선언하고, 구문 안에서 작업이 이루어 졌습니다.

 

using 구문에 위와 같이 객체를 선언하는 경우 모든 작업이 이루어지고 using 구문을 벗어날때 내부적으로 Dispose 를 호출합니다.

 

따라서, 프로그래머 입장에서 자원을 명시적으로 Close 해주지 않아도 됩니다.

 

그럼 이번엔, 어떻게 자원이 해제되는지 직접 구현해보도록 하겠습니다.

 

 

using 구문에서 객체를 선언해서 사용하고자 한다면 IDisposable 인터페이스를 구현한 객체 이어야 한다는점은 앞서 말씀 드렸습니다.

 

    class Bitmap : IDisposable
    {

        public void Dispose()
        {
            System.Console.WriteLine("해제");
        }

    }

    class Program
    {
        static void Main(string[] args)
        {

            using (Bitmap b = new Bitmap())
            {

            }

        }
    }

 

이런 코드를 한번 만들어봤습니다.

 

실행결과가 어떻게 될까요?

 

 

 

 

분명 명시적으로 Dispose 메서드를 호출하지 않았음에도 자원이 해제 되었습니다.

 

이렇게 using 구문을 사용하면 프로그래머가 Close 해주지 않아도 자동으로 해제 된다는 것을 이번 포스팅을 통해 배웠습니다.

 

 

Console.UsingDispose.zip

 

'프로그래밍 > C#' 카테고리의 다른 글

JSON Text 파싱 방법  (0) 2014.12.01
JavaScriptSerializer 를 통한 JSON Serialization  (0) 2014.11.30
LINQ 를 통한 C# XML 파싱 (LINQ to XML)  (0) 2014.11.29