Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!스킬업

닷넷 기술을 조금 더 깊이 다루고자 합니다. 특정 주제를 정하지 않고 이슈 발생 시 마다 체계적으로 정리하여 공유하겠습니다. 이전 자료를 옮겨온 곳이기도 합니다.

[Attribute] - ConditionalAttribute

작성자 : 박종명
최초 작성일 : 2008-05-30 (금요일)
최종 수정일 : 2008-05-30 (금요일)
조회 수 : 2881

닷넷 내장 어트리뷰트 중 ConditionalAttribute 에 대해 알아 보자l
 
* 개요
ConditionalAttribute 는 말그대로 어셈블리를 어떠한 조건에 따라 특정 처리를 하도록 할 수 있게 한다.
이전에 살펴본 조건부 컴파일과 유사다(단, 조건부 컴파일과는 분명히 다르다)
 
[조건부 컴파일에 대한 글은 다음을 클릭하세요]
 C# 전처리 지시문 
   
전처리 지시문(또는 조건부 컴파일 상수) 의 선언 여부에 따라 특정 메서드의 호출 여부를 결정한다.
 

* Deom
MSDN 의 예제를 살펴보자

조건부 컴파일과 패턴도 상당히 유사함을 알 수 있다.  메서드에 ConditionalAttribute 특성을 선언하고 생성자 매개변수로 지시어(CONDITION1 또는 CONDITION2)를 전달한다. 
결국 지시어가 정의되고 그 지시어를 ConditionalAttribute 특성 으로 선언한 메서드 만이 실제 호출 된다. 

위의 데모의 결과는 다음과 같다.

선언된 전처리 지시어가 CONFITION2 만 선언되었기 때문에 Method2 만 호출 되는 것이다. 
    
 
* 어셈블리 메타데이터
 어트리뷰트는 어셈블르이 메타데이터에 같이 저장된다고 하였다.
 우리가 만든 AttributeDemo1 의 메타데이터를 살펴 보자


메타데이터를 보면 Method1 과 Method2 는 모두 중간언어(IL)로 컴파일 되었다. 중요한 것은 이 어셈블리의 Main 메서드의 실행 코드 이다. 
화살표에서 처럼 실제 코드는 두 메서드를 모두 호출하지만 IL 코드에서는 Method2 만 호출하고 있음을 알 수 있다. 
즉, ConditionalAttribute 를 사용하면 이렇듯 메서드 호출 부분의 조건부 컴파일을 수행할 수 있는 것이다.
 
 
* 조건부 컴파일과 다른점 
이 어트리뷰트는 조건부 컴파일과 상당히 유사하지만 차이점이 있다. 위 예제를 조건부 컴파일로 변경 해 보자

위 코드는 다음과 같은 컴파일 오류를 일으킨다. 
D:\test\AttributeDemo1\Class2.cs(15): 'Method1' 이름은 'AttributeDemo1.Class2'(이)라는 클래스나 네임스페이스에 없습니다. 
  
즉 전처리 지시문에 선언되지 않은 메서드 블럭(Method1, 코드에서 옅은 회색 부분) 은 아예 컴파일 자체가 되지 않았다는 것을 유추 할 수 있다. 

일단, 컴파일이 되도록 Main 메서드에 Method1() 호출 부분을 제거하고 컴파일을 해보자. 컴파일을 한 후, IL 코드를 보면..


Class1 과는 달리 Class2 는 Method1 메서드 자체가 컴파일 되지 않은것을 알 수 있다.

즉, ConditionalAttribute 를 사용할 경우에는 조건에 맞지 않는 메서드가 컴파일은 되지만 그 메서드의
호출 명령이 컴파일에서 제외 되지만,
 조건부 컴파일의 경우에는, 조건에 맞지 않는 메서드는 아예 컴파일 자체가 안된다는 것을 알 수 있다.

 이것이 이 둘의 차이점인 것이다.

이름
비밀번호
홈페이지
AB <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요