Attribute: CallerInfo

00·2024년 12월 31일

C#

목록 보기
97/149
using System;
using System.Runtime.CompilerServices;


/*
CallerInfo 애트리뷰트:
호출자 정보(Caller Information) 애트리뷰트입니다.
호출자 정보는 메서드의 매개변수에 사용되며, 
메서드의 호출자 이름, 호출자 메서드가 정의된 소스 파일 경로, 심지어 소스 파일 내 행 번호까지 알 수 있습니다.
(C/C++의 __FILENAME__, __LINE__, __FUNCTION__ 매크로에 해당하는 기능입니다.)
이를 이용해서 응용 프로그램의 이벤트를 로그 파일이나 화면에 출력하면,
그 이벤트가 어떤 코드에서 일어났는지 알 수 있습니다.

호출자 정보 애트리뷰트 3개
(1) CallerMemberName: 현재 메서드를 '호출한 멤버(메서드 또는 프로퍼티)의 이름'을 나타냅니다.
(2) CallerFilePath: 현재 메서드가 '호출된 소스 파일 경로'를 나타냅니다. 
                    이때 경로는 소스 코드를 컴파일할 때의 전체 경로를 나타냅니다. 
(3) CallerLineNumber: 현재 메서드가 '호출된 소스 파일 내의 행 번호'를 나타냅니다.
 */


// 호출자 정보 애트리뷰트(Caller Info 애트리뷰트)를 사용하여 호출자 정보를 출력하는 방법 
namespace CallerInfo
{
    public static class Trace // Trace라는 이름의 정적 클래스를 정의합니다.
    {
        public static void WriteLine(string message, // WriteLine 메서드를 정의합니다.
                                                     // string message: 출력할 메시지를 나타냅니다.

            [CallerFilePath] string file = "", // 호출자 파일 경로를 나타내는 선택적 매개변수입니다.
                                               // CallerFilePath 애트리뷰트는
                                               // 컴파일러에게 호출자 파일 경로를 제공하도록 지시합니다.
            [CallerLineNumber] int line = 0, // 호출자 줄 번호를 나타내는 선택적 매개변수입니다.
                                             // CallerLineNumber 애트리뷰트는
                                             // 컴파일러에게 호출자 줄 번호를 제공하도록 지시합니다.
            [CallerMemberName] string member = "") // 호출자 멤버 이름을 나타내는 선택적 매개변수입니다.
                                                   // CallerMemberName 애트리뷰트는 
                                                   // 컴파일러에게 호출자 멤버 이름을 제공하도록 지시합니다.
        {
            Console.WriteLine(
                $"{file}(Line:{line}) {member}: {message}"); // 호출자 정보와 메시지를 결합하여 콘솔에 출력합니다.
        }
    }


    class MainApp
    {
        static void Main(string[] args) 
        {
            Trace.WriteLine("즐거운 프로그래밍!"); // Trace 클래스의 WriteLine 메서드를 호출합니다.
                                                   // Trace.WriteLine() 메서드의 선언부를 보면.
                                                   // [CallerFilePath], [CallerLineNumber], [CallerMemberName]이
                                                   // 선택적 인수로 사용되고 있는데, 이렇게 하면
                                                   // Trace.WriteLine() 메서드를 호출할 때,
                                                   // 호출자 정보 애트리뷰트로 수식한 매개변수는 프로그래머가 별도로
                                                   // 입력하지 않아도 됩니다.
        }
    }
}

코드 설명

이 C# 코드는 호출자 정보 애트리뷰트를 사용하여 메서드가 호출된 위치에 대한 정보를 출력하는 예제입니다. 호출자 정보 애트리뷰트는 C# 5.0에서 도입된 기능으로, 메서드의 호출자에 대한 정보를 가져올 수 있도록 합니다.

CallerInfo 네임스페이스 안에 Trace 클래스와 MainApp 클래스가 정의되어 있습니다.

Trace 클래스

  • public static class Trace: Trace라는 이름의 정적 클래스를 정의합니다.
  • public static void WriteLine(string message, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0, [CallerMemberName] string member = ""): WriteLine 메서드를 정의합니다.
    • string message: 출력할 메시지를 나타냅니다.
    • [CallerFilePath] string file = "": 호출자 파일 경로를 나타내는 선택적 매개변수입니다. CallerFilePath 애트리뷰트는 컴파일러에게 호출자 파일 경로를 제공하도록 지시합니다.
    • [CallerLineNumber] int line = 0: 호출자 줄 번호를 나타내는 선택적 매개변수입니다. CallerLineNumber 애트리뷰트는 컴파일러에게 호출자 줄 번호를 제공하도록 지시합니다.
    • [CallerMemberName] string member = "": 호출자 멤버 이름을 나타내는 선택적 매개변수입니다. CallerMemberName 애트리뷰트는 컴파일러에게 호출자 멤버 이름을 제공하도록 지시합니다.
    • Console.WriteLine(...): 호출자 정보와 메시지를 결합하여 콘솔에 출력합니다.

MainApp 클래스

  • static void Main(string[] args): 프로그램의 진입점인 Main 메서드를 정의합니다.
  • Trace.WriteLine("즐거운 프로그래밍!");: Trace 클래스의 WriteLine 메서드를 호출합니다.

호출자 정보 애트리뷰트

  • CallerFilePath: 호출자 파일 경로를 나타냅니다.
  • CallerLineNumber: 호출자 줄 번호를 나타냅니다.
  • CallerMemberName: 호출자 멤버 이름을 나타냅니다.

출력 결과

C:\...\CallerInfo\MainApp.cs(Line:18) Main: 즐거운 프로그래밍!

코드 해석

Main 메서드에서 Trace.WriteLine("즐거운 프로그래밍!");을 호출하면, WriteLine 메서드는 호출자 정보 애트리뷰트를 사용하여 호출자 파일 경로, 줄 번호, 멤버 이름을 가져옵니다. 그리고 이 정보와 함께 메시지를 콘솔에 출력합니다.

호출자 정보 애트리뷰트의 장점

  • 코드를 간결하게 만들 수 있습니다.
  • 디버깅 및 로깅에 유용합니다.
  • 코드의 재사용성을 높일 수 있습니다.

이 코드는 호출자 정보 애트리뷰트를 사용하여 메서드 호출 위치에 대한 정보를 출력하는 방법을 보여줍니다.

0개의 댓글