프로그래밍/C#

C# 사용자 정의 속성: 코드에 메타데이터를 추가하는 강력한 도구

shimdh 2025. 9. 7. 13:01
728x90

C#의 속성은 코드에 메타데이터를 추가할 수 있는 강력한 기능입니다. 이 메타데이터는 런타임, 도구 또는 다른 개발자가 클래스, 메서드, 속성 및 코드 내의 다른 요소의 동작과 목적을 더 잘 이해하는 데 사용될 수 있습니다. [Obsolete][Serializable]과 같은 미리 정의된 속성이 존재하지만, 사용자 정의 속성을 생성하면 애플리케이션의 필요에 맞춘 특정 동작을 정의할 수 있는 유연성을 제공합니다.

사용자 정의 속성이란 무엇인가?

사용자 정의 속성은 개발자가 System.Attribute에서 파생된 자신만의 속성 클래스를 만들 수 있게 합니다. 이러한 사용자 정의 속성은 클래스, 메서드, 속성, 필드와 같은 다양한 프로그램 엔티티에 적용될 수 있습니다. 사용자 정의 속성의 주요 목적은 런타임이나 디자인 타임에 이러한 엔티티의 동작에 영향을 줄 수 있는 추가 정보를 제공하는 것입니다.

728x90

사용자 정의 속성 생성하기

사용자 정의 속성을 생성하려면 다음 단계를 따릅니다:

  1. 속성 클래스 정의:
    • System.Attribute를 상속합니다.
    • 필요에 따라 적절한 생성자를 사용합니다.
    • 속성에 대한 데이터를 저장할 속성을 선택적으로 정의합니다.
  2. 속성 적용:
    • 클래스나 메서드 선언 위에 대괄호([])를 사용하여 적용합니다.

예제 코드

using System;

// 1단계: 사용자 정의 속성 정의
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DeveloperInfoAttribute : Attribute
{
    public string Developer { get; }
    public string DateCreated { get; }

    public DeveloperInfoAttribute(string developer, string dateCreated)
    {
        Developer = developer;
        DateCreated = dateCreated;
    }
}

// 2단계: 사용자 정의 속성 적용
[DeveloperInfo("Alice Johnson", "2023-10-01")]
public class SampleClass
{
    [DeveloperInfo("Bob Smith", "2023-10-02")]
    public void SampleMethod()
    {
        // 메서드 구현...
    }
}

이 예제에서 DeveloperInfoAttribute라는 속성을 생성하여 특정 코드의 개발자와 생성 날짜에 대한 정보를 저장합니다. 이 속성을 클래스 수준(SampleClass)과 메서드 수준(SampleMethod) 모두에 적용했습니다.

사용자 정의 속성 접근하기

런타임에 반사를 사용하여 이러한 사용자 정의 속성에 접근하려면 다음과 같은 코드를 사용할 수 있습니다:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        // SampleClass에 대한 타입 정보 가져오기
        Type type = typeof(SampleClass);

        // SampleClass에 대한 사용자 정의 속성 가져오기
        object[] classAttributes = type.GetCustomAttributes(typeof(DeveloperInfoAttribute), false);

        foreach (var attr in classAttributes)
        {
            var developerAttr = (DeveloperInfoAttribute)attr;
            Console.WriteLine($"Class Developed By: {developerAttr.Developer}, Date Created: {developerAttr.DateCreated}");
        }

        // SampleMethod에 대한 사용자 정의 속성 가져오기
        MethodInfo method = type.GetMethod("SampleMethod");
        object[] methodAttributes = method.GetCustomAttributes(typeof(DeveloperInfoAttribute), false);

        foreach (var attr in methodAttributes)
        {
            var developerAttr = (DeveloperInfoAttribute)attr;
            Console.WriteLine($"Method Developed By: {developerAttr.Developer}, Date Created: {developerAttr.DateCreated}");
        }
    }
}

이 코드 조각에서 반사(GetType, GetCustomAttributes)를 사용하여 클래스와 메서드에서 이전에 정의한 DeveloperInfo 세부 정보를 가져옵니다. 프로그램을 실행하면 다음과 같은 출력이 나타납니다:

Class Developed By: Alice Johnson, Date Created: 2023-10-01
Method Developed By: Bob Smith, Date Created: 2023-10-02

사용자 정의 속성의 실용적 응용

  1. 문서화: 코드와 함께 저작권이나 버전 기록을 문서화할 수 있습니다.
  2. 유효성 검사: 적용된 속성을 기반으로 자동으로 강제할 수 있는 유효성 검사 규칙을 생성합니다.
  3. 구성 설정: 별도의 구성 파일 없이 관련 메서드/클래스 옆에 구성 관련 데이터를 저장합니다.
  4. 프레임워크 통합: 많은 프레임워크가 사용자 정의 속성을 광범위하게 사용합니다. 예를 들어, ASP.NET MVC는 컨트롤러 내에서 라우팅 작업을 위해 이를 사용합니다.

결론

사용자 정의 속성은 C# 애플리케이션을 의미 있는 메타데이터로 강화할 수 있는 상당한 유연성을 제공합니다. 이는 문서화와 기능 확장을 지원하며, 논리와 설명적 정보를 명확하게 분리할 수 있게 합니다. 사용자 정의 속성의 작동 방식을 이해하면 기존 시스템을 강화할 수 있을 뿐만 아니라, 개발 관행에 직접 연결된 잘 정의된 주석을 통해 코드 소유권과 의도를 명확히 제공함으로써 협업하는 팀에게도 힘을 실어줍니다.

728x90