Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 조건부 특성(Conditional Attribute)이란? 개념부터 예제까지

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; 선언이 필요합니다.
  • 조건 기호가 정의되지 않으면 메서드 호출뿐 아니라 호출 인수로 사용된 코드(예: 메서드 호출 내부의 연산식)도 함께 제거될 수 있다는 점에 유의해야 합니다.