[ 공 부 ]/[ C# ]

16장. 애트리뷰트

HiStar__ 2025. 1. 28. 21:33

[2025-01-27] - 게시글 최초 작성
[2025-02-15] - 내용 추가


1. 애트리뷰트란?

  • 애트리뷰트는 코드에 대한 부가 정보를 기록하고 읽을 수 있는 기능
  • 주석은 사람이 읽고 쓰는 정보라면, 애트리뷰트는 사람이 작성하고 컴퓨터가 읽음
  • 애트리뷰트( [ ] )를 이용해서 클래스나 구조체, 메소드, 프로퍼티 등에 추가 정보를 제공하는 기능.
     - 컴파일러, 런타임, 리플렉션 등을 활용하여 특정 동작을 수행하거나 데이터를 추가적으로 저장 가능.

  * 메타데이터 : 데이터의 데이터 ( 애트리뷰트리플렉션을 통해 얻는 정보들도 C# 코드의 메타데이터 )


2. 애트리뷰트

2.1 애트리뷰트 사용하기

기본적으로 제공하는 애트리뷰트

[Serializable]
 : 직렬화 가능하다는 메타데이터 추가시

[Obsolete]
 : 사용되지 않는 코드 표시

[DebuggerStepThrough]
 : 디버깅 시 코드 스킵시

[DLLImport]
 : 외부 DLL 함수 사용시

[Conditional]
 : 조건부 메소드 실행을 지정할 때 사용

[MethodImpl]
 : JIT 컴파일러의 최적화 설정

 

코드 요소 앞에 대괄호 [ 와 ] 를 붙이고 그안에 애트리뷰트의 이름을 넣으면 된다
.NET에서 기본적으로 제공하는 Obsolete 애트리뷰트의 예시

using System;

namespace ThisIsCSharp
{
    /*
     [애트리뷰트_이름(애트리뷰트_매개변수)]
     public void MyMethod()
     {
        // ...
     }
     */
    class MyClass
    {
        [Obsolete("OldMethod는 폐기되었습니다. NewMethod()를 이용하세요.")]
        public void OldMethod()
        {
            Console.WriteLine("I'm Old");
        }

        public void NewMethod()
        {
            Console.WriteLine("I'm New");
        }
    }

    internal class MainApp
    {
        static void Main(string[] args)
        {
            MyClass obj = new MyClass();
            obj.OldMethod();
            obj.NewMethod();
        }
    }
}

 

오류 목록를 확인


2.2 호출자 정보 에트리뷰트

 호출자 정보는 메소드의 호출자 이름, 호출자 메소드가 정의된 소스 파일 경로, 심지어 소스파일 내 행 번호까지 알 수 있다.
 ( C / C++의 __FILENAME__, __LINE__, __FUNCTION__ )

CallerMemberNameAttribute : 현재 메소드의 호출한 메소드 or 프로퍼티의 이름 나타냄
CallerFilePathAttribute : 현재 메소드가 호출된 소스 파일 경로를 나타냄 ( 경로는 소스 코드를 컴파일 할 떄의 전체 경로 )
CallerLineNumberAttribute : 현재 메소드가 호출된 소스 파일 내의 행 번호를 나타냄

 

using System;
using System.Runtime.CompilerServices;

namespace ThisIsCSharp
{
    public static class Trace
    {
        public static void WriteLine(string message,
            [CallerFilePath] string file = "",
            [CallerLineNumber] int line = 0,
            [CallerMemberName] string member = "")
        {
             Console.WriteLine($"{file}(Line:{line}) {member}:{message}");
        }
    }

    internal class MainApp
    {
        static void Main(string[] args)
        {
            Trace.WriteLine("즐거운 프로그래밍!");
        }
    }
}


2.2 커스텀 애트리뷰트

 모든 애트리뷰트는 System.Attribute 클래스로부터 상속

 

 해당 클래스로 상속받은 애트리뷰트는 겹쳐서 사용이 불가능 하다.
 하지만, System.AttributeUsage라는 애트리뷰트 도움을 받는다면 가능. ( 중복해서 사용 )

 System.AttributeUsage의 첫 번째 매개변수, 설명 대상이 무엇인지 나타냄 [ msdn ] Attribute Target

 

AttributeTargets Enum (System)

Specifies the application elements on which it is valid to apply an attribute.

learn.microsoft.com

using System;

namespace ThisIsCSharp
{
    /*
     System.AttributeUsage(_,AllowMultiple = true) 해당 설정이 없을 경우, 중복해서 사용이 불가능하다 
     */
    [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true)]
    class History : System.Attribute
    {
        private string programmer;
        public double version;
        public string changes;

        public History(string programmer)
        {
            this.programmer = programmer;
            version = 1.0;
            changes = "First Release";
        }

        public string GetProgrammer()
        {
            return programmer;
        }
    }

    [History("Sean", version = 0.1, changes = "2017-11-01 Create Class Stub")]
    [History("Bob", version = 0.2, changes = "2020-12-03 Added Func() Method")]
    class MyClass
    { 
        public void Func()
        {
            Console.WriteLine("Func()");
        }
    }

    internal class MainApp
    {
        static void Main(string[] args)
        {
            Type type = typeof(MyClass);
            Attribute[] attributes = Attribute.GetCustomAttributes(type);

            Console.WriteLine("MyClass Change History ...");

            foreach(Attribute a in attributes)
            {
                History h = a as History;
                if(h != null)
                {
                    Console.WriteLine($"Version:{h.version}, Programmer:{h.GetProgrammer()}, Changes:{h.changes}");
                }
            }
        }
    }
}

 


3. 참고자료

'[ 공 부 ] > [ C# ]' 카테고리의 다른 글

19장. Task  (0) 2025.01.30
19장. 스레드  (0) 2025.01.29
18장. 파일 다루기  (0) 2025.01.29
17장 Dynamic 형식  (0) 2025.01.28
16장. 리플렉션  (0) 2025.01.27