본문 바로가기
프로그래밍/C언어.

define란? define 사용법. [스샷설명. 2011/09/09일 수정]

by K_Coder 2011. 5. 11.
반응형
define란? #define 사용법. 간단 예제.

매크로와 전처리기 지시자.

#define에서  #의미, # 사용법. 




#define PI 3.14 라고 가정하면

#define를 전처리기 지시자 라고 하며, PI를 매크로 상수 라고 한다.

위와 같이 선언을 해 두었다면 아래 코드 부분에서는
3.14 대신 PI 라고 하면 된다.



이를 PI라는 변수를 만들어서 3.14를 넣은것과 같다고 착각하면 안된다.
결과는 비슷해 보일 수 있으나, 엄밀히 말하면 다른 것이다.

define은 단순한 치환으로써. 내가 아끼는 연필에 "몽당이"라는 이름을 지어주고
그 연필을 "몽당이" 라고 부르는 것과 같은 것이다.

때문에 PI의 값은 변경이 불가능 하며, printf 로 찍어도 주소값이 나온다. 여전히 상수이다.
이렇게 상수에 이름을 붙여주는 것을 "매크로 상수" 라고 한다.

또한, 이런 상수 뿐 아니라 함수로도 사용이 가능하다.

아래는 실용성은 전혀 없지만 예를 위해 간단하게 표현하였다.

 



실제로 동작하는 과장을 설명하자면
SWAP(a,b) 자리에 아래처럼 코드가 들어가는 것이다.


당연히 동일한 결과가 나온다.
다만 SWAP(a,b) 라고 했기 때문에 x,y 자리가 a,b로 변해서 들어간다.

이런식으로 간단한 함수 등으 정의하여 매크로 처럼 편히 사용할 수 있다.



여기서 보자면 tot = SQUARE(x); 가
tot = x * x ; 로 바뀌게 되는 것이다.

단순히 치환이기 때문에 자료형에는 구애 받지 않는다.
문자 자체가 바뀌는 것이랑 float인지 int 인지 전혀 상관이 없다.

만약 제곱을 구하는 것을 함수로 구현한다면
 정수인 경우와 실수인 경우의 함수를
따로 만들어야 한다.




이제 주의 점을 알아보자.
어떤 결과가 나올지 미리 손으로 계산해 보라.



정답은
.

.

.

.

.

.



계산한 값과 동일하게 나왔는가?
일반적으로 틀리게 나왔을 것이다. 이유가 뭘까?

위에서 계속 강조했듯 문자의 단순 치환이라 생기는 문제이다.

SQUARE(x+2) 는 4+2가 되고 6이 넘어갈 것 같지만
계산하지 않는다. 단순한 문자의 치환이기 때문에 문자 그대로 넘어간다.

따라서, 6 * 6 이 아닌, x+2 * x+2 가 된다.
게다가.. 연산에 우선순위에 의해서 *가 먼저 되어 버린다 - -;

x  + [2 * x]  + 2 = 4 + [ 4*2] + 2 = 14 가 되는 것이다.

그렇기 때문에 이렇게 사용하고 싶다면
 반드시. 괄호도 같이 해줘야 한다.

SQUARE((x+2)) - > (x+2) * (x+2) 가 된다.

이정도 보면 이제 문자에 의한 단순 치환이란 의미가 이해가 될 것이다.
그래서 연산이 있는 경우 최대한 괄호를 정확하게, 많이 해줘야 한다.

되도록이면 당연한 계산이라도 괄호를 해주는 것이 안전하다.



마지막. 아래 코드의 결과를 예상해 보자. (오타 아님.)


defind에서의 #을 설명하는 예제 입니다.

일단 결과를 미리 보도록 합니다.

 

눈치가 빠른 분들이라면 알 수도 있지만..
여기서 a + b 가 x로 치환 되겠죠?

printf( #x " = %d\n", a+b);
보다싶이 그냥 x가 a+b로 변경되는 것이죠.

만약, printf(" x  = %d\n", a+b); 이렇게 했다면?
우리는 변수를. 치환하기 때문에 " " 안에 있는 문자열은 해당사항이 아닙니다.

그리고 SQUARE(x) 가 tot = x * x 로 변하는 것을 봤습니다.
말 그대로 그냥 글자가 바뀐 것입니다.

헌데 #을 붙인 경우 x 가 아닌 문자열로 대체가 되는 것 입니다.
"x" 이렇게 되는 것이죠. 즉,  tot = "x" * "x"

당연히 계산도 안되겠죠. 하지만 printf문에서는 다릅니다.

#x 위치에 "a+b"가 들어갑니다.
printf( "a+b" " = %d\n", a+b);

문자열과 문자열. 즉, " " 과  " " 이 바로 붙는 경우
 하나의 문자열로 인식합니다.

결론적으로 "a+b = %d\n" 가 되는 것이죠.



#define은 사용하기에 따라 굉장히 유용하기도 하다.
아래에 링크에서 rand() 사용시 범위를 지정해 줄 때 사용한 예를 한번 봐두자.

[C언어] 랜덤함수 사용법. rand(), srand() 간단예제.
가장 하단 부분에 나올 것이다.


유용한 정보가 되셨다면 아래 손가락 버튼 한번 눌러주세요 ^-^ 
반응형