[2025-01-27] - 게시글 최초 작성
[2025-02-15] - 내용 추가
[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 |