12.8 전처리 지시어
전처리 지시어를 C나 C++에서 사용해 보신 분도 있을 것입니다. C#의 전처리 지시문을 사용하면 소스 코드의 특정 부분을 조건적으로 건너 뛸 수 있도록 만들어 오류나 경고, 조건 등을 보고하고 소스 코드의 특정 부분을 나타내도록 만들 수 있습니다. 전처리 지시문이란 용어는 C 및 C++ 프로그래밍 언어와의 일관성을 위해서만 사용합니다. C#에서는 별도의 전처리 단계가 없습니다. 전처리 지시문은 어휘분석 단계의 일환으로 처리됩니다.
먼저, 전처리 지시어의 종류를 알아보고 이 전처리 지시어를 어디에 사용하는지 알아보도록 하겠습니다.
전처리 지시어의 종류 |
ㅁ #define, #undef: 조건부 컴파일 기호를 정의하거나 정의를 해제할 때 사용합니다. ㅁ #if, #elif, #else, #endif: 소스 코드의 특정 부분을 조건적으로 건너 뛸 때 사용합니다. ㅁ #line: 오류나 경고에 대해 생성되는 줄 번호를 제어할 때 사용합니다. ㅁ #error, #warning: 오류나 경고를 발생시킬 때 사용합니다. ㅁ #region, #endregion: 소스 코드의 특정 부분을 명시적으로 표시할 때 사용합니다. |
표 12-6 전처리 지시어의 종류
전처리 지시어의 종류는 위의 표에 있는 것들이 전부입니다. 모두 #으로 시작합니다. 여기에서 몇 가지만 알아보고 넘어가겠습니다. 더 많은 관심이 있으신 분들은 NET Framework SDK 설명서를 참고하시기 바랍니다.
#define, #if, #endif
#define은 심볼(Symbol)을 정의하는데 사용됩니다. 다음과 같이 했을 때, 해당 심볼이 존재한다는 의미를 담고 있습니다.
#define DEFINETEST
▣ #define의 특징 |
ㅁ 세미콜론(;)을 사용하지 않음 ㅁ 단독으로 사용되지 않고 항상 다른 전처리 지시어와 같이 사용 ㅁ 심볼(symbol)에는 값을 할당할 수 없음 |
혼자서 특별한 뜻을 나타내지는 않습니다. DEFINETEST라는 심볼이 있고 없고의 문제이지 #define으로 어떠한 작업을 나타내는 것은 아닙니다. 보통의 경우 #define을 사용했으면 다른 전처리 지시어와 함께 사용됩니다. 다음과 같이 DEFINETEST 문자가 존재하는지 하지않는지에 대한 처리를 또 다른 전처리 지시어인 #if와 #endif를 사용하여 처리할 수 있습니다.
#if DEFINETEST
Console.WriteLine("Test OK.!!");
#endif
만약, DEFINETEST가 #define 되어 있다면 #if와 #endif 사이의 구문을 실행하라는 의미입니다. #define, #if, #endif의 전처리기를 사용하는 예는 다음과 같습니다.
& |
DefineTest.cs |
Ü #define을 테스트하는 예제 |
#define DEFINETEST | ||
C:\C#Example\12>csc DefineTest.cs C:\C#Example\12>DefineTest Test OK.!! Test 예제.!! |
#if는 DEFINETEST가 #define으로 정의되어 있으면 true가 되어 다음에 나오는 문장을 실행하고, 만약 그렇지 않으면 실행하지 않습니다. #endif는 #if 뒤에 항상 따라 다니게 되어 있습니다.
1 #if, #endif
ㅁ #if symbol
ㅁ 내용
ㅁ #endif
ㅁ 심볼(symbol)이 #define되어 있으면 참
#if 전처리 지시어는 if문의 사용과 비슷하기 때문에 else 전처리 지시어도 존재합니다. #else가 그것이며 else if에 해당하는 것은 #elif입니다.
#undef
#undef 지시어는 #define한 심볼을 해제하는 기능을 하고 있습니다. 만약, DEFINETEST라는 것을 define했다면 이것을 해제(undefine)하기 위해서 사용하는 지시어입니다. 앞의 예제를 수정하여 #undef를 추가한 예는 다음과 같습니다.
& |
UndefineTest.cs |
Ü #undef를 테스트하는 예제 |
#define DEFINETEST | ||
C:\C#Example\12>csc UndefineTest.cs C:\C#Example\12>UndefineTest Test 예제.!! |
앞의 예제에서 #undef 지시어를 사용한 구문을 집어 넣었을 뿐입니다.
#undef DEFINETEST
#undef 지시어는 #define 되어 있는 심볼(Symbol)을 해제하는 지시어입니다.
1 #undef
ㅁ #undef symbol
ㅁ #define 되어 있는 심볼(Symbol)을 해제
위의 #define, #undef, #if, #endif를 이용하여 만든 다음 두 개의 클래스는 어휘적으로는 상당히 다르지만 구문적으로는 같습니다
구문적으로 같은 클래스 | |
#define TOM |
class Hello{ |
표 12-7 전처리 지시문을 이용한 구문
#error, #warning
#error, #warning과 같은 전처리 지시어를 만나면 에러를 발생시킨다든지 경고를 발생시키는 전처리 지시어도 있습니다. 코드 내에 원하시는 부분에 다음과 같이 입력하면 해당 부분에 에러나 경고를 발생시키는 전처리 지시어입니다.
ㅁ #error “이것은 문법적인 오류입니다”
ㅁ #warning “경고! 이 코드는 불안전한 코드입니다.”
위의 전처리 지시어를 만나면 컴파일한 후 결과 창에서 해당 메시지를 출력할 것입니다.
#region #endregion
상식적으로 알아두어야 하는 지시어가 있습니다. #region과 #endregion은 .NET Visual Studio 편집기에서 사용하는 지시어로 특정 부분을 줄여서 보여주거나 펴서 보여주는 기능을 가지고 있습니다. Visual Tool에 익숙한 분들은 쉽게 이해하실 것입니다.
그림 15-4 VS.NET 코드 편집기에서의 #region, #endregion 사용
[출처] [펌] 전처리 지시어|작성자 눈꽃천사