EveryDay.DevUp

[Unity] 특성 ( Attribute Class ) - 1 본문

C#

[Unity] 특성 ( Attribute Class ) - 1

EveryDay.DevUp 2022. 7. 7. 00:38

* 특성

- Attribute 클래스는 미리 정의된 시스템 정보 또는 사용자가 정의한 정보를 대상 요소와 결합하여 메타데이터에 저장

- 메타 데이터에 저장된 정보를 런타임에서 참조하여 특별한 기능을 수행할 수 있음 

- 모든 특성 형식은 Attribute 클래스에서 직간접적으로 파생됨

https://docs.microsoft.com/ko-kr/dotnet/api/system.attribute?view=netstandard-2.0 

 

Attribute 클래스 (System)

사용자 지정 특성에 대한 기본 클래스를 나타냅니다.

docs.microsoft.com

- AttributeUsageAttribute는 다른 특성 클래스의 사용상의 제한 조건을 걸 수 있는 특성 클래스

- AttributeUsageAttribute의 생성자는 AttributeTarget을 파라미터로 가지며, 속성으로 제공되는 AllowMultiple, Inherited는 이름 = 값으로 설정할 수 있음

- Attribute 대상 요소는 AttributeUsageAttribute클래스의 AttributeTarget을 통해 설정할 수 있는데, 별도로 설정하지 않으면 모든 대상 요소를 가짐

- Attribute의 대상을 지정하지 않으면,  다음에 나오는 코드에 따라 대상을 설정함. Assembly의 경우 다음 코드가 없기 때문에 특성 사용 시 항상 assembly type이 오는 것을 명시해주어야함

ex) [ method:Attribute] : 대상을 지정할 경우 대상 타켓 : 특성으로 사용

ex) [ AttributeUsage( AttributeTarget.Method, AllowMultiple = true, Inherited = false )] : AttributeTarget외에 파라미터는 '이름=값'으로 설정

- 동일한 특성을 같은 대상에게 여러개 지정하려면 AttributeUsage 클래스의 AllowMultiple을 true로 설정해야하는데, 기본 값은 false

- 특성을 지정한 대상을 상속받는 타입에도 부모의 특성을 주기위해서는 Inherited 값을 true로 설정해야하는데, 기본 값은 true

- 설정한 대상의 대한 정보를 가져올 때는 AttributeUsage으 ValidOn으로 가져올 수 있음

https://docs.microsoft.com/ko-kr/dotnet/api/system.attributeusageattribute?view=netstandard-2.0 

 

AttributeUsageAttribute 클래스 (System)

다른 특성 클래스의 사용을 지정합니다. 이 클래스는 상속될 수 없습니다.

docs.microsoft.com

: https://docs.microsoft.com/ko-kr/dotnet/api/system.attributetargets?view=netstandard-2.0 

 

AttributeTargets 열거형 (System)

특성을 적용하는 데 유효한 애플리케이션 요소를 지정합니다.

docs.microsoft.com

[Creator("everyday.devup")]
// CreatorAttribute이지만 뒤의 Attribute는 생략할 수 있음
class Program
{
    [method:Creator("everyday.devup")] // 특성 앞에 대상을 정의하여 적용될 대상을 명시할 수 있음
    //[return:Creator("everyday.devup")] 
    // error : AttributeUsage의 타겟을 클래스와 함수로만 설정했기 때문에 
    // return 타입을 사용할 수 없음
    static void Main(string[] args) {
        Program pg = new Program();

        Type type = pg.GetType();
        // Program Class 에 있는 Method 정보를 가져옴
        foreach (MethodInfo mInfo in type.GetMethods())
        {
            // Method에 설정된 속성 정보를 가져옴
            foreach (Attribute attr in
                Attribute.GetCustomAttributes(mInfo))
            {
                // 속성 정보 중 CreatorAttribute type을 찾음
                if (attr.GetType() == typeof(CreatorAttribute))
                {
                    Console.WriteLine("Method {0}", mInfo.Name);
                }
            }
        }
    }

    [method: Creator("everyday.devup")]
    public void Print() { }
}

[AttributeUsage( AttributeTargets.Class | AttributeTargets.Method , AllowMultiple = true )]
class CreatorAttribute : Attribute
{
    string creator;

    public CreatorAttribute( string name )
    {
        creator = name;
    }
}

- 특성이 정의된 C# 코드를 컴파일 하여 dll로 만들면, 다음과 같이 Metadata의 CustomAttribute에 특성이 정의된 것을 확인할 수 있음