SSISO Community

갤러리정

애트리뷰트(Attribute) - CSharp

12.9 애트리뷰트(Attribute)

 

절에서 배운 전처리 지시어는 컴파일러에 한정적인 반면 애트리뷰트(Attribute) 컴파일러뿐만 아니라 클래스, 구조체, 메서드 등에 영향을 미치는 범용적인 기능을 가지고 있습니다

정확하게 정의를 내리자면 Attribute 프로그램에 필요한 정보를 제공하는 기능을 가지고 있습니다. Attribute 컴파일타임과 런타임 모두 영향을 미칠 있으며 Attribute 정보는 어셈블리(Assembly) 메타데이터(Metadata) 형식으로 저장됩니다

Attribute 클래스, 구조체, 메서드 등에 정보를 제공한다고 했습니다. , 대부분의 C# 프로그램에서 추가적인 정보로 Attribute 이용할 있다는 것입니다. 여러분은 대괄호([ ]) 둘러싸여 있는 구문을 자주 보게 것입니다. Attribute 일반적인 구문은 대괄호를 이용하여 표시하고 매개변수를 넣어 주는 방법으로 사용됩니다. 다음은 Attribute 프로그램에 사용될 때의 기본적인 구조를 보여주고 있습니다

 Attribute 형식

[attribute("positional_parameter", named_parameter= value, ...)]

[] [RegistryKey(HKEY_CURRENT_USER,"foo")]

Attribute [ ] 사용하여 묶는다.

[ ] 안에 Attribute 이름, 지정위치 파라미터와 명명 파라미터를 기입

  지정위치 파라미터(positional_parameter): 필수적인 정보, 생성자 매개변수에 해당, “ ” 사용하여 값을 기입

  명명 파라미터(named_parameter): 선택적인 정보, 속성에 해당, ‘=’ 사용하여 멤버필드와 값을 기입

12-8 Attribute 형식

 

Attribute 크게 내장 Attribute 사용자 정의 Attribute 나눌 있으며 내장 Attribute 현재 나와 있는 것이 198 정도됩니다. 그리고, Attribute들은 모두 sealed 클래스이며 Attribute 클래스를 상속받아서 구현한 것입니다.

 

Attribute 다양한 곳에 사용되는 것만큼이나 다양한 Attribute들이 제공되고 있습니다. 물론, 사용자가 직접 만들어서 사용한다면 사용자 정의 Attribute이며 일반적으로 C#에서 제공되는 Attribute 내장 Attribute라고 합니다. 내장 Attribute 구분은 다음과 같습니다.

 

내장 Attribute 네임스페이스명을 기준으로 분류함

System.ComponentModel 계열

System.ContextStaticAttribute 계열

System.Diagnostics 계열

System.EnterpriseServices 계열

System.Reflection 계열

System.Runtime 계열

 System.Security 계열

 System.Web 계열

System.Xml 계열

12-9 네임스페이스 단위의 Attribute 분류

 내장 Attribute 중에서 가장 기본적인 세가지만 알아보겠습니다. 바로 Conditional Obsolete, DllImport Attribute입니다.

12.10 Conditional

 

Conditional Attribute 이름 그대로 조건부 메서드를 만들 사용합니다. Attribute 메서드에서 사용되며, 앞에서 배웠던 전처리 지시어와 같이 사용됩니다. 그대로 전처리 지시어에서 선언되어 있다면 메서드를 호출하고 전처리 지시어에 선언되어 있지 않다면 메서드를 호출하지 않는 기능을 가지고 있습니다.

 

Conditional Attribute

특정 전처리 식별자에 의해 실행되는 조건부 메서드를 나타냄

 

#define 심볼의 유무에 따라서 호출이 결정되는 조건부 메서드를 만들 사용합니다. Conditional Attribute 사용하려면 반드시 System.Diagnostics using해야 합니다. 다음의 예제는 #define으로 정의한 심볼(symbol) 따라서 어떻게 Conditional Attribute 동작하는지를 보여주고 있습니다.

 

&

ConditionalTest.cs

Ü Conditional Attribute 테스트하는 예제

#define JABOOK
using System;
using System.Diagnostics;

class 
ConditionalTest {
  [Conditional(
"JABOOK"
)]
  
public static void 
DefineMethod(){
    Console.WriteLine(
"Define Conditional Attribute!!"
);
  }
  [Conditional(
"MICROSOFT"
)]
  
public static void 
UndefineMethod(){
    Console.WriteLine(
"Undefine Conditional Attribute!!"
);  
  }
  
public static void Main
() {
    ConditionalTest.DefineMethod();
    ConditionalTest.UndefineMethod();
  } 
//main
//class

C:\C#Example\12>csc ConditionalTest.cs

C:\C#Example\12>ConditionalTest

Define Conditional Attribute!!

 

예제에서는 DefineMethod() 메서드와 UndefineMethod() 메서드를 같은 형식으로 정의하였습니다. 다른 점이 있다면 JABOOK MICROSOFT #define으로 정의하였는가의 차이입니다.

 

[Conditional("JABOOK")]

public static void DefineMethod(){

             Console.WriteLine("Define Conditional Attribute!!");

}

[Conditional("MICROSOFT")]

public static void UndefineMethod(){

             Console.WriteLine("Undefine Conditional Attribute!!");      

}

 

다시 설명하면 Conditional Attribute #define으로 정의된 문자를 사용하였을 경우 메서드를 실행시키지만 정의되지 않은 문자를 사용하여 정의하면 메서드는 호출되지 않는 것입니다. 메서드 중에서 ‘#define JABOOK’ 영향을 미치는 것은 바로 DefineMethod() 메서드입니다.

 

ConditionalTest.DefineMethod(); // #define JABOOK 있기 때문에 호출

ConditionalTest.UndefineMethod(); //#define MICROSOFT 없기 때문에 호출되지 않음

 

Conditional Attribute 사용하기 위해서는 가지 규칙을 지켜 주어야 합니다. 먼저, System.Diagnostics 네임스페이스를 using하여야 한다는 것입니다. 두번째는 메서드의 반환형이 void형이어야 한다는 것입니다. 세번째는 인터페이스의 멤버메서드는 Conditional Attribute 만들 없습니다. 다음 절에서는 Obsolete Attribute 대해서 알아보겠습니다.

3163 view

4.0 stars