C# Attribute(어트리뷰트)
컴파일러에게 코드에 대한 추가 정보를 제공, 선언 형식
어트리뷰트는 크게 시스템이 제공하는 공통 어트리뷰트와 사용자가 직접 정의하는 커스텀 어트리뷰트로 구분
1. Attribute Naming
[대문자+소문자+Attribute]
: 뒤에 Attribute를 붙이면 Attribute를 사용할때 Attribute를 빼고 사용가능
예) [Requested] = [RequestedAttribute]
2. 공통 어트리뷰트(Conditinal, Obsolete, DllImport)
예) COM 라이브러 함수나 Win32함수 사용
[DllImport("user32.dll")]
public static extern int MessageBox(int hParent, string Message, string Caption, int Type);
외부의 DLL 함수이므로 extern 지정자, 클래스 멤버가 아니므로 static
3. Custom Attribute(커스텀 어트리뷰트)
컴파일 방식이나 생성되는 기계어 코드에는 전혀 영향을 주지 않음.
실행 파일에 메타 데이타로 포함, 리플렉션으로 이 정보를 관리 가능.
대규모 프로젝트에서 작성자, 작성시점, 수정사항, 버그, 메모등 기록하여 사용, 프로젝트 관리가 대폭 자동화됨
예)
using System;
// Attribute도 class로 정의, Attribute 클래스로 부터 상속받아야 함.
// AttributeUsage 는 생략가능하나 정확한 대상 지정시 꼭 필요함
// AttributeUsage 속성 ValidOn : AttributeTargets - 열거형으로 어떤코드에 적용할지 지정, 두개이상은 | 연산자 사용
// AttributeUsage 속성 AllowMultiple : 한 대상에 여러번 적용 가능한지 지정, Default = false
// AttributeUsage 속성 Inherited : 파생 클래스나 재정의 메서드 적용가능한지 지정, Default = true
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Field, AllowMultiple = true, Inherited = false)]
class ProgrammerAttribute : Attribute
{
public string Name;
private string Time;
public ProgrammerAttribute(string aName)
{
Name = aName;
Time = "기록없음";
}
public string When
{
get { return Time; }
set { Time = value; }
}
}
class CStest
{
// Programmer에서 Name은 이름없는 인수, When은 이름있는 인수이다.
// 이름없는 인수는 생성자로 전달, 반드시 지정해야 하지만, 이름있는 인수는 언제든 지정 가능
[Programmer("Kim")]
static public int Field1 = 0;
// 이름있는 인수, 없는 인수 둘다 지정할 경우, 이름없는 인수가 반드시 먼저 와야함
[Programmer("Kim",When= "2007년 6월 29일")]
static public void Method1(){}
[Programmer ("Lee")]
static public void Method2(){}
// Park과 Choi가 같이 만들었음을 표현
[Programmer("Park"),Programmer("Choi")]
static public void Method3(){}
static void Test()
{
PrintInfo(typeof(Field1));
PrintInfo(typeof(Method1));
PrintInfo(typeof(Method2));
PrintInfo(typeof(Method3));
}
static void PrintInfo(System.Type t)
{
System.Console.WriteLine("information for {0}", t);
// Using reflection.
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t); // Reflection.
// Displaying output.
foreach (System.Attribute attr in attrs)
{
if (attr is ProgrammerAttribute)
{
ProgrammerAttribute a = (ProgrammerAttribute)attr;
System.Console.WriteLine(" {0}, version {1}", a.Name, a.When);
}
}
}
}
상기 코드는 임의로 작성된 코드로 실행시 오류가 발생할수 있습니다.
|