로그 기록 시 함수명 자동 기록
[CallerMemberName]
특성(attribute)은 C#에서 메서드나 속성의 호출자 정보를 자동으로 매개변수로 전달받을 수 있게 해주는 특성 중 하나입니다. 이 특성을 사용하면 호출된 메서드의 이름을 호출 시점에 자동으로 가져올 수 있어, 메서드 호출 시 명시적으로 메서드 이름을 전달할 필요가 없습니다. 주로 로그 작성, 디버깅 또는 알림 시스템에서 호출자의 메서드 이름을 자동으로 기록할 때 유용하게 사용됩니다.
Caller Information
특성들
C#에는 CallerMemberName
외에도 비슷한 방식으로 호출 정보를 자동으로 전달받을 수 있는 몇 가지 특성이 있습니다:
[CallerMemberName]
: 호출자의 메서드 이름을 전달받습니다.[CallerFilePath]
: 호출된 코드가 있는 소스 파일의 전체 경로를 전달받습니다.[CallerLineNumber]
: 호출된 코드가 있는 소스 파일의 줄 번호를 전달받습니다.
[CallerMemberName]
의 동작 방식
[CallerMemberName]
을 사용하는 메서드의 매개변수에 이 특성을 지정하면, C# 컴파일러는 호출한 메서드의 이름을 자동으로 해당 매개변수에 전달합니다. 이는 컴파일 타임에 결정되므로 성능에 미치는 영향이 거의 없습니다.
간단한 예시:
using System;
using System.Runtime.CompilerServices;
public class Logger
{
public void Log(string message, [CallerMemberName] string callerName = "")
{
Console.WriteLine($"Caller: {callerName}, Message: {message}");
}
}
public class Program
{
public static void Main()
{
var logger = new Logger();
logger.Log("This is a log message.");
}
}
실행 결과:
Caller: Main, Message: This is a log message.
위 코드에서 Log
메서드를 호출할 때 callerName
매개변수에 별도의 값을 전달하지 않았지만, Main
메서드가 callerName
에 자동으로 전달됩니다.
실제 응용 시나리오
- 로깅: 메서드가 호출될 때마다 호출자의 메서드 이름을 자동으로 기록할 수 있습니다. 디버깅 시 어떤 메서드가 로그를 남겼는지 추적할 수 있어 매우 유용합니다.
- 알림 및 이벤트 시스템: 호출한 메서드의 이름을 알림 메시지로 전달하거나 이벤트 처리 시 사용할 수 있습니다.
- 디버깅: 코드가 어느 위치에서 호출되었는지 추적할 때,
[CallerMemberName]
을 사용하면 소스 코드에 디버깅 정보를 남기지 않아도 됩니다.
주요 장점
- 명시적 코드 없이 호출자 정보 획득:
[CallerMemberName]
을 사용하면, 호출 메서드의 이름을 전달할 필요 없이 자동으로 받을 수 있어 코드가 더 간결해집니다. - 성능 오버헤드 최소화:
StackTrace
나Reflection
을 사용하는 방식과 달리, 컴파일 타임에 호출자 정보를 결정하므로 성능 부담이 거의 없습니다. - 유지보수성 향상: 메서드 이름이 바뀌더라도 호출 메서드가 자동으로 기록되기 때문에 수동으로 코드를 수정할 필요가 없습니다.
제약 사항
- 생성자, 소멸자, 속성 접근자 등에는 사용 불가: 생성자나 소멸자의 이름은 자동으로 얻어올 수 없습니다.
- 명시적 호출 불가: 매개변수로 호출자 정보를 명시적으로 전달하고 싶을 때는 해당 매개변수를 지정해야 합니다.
[CallerMemberName]
특성은 호출할 때 자동으로 사용되는 용도로만 활용됩니다.
매개변수 위치
[CallerMemberName]
특성은 해당 매개변수가 **선택적 매개변수(optional parameter)**로 선언된 경우에만 사용할 수 있습니다. 기본값을 지정해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다.
public void Log(string message, [CallerMemberName] string callerName = "")
{
// 호출자의 메서드 이름이 callerName에 자동으로 전달됩니다.
}
사용 사례 예시
로깅 시스템:
public class MyLogger
{
public void LogDebug(string message, [CallerMemberName] string caller = "")
{
Console.WriteLine($"DEBUG: {caller} - {message}");
}
}
public class ExampleClass
{
private MyLogger _logger = new MyLogger();
public void DoSomething()
{
_logger.LogDebug("Something happened!");
}
}
실행 결과:
DEBUG: DoSomething - Something happened!
DoSomething
메서드가 호출되었을 때 자동으로 메서드 이름을 로그에 남겨서 더 편리하게 추적할 수 있습니다.
결론
[CallerMemberName]
은 메서드 호출자 이름을 자동으로 가져오고 싶을 때 사용하기에 매우 편리한 특성입니다. 성능 오버헤드가 없고 코드 가독성을 향상시킬 수 있어 주로 로깅, 디버깅 및 이벤트 시스템에서 자주 사용됩니다.