C# 조건부 특성(Conditional Attribute)이란?
특성(Attribute)은 컴파일러 지시문, 주석, 설명, 메서드나 클래스에 대한 정보 등 다양한 메타데이터를 프로그램에 추가하기 위해 사용됩니다.
그중에서 Conditional 특성은 사전 정의된 특성으로, 지정된 전처리기 식별자(전처리기 기호)에 따라 실행 여부가 결정되는 조건부 메서드를 표시하는 데 사용됩니다.
이 특성을 적용하면 DEBUG나 TRACE처럼 지정된 기호 값에 따라 해당 메서드의 호출 부분이 조건부로 컴파일됩니다. 예를 들어 코드를 디버깅하는 동안에만 변수 값을 화면에 출력하도록 만들 수 있습니다.
구문
[Conditional( conditionalSymbol )]
conditionalSymbol 자리에는 DEBUG, TRACE 등 #define으로 정의된 전처리기 기호를 문자열로 지정합니다. 해당 기호가 정의되어 있으면 메서드 호출 코드가 컴파일되고, 정의되어 있지 않으면 호출부가 아예 제거됩니다.
예제
#define DEBUG
using System;
using System.Diagnostics;
public class Myclass {
[Conditional("DEBUG")]
public static void Message(string msg) {
Console.WriteLine(msg);
}
}
class Test {
static void function1() {
Myclass.Message("In Function 1");
function2();
}
static void function2() {
Myclass.Message("In Function 2");
}
public static void Main() {
Myclass.Message("In Main function");
function1();
Console.ReadKey();
}
}실행 결과
In Main function In Function 1 In Function 2
동작 방식 살펴보기
위 예제에서는 #define DEBUG로 DEBUG 기호를 정의했기 때문에, [Conditional("DEBUG")]가 적용된 Message 메서드의 모든 호출이 정상적으로 컴파일되어 실행됩니다. 그 결과 세 개의 메시지가 순서대로 출력됩니다.
반대로 #define DEBUG 줄을 삭제하고 컴파일하면 어떻게 될까요? Message 메서드 자체는 여전히 존재하지만, 그 호출부가 모두 제거되므로 아무런 출력도 나타나지 않습니다.
이처럼 Conditional 특성을 활용하면 릴리스(Release) 빌드에서 디버깅용 코드나 로깅 코드를 별도로 삭제하지 않고도 손쉽게 제외할 수 있습니다.
사용 시 참고 사항
- Conditional 특성이 적용된 메서드는 반드시 반환 형식이
void여야 합니다. - 해당 특성은
System.Diagnostics네임스페이스에 정의되어 있으므로using System.Diagnostics;선언이 필요합니다. - 조건 기호가 정의되지 않으면 메서드 호출뿐 아니라 호출 인수로 사용된 코드(예: 메서드 호출 내부의 연산식)도 함께 제거될 수 있다는 점에 유의해야 합니다.