[C#] using 문과 IDisposable

muchan
muchan
∙∙조회 4

using 문이란?

using 문은 IDisposable 인터페이스를 구현한 객체를 사용한 후, 자동으로 리소스를 정리해 주는 C# 구문이다.

주로 파일, 네트워크 연결, 데이터베이스 연결 등 사용 후 명시적인 정리가 필요한 리소스를 관리할 때 사용한다.

사용 예시

csharp
using (StreamReader reader = new StreamReader("test.txt"))
{
    string text = reader.ReadToEnd();
    Console.WriteLine(text);
}
// 블록 종료 시 자동으로 Dispose() 호출

using 블록을 벗어나면 Dispose()가 자동으로 호출되어 리소스를 정리한다.

IDisposable이란?

IDisposable은 리소스를 명시적으로 정리하기 위한 표준 인터페이스이다.

csharp
public interface IDisposable
{
    void Dispose();
}

Dispose()는 객체가 사용하던 리소스를 정리하는 메서드이다.

C#의 가비지 컬렉터(GC)는 관리되는 메모리를 자동으로 회수하지만, 파일 핸들이나 네트워크 연결 같은 리소스는 적절한 시점에 별도로 정리해야 한다.

using 문의 동작 원리

using 문은 내부적으로 try-finally 구조와 유사하게 동작한다.

csharp
using (Resource res = new Resource())
{
    res.DoWork();
}

위 코드는 개념적으로 다음과 같다.

csharp
Resource res = new Resource();

try
{
    res.DoWork();
}
finally
{
    if (res != null)
        res.Dispose();
}

finally 블록은 예외가 발생하더라도 실행되므로 리소스를 안전하게 정리할 수 있다.

면접 대비 질문

Q1. using 문을 사용하는 이유는 무엇인가요?

리소스를 사용한 후 Dispose()를 자동으로 호출하여 리소스 누수를 방지하고, 예외가 발생하더라도 안전하게 정리하기 위해 사용합니다.

Q2. IDisposable 인터페이스는 무엇인가요?

객체가 사용한 리소스를 명시적으로 정리할 수 있도록 Dispose() 메서드를 정의한 인터페이스입니다.

Q3. GC가 있는데 IDisposable이 필요한 이유는 무엇인가요?

GC는 관리되는 메모리를 자동으로 회수하지만, 파일 핸들이나 네트워크 연결 같은 리소스의 즉각적인 해제를 보장하지 않습니다. 따라서 IDisposable을 통해 필요한 시점에 리소스를 정리합니다.

Q4. using 블록에서 예외가 발생하면 어떻게 되나요?

using은 내부적으로 try-finally와 유사하게 동작하므로 예외가 발생하더라도 Dispose()가 호출됩니다.

Q5. using 문과 using 선언의 차이는 무엇인가요?

IDisposable은 리소스를 정리하는 방법을 정의하고, using 문은 해당 정리 메서드를 자동으로 호출해 주는 구문이다.