C#과 VB.NET의 using 구문을 간편하게 쓰는 방법

C#과 VB.NET을 이용해서 IDisposable 객체를 다룰 경우, 할당과 해제를 짧은 기간 내에 완벽하게 관리하기 위해서 using 구문을 활용하는 일이 자주 있습니다. 그러나 using 구문의 경우 스코프를 정확하게 다루기 위해서 중괄호나 구문 구조 상 Indent를 하게 되어있습니다. 쓰는 것 자체는 일은 아니지만 using 문이 여러번 사용되다보면 코드에 지나치게 많은 Indent가 쓰이게되서 보기 어려운 코드가 될 수 있습니다. 이를 해결하는 방법을 소개합니다.


Note: 아래에서 소개하는 예제 형식들은 IDisposable 인터페이스를 구현하는 임의의 객체라고 가정하겠습니다.


C#에서 using 구문을 간단하게 사용하는 방법


using (Sample a = new Sample())
{
    using (Sample b = new Sample())
    {
        using (Sample c = new Sample())
        {
            // Sample code goes here…
        }
    }
}


위와 같은 코드가 있습니다. 변수 세 개를 선언했을 뿐이지만 중괄호가 세 번이나 열리고 닫힙니다. 당연히 보기 좋을리 없습니다. 어떻게 정리하면 좋을까요?


using (Sample a = new Sample())
using (Sample b = new Sample())
using (Sample c = new Sample())
{
    // Sample code goes here…
}


앞의 코드보다 훨씬 간결해졌습니다. 연달아오는 세 개의 using 문 안에 선언된 변수는 같은 Scope로 분류되어 뒤이어 오는 중괄호 섹션 한 번 안에 한꺼번에 변수의 수명 주기가 관리됩니다.


그리고 또 다른 방법이 있습니다. 만약, 다루어야 될 IDisposable 객체가 모두 같은 형식이거나 상속 관계 상 활용 가능한 수준의 공통의 부모 클래스나 인터페이스를 가지는 경우 아래와 같은 기술법도 가능합니다.


using (Sample
    a = new Sample(),
    b = new Sample(),
    c = new Sample())
{
    // Sample code goes here…
}


위의 예제는 특히 System.IO.Stream 클래스를 기반으로 할 경우 매우 유용합니다. 입출력 작업에 관련된 기본적인 동작이 이미 System.IO.Stream 클래스에서 구현되어있으므로 특수한 경우를 제외하면 위의 구문을 이용하여 간편하게 코드를 정리할 수 있기 때문입니다.


VB.NET에서 Using 구문을 간단하게 사용하는 방법


C#과 마찬가지로 VB.NET 또한 Using 구문을 간단하게 정리할 방법이 있습니다. 아래와 같은 코드가 있다고 가정하겠습니다.


Using A As Sample = New Sample()
    Using B As Sample = New Sample()
        Using C As Sample = New Sample()
            ‘ Sample code goes here…
        End Using
    End Using
End Using


Indent가 세 번이나 들어갑니다. 거기에다 C#처럼 같은 줄에 Using 구문을 몰아서 쓸 수 있는 것도 아닌것 같습니다. 방법이 있을까요? 아래와 같이 정리하면 됩니다.


Using A As Sample = New Sample(),
    B As Sample = New Sample(), _
    C As Sample = New Sample()
    ‘ Sample code goes here…
End Using


Comma 기호를 이용하여 서로 다른 여러 IDisposable 구현 객체를 한 번에 초기화할 수 있습니다. 여기서 주의하실 것은, C#과 달리 VB.NET은 개행 문자에 대해 이스케이프 처리가 필요하며, 언더스코어 () 기호 앞에는 하나 이상의 Whitespace (0x20) 문자가 들어와야하고, 언더스코어 기호 뒤에는 다른 문자를 절대 쓰지 말고 바로 Enter 키를 눌러 개행 문자를 지정하도록 해야 올바르게 줄 이어쓰기로 해석됩니다.


정적 메서드를 이용하여 초기화 과정을 캡슐화하기


위와 같은 구문을 어디에서나 사용할 수 있다면 편리하겠지만, 불가피하게 생성자 이외에 부수적인 초기화 작업이 따르는 경우도 많습니다. 대표적으로 ADO.NET이 그러한 예인데, 여러분만의 독자적인 Helper Library Class를 만들어서 호출하는 방법으로 객체를 생성한다면 위의 코드를 응용할 수 있으므로 여러 IDisposable 인터페이스 구현체를 같은 스코프 안에서 한번에 할당하고 해제하는 구성을 시도할 수 있습니다.

댓글 남기기