본문 바로가기
c언어

c언어 지역 변수 알아보기

by 개발자 L 2022. 12. 6.
반응형

c언어 지역 변수 알아보기

네 안녕하세요, 이번 포스팅에서는 c언어에서 사용하는 변수 중 하나인 지역 변수에 대하여 알아보겠습니다.

c언어에서 사용하는 변수는 크게 두 가지로 나뉩니다.

바로 지역 변수와 전역 변수입니다.

이들은 어디에서 영향을 주느냐에 따라 갈리게 됩니다.

그래서 이번 시간에는 그러한 변수들 중 하나인 지역 변수가 어떤 것이며, 어떻게 사용을 하는지 알아보도록 하겠습니다.

그럼 지금부터 시작을 해보도록 하겠습니다.

 

1. 지역 변수란?

지역 변수는 쉽게 말하면 블록 안에서 실행되는, 다시 말해서 함수의 몸(body) 안에서 선언이 되는 변수입니다.

그래서 지역 변수는 변수가 선언이 된 블록, 즉, 중괄호 내에서만 접근 및 사용이 가능합니다.

 

1 - 1. 지역 변수의 선언 위치

지역 변수는 원칙적으로 블록의 가장 윗부분에서 선언이 되어야 합니다.

우리는 이 변수를 하나의 매개체로 이용을 하여 여러 가지 문법을 쓰기 때문입니다.

하지만 요즘 c언어에서는 블록의 어느 부분에서든 변수를 선언을 할 수 있도록 업데이트가 되었으니,

혹시나 누락이 된 것이 있다면 중간에 선언을 해도 됩니다.

다만, 그 위치가 너무 멀다던지, 스택이 쌓이는 순서가 너무 어긋나 있다던지 한다면,

컴파일 언어인 c언어의 특성상 오류가 날 수 있으니,

주의를 하셔야 합니다.

 

1 - 2. 이름이 같은 지역 변수

지역 변수는 특정한 블록 내에서만 유효하다는 특징을 지니기 때문에 서로 다른 블록 내에만 존재를 한다면 같은 이름을 쓰더라도 코드가 실행이 되는 데에는 아무런 지장을 주지 않습니다.

다만, 코드를 짤 때 조금 헷갈릴 수는 있기 때문에 main() 함수 내에서 n이라는 변수를 선언했다면,

main() 함수에 넣을 사용자 지정 함수에 쓰일 n의 경우는 n1 등으로 넘버링을 해서 선언을 해주는 것이 좀 더 가독성 측면에서 용이합니다.

반응형

 

1 - 3. 지역 변수의 생존 시간

지역 변수는 함수 내에 있는 변수가 선언이 될 때 스태킹이 되면서 호출이 되고,

해당 함수의 호출이 끝이 나며 리턴 값을 돌려받았으며 함수가 종료가 될 때 메모리 공간이 반환이 되므로,

함수 종료 시에 같이 종료가 됩니다.

제가 한 가지 예시를 한 번 보여드리도록 하겠습니다.

#include <stdio.h>

int main()
{
    for(int i = 0; i < 5; i++)
    {
        int tmp = 1;
        printf("tmp = 1\n", tmp);
        tmp++;
    }

    return 0;
}

그냥 간단히 작성을 해봤습니다.

그럼 결과를 한 번 보도록 하겠습니다.

tmp = 1
tmp = 1
tmp = 1
tmp = 1
tmp = 1

이렇게 나옵니다.

그래서 이 함수의 실행이 끝나는 시점인 tmp = 1이라는 문구가 5번째 찍히는 시점이 되면 같이 종료가 됩니다.

 

1 - 4. 지역 변수의 초기값

지역 변수의 초기값은 정해도 되고 정하지 않아도 되지만,

결과라던지, 합이나 곱 등은 되도록이면 초기값을 정해주고 가시는 것이 좋습니다.

그렇지 않는다면 선언된 변수 안에는 아무런 의미가 없는 값인 쓰레기 값이 저장이 되어있기 때문입니다.

그래서 사용자가 직접 입력을 해서 주소 값을 받아오는 것이 아니라면,

무조건 초기값은 선언을 해야 오류가 나지 않습니다.

 

1 - 5. 함수의 매개 변수

함수의 헤더 부분에 있는 매개 변수 역시 지역 변수에 포함이 됩니다.

하지만 일반적인 지역 변수와 다른 점이 있다면, 함수를 호출할 때 인수값으로 초기화가 된다는 것입니다.

제가 간단한 예제를 통하여 예를 들어보도록 하겠습니다.

#include <stdio.h>

void inc(int cntr);

int main()
{
    int n = 10;

    printf("함수 호출 전 - n = %d\n", n);
    inc(n);
    printf("함수 호출 후 - n = %d\n", n);

    return 0;
}

void inc(int cntr)
{
    cntr++;
}

이렇게 한 번 작성을 해봤습니다.

여기에서 보시면 매개 변수를 누적시켜 증가를 시켰는데,

값에 아무런 영향을 주지 않습니다.

그 이유는 변수 n을 함수 inc()로 전달을 하지만,

복사본을 전달을 하는 것이기 때문에 아무런 영향을 주지 않으며,

그 밑에 있는 inc() 함수에 있는 cntr은 main() 함수에 있는 변수 n과는 별개이기 때문에 그 어떠한 영향도 주지 않습니다.

그럼 결과를 보도록 하겠습니다.

함수 호출 전 - n = 10
함수 호출 후 - n = 10

이렇게 아무런 영향을 받지 않은 모습을 볼 수가 있습니다.

 

여기까지 지역 변수에 대하여 알아보았는데요,

다음 포스팅에서는 전역 변수에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~

반응형

댓글