변수 사용 영역

이지우·2022년 5월 11일
1

C언어

목록 보기
5/17

변수는 사용 범위와 메모리 존재 기간에 따라 종류가 다양하다.

  • 지역 변수
  • 전역 변수
  • 정적 지역 변수
  • 레지스터 변수

지역 변수

일반적으로 사용한 변수
범위가 함수 내, 즉 일정 지역에서만 사용하는 변수이다.

auto 예약어와 함께 함수 안에 선언한다. auto는 생략 가능하다.

auto 자료형 변수명;

지역 변수 특징

1. 지역 변수는 사용 범위가 블록 내부로 제한되므로 다른 함수에서는 사용할 수 없다.
다른 함수에는 같은 이름의 변수를 선언해도 이름이 서로 충돌하지 않는다.

▼ 두 함수에서 같은 이름의 지역 변수를 사용한 경우

#includ <stdio.h>

void assign();		// 함수 선언

int main()
{
	auto int a = 0;		// 지역 변수 선언과 초기화, auto 생략 가능
    printf("main 함수 a : %d\n", a);
}

void assign()
{

	int a;			// main문에 있는 변수와 같은 이름의 지역 변수
    
    a = 10;			// assign 함수 안에 선언된 a에 대입
    printf("assign 함수 a : %d\n", a);	// assign 함수에 선언된 a 값 출력
}

변수 a는 같은 이름으로 두 번 선언 되었지만 다른 함수에서 선언되었기 때문에 문제가 되지 않는다.

2. 지역 변수는 이름이 같아도 선언된 함수가 다르면 각각 독립된 저장 공간을 갖는다.
두 함수에 선언된 변수 a는 이름만 같을 뿐 메모리에는 별도의 저장 공간을 갖는다.
assign 함수가 호출되어도 main문의 a의 값은 바뀌지 않는다.

지역 변수 장점

1. 메모리를 효율적으로 사용한다.
지역 변수는 함수 안에서만 사용하므로 함수가 반환되면 운영체제는 할당된 저장 공간을 자동으로 회수하여 재활용한다.

2. 디버깅에 유리하다.
지역 변수는 값에 문제가 있을 때 수정하기 쉽다.
출력한 변수의 값이 예상한 값이 아닌 경우 그 변수가 선언된 함수에서만 그 원인을 찾으면 된다.

지역 변수 단점

1. 자동으로 초기화되지 않는다.
지역 변수는 자동으로 초기화되지 않기 때문에 초기화되기 전에는 쓰레기 값이 저장되어 있다.

2. 여러 함수에서 데이터를 공유하기 힘들다.
사용 범위가 하나의 함수로 제한되므로 여러 함수에서 데이터를 공유하여 사용하기 힘들다.


블록 안에서 사용하는 지역 변수

지역 변수는 보통 함수 안에서 선언한 후 함수 끝까지 사용하지만 선언 위치에 따라 사용 범위가 달라진다.

특정 블록 안에 변수를 선언하면 사용 범위가 블로 내부로 제한된다.
메모리에 할당된 저장공간도 블록이 끝남녀 자동으로 회수된다.

▼ 블록 안에 지역 변수를 사용하여 두 변수를 교환하는 프로그램

#include <stdio.h>

int main(){
	int a = 10, b = 20;
    
    printf("교환 전 a와 b의 값 : %d, %d\n", a, b);
    {					// 블록 시작
    	int temp;		// temp 변수 선언
        
        temp = a;
        a = b;			// a, b는 블록 밖에 선언된 변수
        b = temp;
    }					// 블록 끝
    printf("교환 후 a와 b의 값 : %d, %d\n", a, b);
}

실행결과

교환 전 a와 b의 값 : 10, 20
교환 후 a와 b의 값 : 20, 10

사용 가능한 변수가 둘 이상이면 가장 가까운 블록에 선언된 변수를 사용한다.

#include <stdio.h<

int main(){
	int a = 10, b = 20;

    printf("교환 전 a와 b의 값 : %d, %d\n", a, b);
    
    {					// 블록 시작
    	int a, b, temp;	// a, b, temp 선언
        
        temp = a;
        a = b;			// a, b는 블록 안에 선언된 변수
        b = temp;
    }					// 블록 끝
    printf("교환 후 a와 b의 값 : %d, %d\n", a, b);	// 블록 밖에 선언된 a, b
}

실행 결과

교환 전 a와 b의 값 : 10, 20
교환 후 a와 b의 값 : 10, 20

전역 변수

