C#의 속성은 코드에 메타데이터를 추가할 수 있는 강력한 기능입니다. 이 메타데이터는 런타임, 도구 또는 다른 개발자가 클래스, 메서드, 속성 및 코드 내의 다른 요소의 동작과 목적을 더 잘 이해하는 데 사용될 수 있습니다. [Obsolete]나 [Serializable]과 같은 미리 정의된 속성이 존재하지만, 사용자 정의 속성을 생성하면 애플리케이션의 필요에 맞춘 특정 동작을 정의할 수 있는 유연성을 제공합니다.
사용자 정의 속성이란 무엇인가?
사용자 정의 속성은 개발자가 System.Attribute에서 파생된 자신만의 속성 클래스를 만들 수 있게 합니다. 이러한 사용자 정의 속성은 클래스, 메서드, 속성, 필드와 같은 다양한 프로그램 엔티티에 적용될 수 있습니다. 사용자 정의 속성의 주요 목적은 런타임이나 디자인 타임에 이러한 엔티티의 동작에 영향을 줄 수 있는 추가 정보를 제공하는 것입니다.
사용자 정의 속성 생성하기
사용자 정의 속성을 생성하려면 다음 단계를 따릅니다:
- 속성 클래스 정의:
System.Attribute를 상속합니다.- 필요에 따라 적절한 생성자를 사용합니다.
- 속성에 대한 데이터를 저장할 속성을 선택적으로 정의합니다.
- 속성 적용:
- 클래스나 메서드 선언 위에 대괄호(
[])를 사용하여 적용합니다.
- 클래스나 메서드 선언 위에 대괄호(
예제 코드
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
사용자 정의 속성의 실용적 응용
- 문서화: 코드와 함께 저작권이나 버전 기록을 문서화할 수 있습니다.
- 유효성 검사: 적용된 속성을 기반으로 자동으로 강제할 수 있는 유효성 검사 규칙을 생성합니다.
- 구성 설정: 별도의 구성 파일 없이 관련 메서드/클래스 옆에 구성 관련 데이터를 저장합니다.
- 프레임워크 통합: 많은 프레임워크가 사용자 정의 속성을 광범위하게 사용합니다. 예를 들어, ASP.NET MVC는 컨트롤러 내에서 라우팅 작업을 위해 이를 사용합니다.
결론
사용자 정의 속성은 C# 애플리케이션을 의미 있는 메타데이터로 강화할 수 있는 상당한 유연성을 제공합니다. 이는 문서화와 기능 확장을 지원하며, 논리와 설명적 정보를 명확하게 분리할 수 있게 합니다. 사용자 정의 속성의 작동 방식을 이해하면 기존 시스템을 강화할 수 있을 뿐만 아니라, 개발 관행에 직접 연결된 잘 정의된 주석을 통해 코드 소유권과 의도를 명확히 제공함으로써 협업하는 팀에게도 힘을 실어줍니다.
'프로그래밍 > C#' 카테고리의 다른 글
| C#의 ExpandoObject: 동적 프로그래밍의 새로운 가능성 (0) | 2025.09.08 |
|---|---|
| C#의 동적 타입: 유연성과 도전의 조화 (0) | 2025.09.07 |
| C#의 사전 정의된 속성: 코드에 메타데이터를 추가하는 강력한 도구 (0) | 2025.09.06 |
| C# 리플렉션: 동적 프로그래밍의 강력한 도구 (0) | 2025.09.06 |
| C# 리플렉션: 동적 프로그래밍의 강력한 도구 (1) | 2025.09.05 |