애트리뷰트 ( Attribute )
코드 ( 클래스 , 메서드 , 필드 등 ) 에 부가 정보를 붙이는 메타데이터 시스템이다.
이 코드가 어떤 성격을 가지고 있다는 설명서나 라벨을 붙이는 개념이다.
예시
- 이 메서드는 오래된 버전이다.
- 이 클래스는 직렬화 가능하다.
- 이 필드는 저장하지 마세요.
처럼 컴파일러나 런타임이 참고할 수 있는 정보를 표시할 때 쓰인다.
작동 원리
C# 에서는 모든 애트리뷰트가 System.Attribute 클래스를 상속받는 클래스 객체이다.
[ ] 대괄호 안에 작성해서 코드 요소 위에 붙이면 컴파일러가 이 정보를 메타데이터로 저장한다.
리플렉션 ( Reflection )으로 읽을 수 있게 된다.
주석처럼 보이지만 실제로 실행 시 읽을 수 있는 데이터이다.
[Obsolete("이 메서드는 더 이상 사용되지 않습니다.")]
public void OldMethod() { }
▲이 코드에서 [Obsolete] 는 컴파일러에게 이거 쓰면 경고 띄워줘 라고 알려주는 명령이다.
문법
[애트리뷰트이름(매개변수)]
대상_코드_요소
▼예시
[Serializable]
public class PlayerData
{
public string name;
public int level;
}
이렇게 하면 PlayerData 클래스는 직렬화 가능한 클래스로 표시된다
Unity나 .NET 의 직렬화 시스템이 이 객체를 파일로 저장하거나 불러올 수 있게 된다.
대표적인 내장 애트리뷰트
| 애트리뷰트 | 설명 |
| [Obsolete] | 오래된 코드임을 알림 (컴파일러 경고 발생) |
| [Serializable] | 직렬화 가능한 클래스 표시 |
| [NonSerialized] | 직렬화 제외할 필드 지정 |
| [Conditional] | 조건부 컴파일 제어 |
| [DllImport] | 외부 DLL 호출용 (P/Invoke) |
| [AttributeUsage] | 커스텀 애트리뷰트 적용 범위 지정 |
커스텀 애트리뷰트 만들기
직접 애트리뷰트를 정의할 수 있다.
방법은 간단하게 Attribute 를 상속하면 된다.
using System;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DeveloperInfoAttribute : Attribute
{
public string Developer { get; }
public string Date { get; }
public string Description { get; set; }
public DeveloperInfoAttribute(string developer, string date)
{
Developer = developer;
Date = date;
}
}
▼예시
[DeveloperInfo("HoChan", "2025-10-14", Description = "테스트용 클래스")]
public class ExampleClass
{
public void Test() { }
}
이렇게 하면 ExampleClass 에 개발자 정보라는 메타데이터가 붙는다.
리플렉션으로 읽기
애트리뷰트는 실행 중에 읽을 수 있다는게 핵심이다.
리플렉션 ( Reflection ) 을 이용해서 , 프로그램이 자신의 메타데이터를 스스로 확인할 수 있다.
Type type = typeof(ExampleClass);
object[] attributes = type.GetCustomAttributes(false);
foreach (var attr in attributes)
{
if (attr is DeveloperInfoAttribute info)
{
Console.WriteLine($"개발자: {info.Developer}");
Console.WriteLine($"날짜: {info.Date}");
Console.WriteLine($"설명: {info.Description}");
}
}
▼출력
개발자: HoChan
날짜: 2025-10-14
설명: 테스트용 클래스
실행 중에 이 클래스에는 어떤 정보가 붙어있는지를 읽는다.
툴이나 프레임워크에서 자동 처리할 수 있다.
주의할 점
- 이름 끝에는 항상 Attribute 를 붙이지만 사용할 때는 생략 가능
└ 예시 : ([Obsolete] == [ObsoleteAttribute]) - 애트리뷰트는 코드 실행 순서나 로직을 바꾸지 않는다.
└ 오직 정보 제공자의 역할을 한다. - 너무 남발하면 코드가 복잡해지고 가독성이 떨어진다.
- 리플렉션은 성능 비용이 있으므로 자주 호출하지 않는 게 좋다.
정리
C# 애트리뷰트는 코드에 의미 , 설명 , 지시문을 붙이는 메타데이터이다.
컴파일러 , 런타임 , 툴이 이를 읽고 특별한 처리를 하도록 돕는 시스템이다.
참고 자료
'⭐C Sharp > 00. 문법' 카테고리의 다른 글
| 선택적 매개변수 (0) | 2025.12.23 |
|---|---|
| 얕은 복사 vs 깊은 복사 (0) | 2025.10.19 |
| IsNumeric (0) | 2025.10.08 |
| goto 문법 (0) | 2025.10.08 |
| C# 콘솔 색상 제어 ( Console Color Control ) (0) | 2025.10.06 |