애트리뷰트 ( C# Attribute )

2025. 10. 14. 17:30·⭐C Sharp/00. 문법

애트리뷰트 ( 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# 애트리뷰트는 코드에 의미 , 설명 , 지시문을 붙이는 메타데이터이다.

컴파일러 , 런타임 , 툴이 이를 읽고 특별한 처리를 하도록 돕는 시스템이다.

 

 

 

참고 자료

https://learn.microsoft.com/ko-kr/dotnet/csharp/advanced-topics/reflection-and-attributes/creating-custom-attributes

 

'⭐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
'⭐C Sharp/00. 문법' 카테고리의 다른 글
  • 선택적 매개변수
  • 얕은 복사 vs 깊은 복사
  • IsNumeric
  • goto 문법
DevHoChan
DevHoChan
맨땅에서 시작하는 코딩 도전
  • DevHoChan
    Debugging Life
    DevHoChan
  • 전체
    오늘
    어제
    • 분류 전체보기 (374)
      • 🕹️Game Life (1)
      • 🖥️Computer Science (5)
      • 📖TIL (141)
        • 🔥Projects (16)
        • 💡DevTips (5)
        • 🤔발생한 문제와 해결 (5)
        • 🔮Unity Graphics (5)
        • 🎤Interview (3)
        • ✅CodingTest (9)
      • 🚀Game Release (4)
      • 🧊Unity Basic (58)
        • 📌용어 사전 (1)
        • 에디터&인터페이스 (3)
        • 디버그 (1)
        • 라이프사이클 (4)
        • 게임오브젝트 (4)
        • 프리팹 (1)
        • 오브젝트풀링 (4)
        • 애트리뷰트 (2)
        • 트랜스폼 (4)
        • 물리&충돌 (1)
        • 프레임&델타타임 (4)
        • 코루틴&이벤트 (7)
        • 수학&보정함수 (3)
        • 디자인패턴 (9)
        • UGUI (3)
        • 벡터 ( Vector ) (3)
        • 씬 ( Scene ) (2)
        • 데이터 관리 (2)
      • ⭐C Sharp (99)
        • 📌용어 사전 (1)
        • 📌문법 사전 (6)
        • 메모리 관리 (3)
        • 00. 문법 (17)
        • 01. 변수 (3)
        • 02. 자료형 (2)
        • 03. 연산자 (6)
        • 04. 조건문 (2)
        • 05. 반복문 (2)
        • 06. 배열 (3)
        • 07. 메서드(함수) (7)
        • 08. 열거형 (3)
        • 09. 구조체 (2)
        • 10. 참조 (2)
        • 11. 객체 지향 (11)
        • 12. 델리게이트 (3)
        • 13. 디자인 패턴 (7)
        • 14. LINQ (1)
        • 📂▼자료구조 (2)
        • 15-1. 제네릭 (3)
        • 15-2. 배열 (4)
        • 15-3. 리스트 (2)
        • 15-4. 스택과 큐 (2)
        • 15-5. 딕셔너리 해시테이블 (2)
        • 15-6. 트리와 그래프 (3)
      • 📊Algorithm (16)
        • BigO (2)
        • 정렬 (4)
        • 셔플 (2)
        • 탐색 (6)
        • 최적화 (1)
      • 📝Game Design (16)
      • 🤖​AI Tools (12)
        • AI 리뷰 분석 (6)
        • Player2 (0)
        • 3D 모델링 (1)
        • 2D 스프라이트 (0)
        • 이미지 (2)
        • 사운드 (1)
        • 동영상 (1)
        • 문서 (1)
      • 🌍Network (6)
      • 🌱Github (11)
        • 기본 개념 (7)
        • 명령어 (1)
        • 도구 활용 (1)
      • ⚙️Visual Studio (5)
        • 🔧설치 및 환경설정 (2)
        • ⌨️HotKey (1)
        • 🚨디버깅 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    csharp
    게임기획
    디자인패턴
    기획
    gamedesign
    문법
    algorithm
    객체지향
    자료구조
    부트캠프
    메모리관리
    CodingTest
    게임디자인
    OOP
    c#
    GitHub
    unity
    유니티
    til
    자료형
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
DevHoChan
애트리뷰트 ( C# Attribute )
상단으로

티스토리툴바