본문 바로가기
Development/C#

Attribute 사용처

by KingCat 2010. 3. 8.

C#을 하다보니 [ ]에 둘러쌓인 Attribute를 자주 접하게 됩니다. 하지만 설명은 어딜 찾아봐도 모두 애매하게 나와있는게 현실이죠. 그래서 약간 집중해서 웹을 뒤져봤습니다.
우선 간단한 용도나 특징은 이렇습니다.

* Runtime(런타임)에게 특정 작업에 대한 지시를 하기 위해 사용한다.
* .NET Framework의 일부분이다.
* 내장 Attribute와 사용자 정의 Attribute 모두 사용 가능하다.

이것만 가지고는 이해가 되지 않죠? 그럼 MSDN에서 찾은 소스를 보도록 하죠.

Type type = Type.GetType("cTest");
// 우선 cTest라는 클래스의 타입을 가져옵니다.
foreach(Attribute attr in type.GetCustomAttributes(true)
{
     UserAttribute aat = attr as UserAttribute;
     Console.writeLine(aat.GetMsg());
}
// 위 소스의 내용은 type을 가져온 클래스(cTest)의 사용자 정의 Attribute를 attr이라는 Attribute에 넣습니다.
// 이게 가능할려면 소스에는 없지만 cTest라는 클래스가 생성되어 있어야 되고, 그 클래스에 사용자 정의 Attribute가 정의되어 있어야 됩니다.

[UserAttribute("유저 애트리뷰트입니다.")]
public class cTest{
....
} // 요런 식으로. 물론 UserAttribute 역시 사용자 정의 Attribute 이므로 클래스로 정의가 되있어야 됩니다.

public class UserAttribute : Attribute{ // Attribute를 상속 받아서
.... // 당연히 string 관련 처리 메서드가 있겠죠? ^^:
}

UserAttribute aat = attr as UserAttribute; // 이 구문은 attr이 Attribute 형식이니 UserAttribute로 변환해줍니다. as는 에러시 Null을 반환합니다. 그래서 더 안정적이라나 뭐라나...

결국 출력하면 "유적 애트리뷰트입니다."가 나옵니다.

클래스가 아닌 멤버 변수들에게 사용자 정의 Attribute를 걸어놨을 때는
foreach(FieldInfo finfo in type.GetFields()) // 이렇게 필드 정보를 얻어와서 위에서 나온 foreach 문처럼 Attribute를 가져오면 됩니다.

메서드는 foreach(MethodInfo minfo in type.GetMethods())로 가져와서 마찬가지로
foreach(Attribute attr in minfo.GetCustomAttributes(true)) 이런 식으로 가져오게 됩니다.

여기까지를 살펴보면 Attribute는 일종의 설명서? 주석문? 같은 것 같습니다. 그러나 이것이 다가 아니었으니...
"* Runtime(런타임)에게 특정 작업에 대한 지시를 하기 위해 사용한다." 라는 말을 잊으셨나요?
다음 글에서는 특정 작업에 대한 지시라는게 어떤 것인지 공부해봅시다.