C# 에서는 서로 다른 네임스페이스에 같은 타입명이 존재하는 경우, 타입의 Fully qualified name (한글용어 : 정규화된 형식이름)을 적어줌으로써 충돌을 피하고 있습니다.

예를 들어 한국의 Mhn 이라는 회사와 Baum 이라는 회사가 모두 StreetMap 이라는 타입을 정의하여 제공하고 있고 각각의 타입이 포함된 어셈블리 둘 모두를 참조하는 코드를 작성하는 경우 아래의 모호함이 발생합니다.
(예제는 'CLR via C#' 에 나온 예를 약간 수정하였습니다.)

// StreetMapTest.cs


using Mhn;

using Baum;


public sealed class Program

{

    public static void Main()

    {

        StreetMap m = new StreetMap(); // 알쏭달쏭한 참조

    }

}


그래서 Fully qualified type name 을 써서 아래와 같이 코드를 써야 합니다.

using Mhn;

using Baum;


public sealed class Program

{

    public static void Main()

    {

        StreetMap m = new Baum.StreetMap();  // 문제 없음

    }

}

그런데 만일 타입이 정의된 네임스페이스까지 같다면 어떻게 될까요?
미국에 Baum 이라는 같은 이름을 가진 회사가 있는데 만일 이 회사가 Baum 이라는 네임스페이스에 StreetMap 이란 타입이 정의된 어셈블리를 제공한다면, 그리고 내 프로그램에서 이렇게 두개의 같은 fully qualified name 을 가진 서로 다른 StreetMap 타입을 참조해야 한다면 어떻게 해야 할까요?  ('CLR via C#' 에서는 Australian Boomerang Company (ABC) 라는 회사와 Alaskan Boat Corporation(ABC)란 회사가 모두 BuyProduct 라는 타입을 제공하고 있는 경우 부메랑과 보트 모두를 구매하는 코드를 작성하는 예를 들고 있습니다)

예를 들어 아래와 같은 코드는 어느 어셈블리의 Baum.StreetMap 을 참조하는지 모호합니다.

public sealed class Program

{

    public static void Main()

    {

        Baum.StreetMap m = Baum.StreetMap();

    }

}

위의 예를 빌드하면 형식 'Baum.Streetmap' 이 서로다른 두 군데의 어셈블리에 존재한다는 컴파일러의 투덜거림을 보게 됩니다.

잘 일어나진 않겠지만, 이런 멍멍이 같은 경우를 해결하기 위해 사용되는 것이 extern alias 입니다. 위의 예에서 한국 Baum 의 어셈블리가 Baum.1.0.0.0.dll 로 제공된다고 하고, 미국의 이름만 같은 다른 회사 Baum 이 제공한 어셈블리 파일이 BaumMap.dll 이라고 하면 아래와 같은 옵션으로 컴파일 할 수 있습니다.

csc /r:BaumKR=Baum.1.0.0.0.dll /r:BaumUS=BaumMap.dll StreetMapTest.cs

위의 예에서, 컴파일 시 두개의 서로 다른 어셈블리에 BaumKR, BaumUS라는 별칭(alias)을 부여하였습니다.

이제 코드는 아래와 같이 작성합니다.

extern alias BaumKR;

extern alias BaumUS;


public sealed class Program

{

    public static void Main()

    {

        BaumKR::Baum.StreetMap mk = BaumKR::Baum.StreetMap();

        BaumUS::Baum.StreetMap mu = BaumUS::Baum.StreetMap();

    }

}


이제 같은 네임스페이스에 속한 같은 이름의 서로 다른 타입은 외부별칭에 스코프 연산자(::) 를 써줌으로써 충돌을 피할 수 있게 됩니다.

비주얼 스튜디오에서는 아래 그림과 같이 별칭을 줄 참조를 솔루션 탐색기에서 선택한 다음,

사용자 삽입 이미지


아래와 같이 참조의 속성창에서 '별칭' 항목에 alias 를 주면 됩니다.

사용자 삽입 이미지

위의 경우는 코드에서

extern alias TreeListView1;

라고 외부 어셈블리 별칭을 알린 후 써먹을 수 있게 됩니다.

여기까지구요... 'CLR via C#' 을 보다가 extern aliases 에 대해서는 C# Language Specification 을 참조하라고 할 뿐, 실제 사용 예가 없길래 한번 찾아 보았습니다.

그런데 이 스펙 문서도 마찬가지지만 왜 이렇게 여기저기서 Acme 라는 이름을 많이 사용할까요? 예전부터 궁금하던거라 한번 찾아 봤는데 글의 성격이 좀 다르기 때문에 다음 포스트로 넘기겠습니다.

[참조]
1. Extern Alias(C#) MSDN
2. C# Language Secification (v3.0)
3. Extern Alias Walkthrough (Visual Stuido 의 예로서 매우 잘 정리되어 있습니다.)



이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by bornlazybone

트랙백 주소 :: http://bornlazybone.tistory.com/trackback/9 관련글 쓰기

댓글을 달아 주세요