Post List

2018/01/26

C#__6.0 애트리뷰트(Attribute)

이번에는 애트리뷰트(Attribute) 대해 알아보겠습니다. 애트리뷰트란 코드에 대한 부가 정보를 기록하고 읽을 있는 기능입니다.
기능과 비슷하게 주석을 이용해서 코드에 대한 정보를 기록하고 읽을 있지만, 에트리뷰트가 주석과 다른 점은 주석이 사람이 읽고 쓰는 정보라면애트리뷰트는 사람이 작성하고 컴퓨터가 읽는다는 것입니다.

애트리뷰트를 이용해서 클래스나 구조체, 메소드, 프로퍼티 등에 데이터를 기록해두면 정보를 C#컴파일러나 C#으로 작성된 프로그램이  정보를 읽어 사용할 있습니다. 

예를 들면, 업체에서 라이브러리를 만들어 배포했다고 합시다. 하지만 라이브러리에서 사용중인 OldMethod()라는 함수에서 문제가 발생해 이를 수정하기 위해선 OldMethod()메소드 사용을 중지하고 NewMethod()메소드를 사용해야 한다는 점입니다. 하지만 이미 배포된 상황에서 Readme.txt 공지로 알리기에는 부족함이 있겠죠. 그래서 라이브러리를 배포하면서 프로그래머들이 OldMethod() 메소드를 사용하려고 하면 컴파일러가 메소드에 대한 경고 메시지를 내도록 하기로 결정했습니다.

이때 경고 메시지에 사용된 기능이 애트리뷰트를 활용한 일부 사례로 있겠습니다.

애트리뷰트의 사용은 무궁무진하게 활용할 있으며, 알아두면 나중에 유용하게 사용할 있답니다.

이제 어떻게 애트리뷰트를 사용하는지 알아보겠습니다. 애트리뷰트를 사용할 설명하고자 하는 코드 요소 앞에 [] 괄호 쌍을 붙이고  안에 애트리뷰트의 이름을 넣으면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
class Profile
{
    public string Name { get; set; }
    public int Height { get; set; }
    [Obsolete("Print메소드는 폐기되었습니다.")]
    public void Print()
    {
        Console.WriteLine("{0}, {1}", Name, Height);
    }
}
cs

Print()메소드가 폐기되었다고 경고메세지를 추가했습니다. 그럼 이제 print메소드를 호출해보겠습니다.

1
2
3
Profile profile = new Profile();
profile.Print();
cs

 Print() 메소드를 호출하는 코드를 입력후 컴파일을 하자 출력창에 위와같은 메시지가 출력이 되는군요.. 그리고 실행을 하니실행은 정상적으로 됩니다.
즉, 애트리뷰트기능을 적용한다고 해서 실행이 안되거나 하진 않습니다. 애트리뷰트기능이 적용된 메소드나 데이터를 사용할 경우 그에 대한 설명이 보여질 뿐이랍니다.


그다음 알아볼 내용은 호출자 정보 애트리뷰트 입니다.
C#에서도 C/C++에서 제공하는 __FILENAME__, __LINE__, __FUNCTION__ 메크로에 해당하는 기능들을 제공한답니다.

처음부터 제공되는 기능은 아니고 C#5.0 버전부터 호출자 정보라는 애트리뷰트가 도입되었답니다.

호출자 정보는 메소드의 매개 변수에 사용되며, 메소드의 호출자 이름, 호출자 메소드가 정의되어 있는 소스 파일 경로, 심지어 소스 파일 내의 행번호까지
있습니다. 기능을 사용해 로그 파일이나 화면에 출력하면 해당 코드가 어디에서 일어났는지를 있죠.
다음 3가지 호출자 정보 애트리뷰트에 대해 알아보겠습니다.

CallerFilePath
현재 메소드가 호출된 소스 파일 경로를 나타냅니다. 경로는 소스 코드를 컴파일할 때의 전체 경로를 나타냅니다.
CallerLineNumber
현재 메소드가 호출된 소스 파일 내의 번호를 나타냅니다.
CallerMemberName
현재 메소드를 호출한 메소드 또는 프로퍼티의 이름을 나타냅니다.

먼저 호출자 정보 애트리뷰트를 사용하기 위해선

1
using System.Runtime.CompilerServices;
cs
위 네임스페이스가 선언이 필요합니다.

호출자 정보 애트리뷰트도 사용 방법이 간단하니 코드로 한번 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Trace
{
    public void WriteLinestring message,
                           [CallerFilePath] string file = "",
                           [CallerLineNumber] int line = 0,
                           [CallerMemberName] string member = "")
    {
        Console.WriteLine("{0}(Line:{1}) {2}: {3}", file, line, member, message);
    }
}
static void Main(string[] args)
{
     Trace trace = new Trace();
     trace.WriteLine("Hello World!");
}
cs



Trace.WriteLine() 선언부를 보면 3가지 호출자 정보 애트리뷰트가 선택적 매개 변수로 사용되고 있습니다.
Trace.WriteLine() 메소드를 호출할 호출자 정보 애트리뷰트로 수식한 매개 변수는 별도로 입력하지 않아도 됩니다.