반응형

@ 살펴볼 변수들

#include <stdio.h>

#define MAC 111

double glo=10.01;

main()

{

    int loc=500;

    printf("loc = %d\n", loc);

    printf("glo = %f\n", glo);

    printf("MAC = %d\n", MAC);

@ #define MAC 111

이렇게 선언 된 변수를 매크로 변수라고 합니다. 쓰임새는 뒤에서...

@ double glo=10.01;

이 변수의 위치를 잘 살펴보세요. 지금까지는 main() 함수의 { } 안에다 변수를 선언해왔었지만, 이 변수는 main() 함수의 바깥쪽에 위치하고 있으며, 어떤 함수의 내부에 있는 것도 아닙니다. 이런 변수를 전역변수라고 합니다.

@ int loc=500;

지금까지 일반적으로 사용해오던 변수 입니다. 이런 놈들을 지역변수 또는 로컬변수라 합니다.

변수가 선언된 함수 내부에서만 사용되고 마는 변수입니다.

 

@ 지역 변수

#include <stdio.h>

void pri()

{

    int k=5;

}

main()

{

    pri();

    printf("%d",k);

}

pri() 함수에 k라는 변수를 인트형으로 선언하였습니다.

이 변수 k를 메인함수에서 printf() 함수로 출력하라는 소스인데요..

이렇게 하면 정상적으로 동작할까요?

정답은 아니다. 입니다 왜냐하면 k 변수는 pri() 함수에서만 사용되는 지역변수 이기 때문입니다.

@ 전역 변수

k 라는 변수를 메인 함수가 아닌 다른 곳에서 선언 및 정의 해놓고 메인함수에서 출력하려면?

위 소스를 조금만 수정해서 k 값을 메인함수에서 출력해 보아요..

#include <stdio.h>

int k;

void pri()

{

    k=5;

}

main()

{

    pri();

    printf("%d",k);

}

이번에는 정상적으로 5라는 값이 출력됩니다.

k라는 변수가 전역변수로 선언되어있기 때문인데요 2번째 줄에

int k;를 보시면 pri() 함수나 main()함수 어느 곳에도 속해 있지 않지만 값을 대입하고 출력하고,

이렇듯 전역변수는 어떤 함수에서든 접근할 수 있습니다.

#include <stdio.h>

int k=3;

void k5()

{

    int k=5;

}

void k7()

{

    int k=7;

}

main()

{

    k5();

    printf("%d",k);

    k7();

    printf("%d",k);

    k5();

    printf("%d",k);

}

k 변수를 3번 출력하게 될텐데요.. 어떤 값들이 출력될까요?

한번 맞춰보세요..

맞추셨나요?

2번째 줄에 int k=3; 이라는 전역변수, 이 변수만 메인함수에서 접근이 가능합니다.

비록 k5()함수를 호출해 int k=5; 라는 변수를 만들었지만 k5() 함수 내부에서만 사용되고 사라져 버린거지요..전역변수의 값이 변하지는 않습니다.

전역 변수의 값을 변화 시키려면 k5() 함수 내부의 int k=5; 에서 앞에 int를 떼버리면 됩니다.

k=5; 와같이 하면 전역변수 k의 값이 변경되지요..

그런데 이때는 333이 아니라 555가 출력되게 됩니다.

처음 k5() 함수가 호출 되었을 때 전역변수 k의 값이 5로 바뀌기 때문이죠.

k5() 함수는 위 소스 그대로 두고

k7() 함수만 int 를 떼버리면?

377이 출력될 것입니다.

왜 그렇게 되는지 감이 오시나요?

k5() 함수에선 int k=5; 이기 때문에 지역변수로서 k5함수 내부에서 사용되고 소멸.

printf()함수에서는 현재 전역변수의 값 3을 출력

k7()함수에서 k=7로 값을 변경

printf()함수에서는 현재 전역변수의 값 7을 출력

k5()함수에선 역시 int k=5; 이기 때문에 지역변수로서 k5함수 내부에서 사용되고 소멸.

printf()함수에서는 현재 전역변수의 값 7을 출력

이렇게 해서 377이지요...

 

전역 변수...잘쓰면 편하고 좋겠지만, 조금만 방심해도 엉뚱한 값이 출력되는 프로그램이 되어버립니다.

프로그램은 오류 없이 정상적으로 돌아 가지만 엉뚱한 값이 나오게 되어 오류 찾기도 어려워지고요...

위 소스 같이 짧다면 문제 없지만 길어 질수록...버럭!!

꼭 신경써서 사용하세요;ㅎㅎ

 

 

@ 매크로 변수

#include <stdio.h>

#define STUDENT 5

main()

{

    int i;

    for(i=0; i<5; i++)

        printf("i<5 \n");

    for(i=0; i<STUDENT; i++)

        printf("매크로 변수 이용 \n");

#define STUDENT 5

라고 된것이 매크로 변수 입니다.

반드시 대문자로 사용해야 되는건 아니지만 대문자로 많이 사용들 하십니다.

소스를 보시면 반복 문이 두개 있는데 i<5, i<STUDENT 부분을 봐주세요.

 

매크로변수.

이걸 어디에다 써? 라고 생각하실 수도 있을텐데요.

만약에 학생수만큼 무엇인가를 하는 작업이 여러개라고 생각해보세요

학생수가 30명이라서 반복문에서 조건을 i<30이라고 적어놓았고

이런 반복문이 여러개일때 학생수가 50명으로 늘어나 버리면, 반복문마다 찾아 다니면서30을 50으로 수정해주어야 겠지요?

하지만 매크로 변수를 하용하면 한곳만 수정 하면됩니다.

#include <stdio.h>

#define STUDENT 5

main()

{

    int i;

    for(i=0; i<3; i++)

        printf("1번 \n");

    for(i=0; i<3; i++)

        printf("2번 \n");

    for(i=0; i<3; i++)

        printf("3번 \n");

    for(i=0; i<3; i++)

        printf("4번 \n");

각각의 반복문마다 3번씩 돌게 됩니다.

이것을 5번씩 반복하게 하려면

i<3이라 적힌 부분을 i<5로 4곳을 수정해야 하겠지요?

 

위 소스를 매크로 변수를 사용한 소스로 변경하면?

#include <stdio.h>

#define STUDENT 3

main()

{

    int i;

    for(i=0; i<STUDENT; i++)

        printf("1번 \n");

    for(i=0; i<STUDENT; i++)

        printf("2번 \n");

    for(i=0; i<STUDENT; i++)

        printf("3번 \n");

    for(i=0; i<STUDENT; i++)

        printf("4번 \n");

i<3일떄와 결과가 같습니다.

5번씩 반복 되도록 수정 하려면?

두 번쨰 줄의

#define STUDENT 3을

#define STUDENT 5 로만 바꾸어 주시면됩니다.

#include <stdio.h>

#define STUDENT 5

main()

{

    int i;

    for(i=0; i<STUDENT; i++)

        printf("1번 \n");

    for(i=0; i<STUDENT; i++)

        printf("2번 \n");

    for(i=0; i<STUDENT; i++)

        printf("3번 \n");

    for(i=0; i<STUDENT; i++)

        printf("4번 \n");

5번씩 출력되고 있네요.

지금은 반복문이 4개 밖에 없지만

좀더 복잡한 프로그램이라면 매크로변수..유용하게 쓰이겠죠?

반응형

+ Recent posts