C#에서 특성(Attribute)은 프로그램 내의 클래스, 메서드, 구조체, 열거형, 어셈블리 등 다양한 요소의 동작에 관한 정보를 런타임에 전달하기 위해 사용되는 선언적 태그(declarative tag)입니다. 특성을 활용하면 코드 자체를 수정하지 않고도 프로그램에 선언적인 메타데이터를 추가할 수 있습니다.
특성이란 무엇인가?
특성은 대상 요소 바로 위에 대괄호([ ])로 표시됩니다. 컴파일된 코드에는 이 메타데이터가 함께 저장되며, 리플렉션(Reflection)을 통해 런타임에 조회하거나 활용할 수 있습니다.
특성의 기본 문법
특성을 적용하는 기본 문법은 다음과 같습니다.
[attribute(positional_parameters, name_parameter = value, ...)] Element
- 위치 매개변수(positional_parameters): 특성 생성자의 필수 인자입니다.
- 이름 매개변수(name_parameter = value): 선택적으로 지정하는 명명된 인자입니다.
.NET 프레임워크의 두 가지 특성 유형
.NET 프레임워크는 크게 두 종류의 특성을 제공합니다.
- 미리 정의된 특성(Pre-defined Attributes): 프레임워크에서 기본 제공하는 특성으로, 예를 들어
Obsolete,Serializable등이 있습니다. - 사용자 정의 특성(Custom Built Attributes): 개발자가 직접 정의하여 사용하는 특성입니다.
커스텀 특성 선언 방법
사용자 정의 특성은 System.Attribute 클래스를 상속받아 선언합니다. 아래는 클래스와 그 멤버에 적용할 수 있는 BugFix라는 이름의 커스텀 특성을 선언한 예제입니다.
//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
코드 설명
- AttributeUsage: 해당 특성이 적용될 수 있는 대상을 지정합니다. 위 예제에서는 클래스, 생성자, 필드, 메서드, 속성에 적용할 수 있도록 설정했습니다.
- AllowMultiple = true: 동일한 요소에 같은 특성을 여러 번 중복해서 적용할 수 있음을 의미합니다.
- DeBugInfo : System.Attribute:
System.Attribute를 상속함으로써DeBugInfo가 유효한 특성 클래스가 됩니다.
이처럼 특성을 잘 활용하면 코드의 의도를 명확히 표현하고, 런타임에 동적으로 메타데이터를 읽어 유연한 프로그래밍이 가능해집니다.