함수 밖에 변수를 선언하면 전역 변수가 된다.
전역 변수는 프로그램 어디에서나 사용할 수 있다.

▼ 전역 변수의 사용

#include <stdio.h>

void assign10();
void assign20();

int a;			// 전역 변수 선언

int main()
{
	printf("함수 호출 전 a 값 : %d\n", a);	// 전역 변수 a 출력
    
    assign10();
   	assign20();
    
    printf("함수 호출 후 a 값 : %d\n", a);	// 전역 변수 a 출력
}

void assign10()
{
	a = 10;		// 전역 변수 a에 10 대입
}

void assign20()
{
	int a;		// 전역 변수와 같은 이름의 지역 변수 선언
    a = 20;		// 지역 변수 a에 20 대입
}

실행 결과

함수 호출 전 a 값 : 0
함수 호출 후 a 값 : 10

전역변 수는 특정 함수 안에 있는 것이 아니기 때문에 저장 공간이 메모리에 존재하는 기간이 지역 변수보다 훨씬 길다.
프로그램이 실행될 때 메모리에 할당되고 프로그램이 끝날 때까지 존재한다.

지역 변수는 자동 초기화되지 않지만 전역 변수는 0으로 자동 초기화된다.

전역 변수의 문제점

  1. 전역 변수의 이름을 바꾸면 그 변수를 사용하는 모든 함수를 찾아 수정해야 한다.
  2. 전역 변수의 값이 잘못된 경우 접근 가능한 모든 함수를 의심해야 한다.
  3. 코드 블록 내에 같은 이름의 지역 변수를 선언하면 그 영역에서는 전역 변수를 사용할 수 없다.

정적 지역 변수

지역 변수를 선언할 때 static 예약어를 사용하면 정적 지역 변수가 된다.
정적 지역 변수는 코드 블록 안에 선언하므로 일반 지역 변수와 같이 사용 범위가 블록 내부로 제한된다.
하지만 저장 공간이 메모리에 존재하는 기간이 다르다.

정적 지역 변수의 저장 공간은 프로그램이 실행되는 동안 계속 유지된다.
하나의 함수가 여러 번 호출되는 경우 같은 변수를 공유할 수 있다.

▼ 지역 변수와 static 지역 변수 비교

#include <stdio.h>
void auto_func();
void static_func();

int main()
{
    int i;

    printf("일반 지역 변수(auto)를 사용한 함수...\n");
    for (i = 0; i < 3; i++)
    {
        auto_func();
    }

    printf("정적 지역 변수(static)를 사용한 함수...\n");
    for (i = 0; i < 3; i++)
    {
        static_func();
    }
}

void auto_func()
{
    auto int a = 0;	// 지역 변수 선언과 초기화

    a++;
    printf("%d\n", a);
}

void static_func()
{
    static int a;		// 정적 지역 변수 선언

    a++;				// a 값 1 증가
    printf("%d\n", a);	// a 출력
}

실행결과

일반 지역 변수(auto)를 사용한 함수...
1
1
1
정적 지역 변수(static)를 사용한 함수...
1
2
3

auto_fuc 함수는 지역 변수 a를 선언하고 0으로 초기화한다. 지역 변수는 함수가 호출될 때마다 메모리에 새롭게 할당되고 반환될 때 메모리에서 제거되므로 0으로 초기화되고 1 증가시키고 출력되어 항상 1이 출력된다.

static을 사용하면 저장 공간이 할당되어 프로그램이 끝날 때 까지 존재한다. 자동으로 0으로 초기화되기 때문에 초기화하지 않아도 된다.

static_func 함수에서 선언된 정적 지역 변수는 함수 안아 선언되었지만 저장 공간의 할당이나 초기화 방법, 메모리 존재 기간이 전역 변수와 같다. 함수가 반환되더라도 저장 공간이 계속 유지되어 함수에 필요한 값을 보간하여 호출할 때마다 계속 사용할 수 있다.


테이블로 정리

종류지역변수전역 변수
예약어auto / static없음 / static
선언 위치코드 블록 내부함수 외부
사용 범위선언 ~ 선언한 블록 끝프로그램 전체 / 하나의 파일 내부
메모리 존재 기간선언 ~ 선언한 블록 끝 / 프로그램 시작 ~ 종료프로그램 시작 ~ 종료
자동 초기화없음 / 0으로 자동 초기화0으로 자동 초기화
메모리 위치스택 영역 / 데이터 영역데이터 영역
profile
노력형 인간

0개의 댓글