Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 사용자 지정 속성(Custom Attribute)을 만드는 방법


사용자 지정 속성(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(...)] 형태로 붙여 사용할 수 있으며, 런타임에 리플렉션으로 꺼내어 디버깅 정보를 확인하는 데 활용할 수 있습니다.