사용자 지정 속성(Custom Attribute)은 코드에 선언적 정보를 저장할 수 있게 해주며, 저장된 정보는 런타임에 리플렉션(Reflection)을 통해 조회할 수 있습니다.
이번 글에서는 C#에서 사용자 지정 속성을 선언하고 구현하는 방법을 단계별로 살펴보겠습니다.
사용자 지정 속성 선언하기
사용자 지정 속성 클래스는 System.Attribute 클래스를 상속받아 정의하며, AttributeUsage 특성을 통해 해당 속성이 적용될 수 있는 대상을 지정합니다.
[AttributeUsage ( AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
예제: DeBugInfo 속성 설계
이번 예제에서는 프로그램을 디버깅하면서 얻은 정보를 저장하는 DeBugInfo라는 이름의 사용자 지정 속성을 만들어 보겠습니다.
DeBugInfo 클래스는 앞의 세 가지 정보를 저장하기 위한 세 개의 private 필드와, 추가 메시지를 저장하기 위한 하나의 public 필드를 가집니다.
- 버그 번호(bugNo), 개발자 이름(developer), 검토 날짜(lastReview) → 생성자의 위치 매개변수(positional parameter)
- 메시지(message) → 선택적으로 지정할 수 있는 명명된 매개변수(named parameter)
모든 속성(Attribute) 클래스에는 반드시 최소 한 개 이상의 생성자가 있어야 합니다. 아래 예제를 통해 사용자 지정 속성이 실제로 어떻게 작성되는지 확인해 보겠습니다.
전체 코드 예제
//a custom attribute BugFix to be assigned to a class and its members
[AttributeUsage (
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute {
private int bugNo;
private string developer;
private string lastReview;
public string message;
public DeBugInfo(int bg, string dev, string d) {
this.bugNo = bg;
this.developer = dev;
this.lastReview = d;
}
public int BugNo {
get {
return bugNo;
}
}
public string Developer {
get {
return developer;
}
}
public string LastReview {
get {
return lastReview;
}
}
public string Message {
get {
return message;
}
set {
message = value;
}
}
}코드 설명
- AttributeUsage: 이 속성을 클래스, 생성자, 필드, 메서드, 프로퍼티에 적용할 수 있도록 허용합니다.
- AllowMultiple = true: 동일한 대상에 같은 속성을 여러 번 중복 적용할 수 있습니다.
- 생성자: 버그 번호, 개발자 이름, 검토 날짜라는 세 가지 필수 값을 초기화합니다.
- BugNo / Developer / LastReview 프로퍼티: private 필드를 읽기 전용으로 외부에 노출합니다.
- Message 프로퍼티: 읽기와 쓰기가 모두 가능하여, 선택적인 추가 정보를 담을 때 사용합니다.
이렇게 정의한 DeBugInfo 속성은 클래스나 멤버 위에 [DeBugInfo(...)] 형태로 붙여 사용할 수 있으며, 런타임에 리플렉션으로 꺼내어 디버깅 정보를 확인하는 데 활용할 수 있습니다.