지역변수, 전역변수,정적 변수

이푸름·2021년 6월 17일
2
post-custom-banner

지역변수(Local variable)

지역변수는 중괄호 내부에서 선언되어 함수 내부에서만 접근이 가능하며, 함수를 벗어나면 변수의 메모리 공간이 소멸된다. 지역변수는 초기화하지 않으면 컴파일 에러, 혹은 쓰레기 값이 저장된다.

예시)

#include <stdio.h>

void set_zero(){
	int num = 0; //변수 선언 및 초기화
    printf("%d\n", num);
}

int	main(){
	int num = 5;
    printf("%d\n", num);
	set_zero();
    return (0);
}

//결과 : 5
		0

main함수와 set_zero함수에서 똑같이 num이라는 이름의 변수를 선언하지만 지역적으로 전혀 다른 변수이므로 각자 자신의 지역에서 가진 값대로 출력된다.

전역변수(Global Variable)

지역변수와 달리 중괄호 외부에서 선언되는 변수로, 어디서든지 참조하여 사용할 수 있다.
초깃값을 지정하지 않으면 0으로 자동 초기화된다.
전역 변수는 모든 곳에서 접근이 가능하고, 프로그램 종료 전까지 메모리가 소멸되지 않는다는 장점이 있지만, 잘못 사용할 시 유지 보수와 재사용이 어려워진다.

예시)

#include <stdio.h>

int global;

int	main(){
    printf("%d\n", global);
    return (0);
}

//결과 : 0

예시2)

#include <stdio.h>

int global;

void set_num(){
	global += 99;
    printf("%d\n", global);
}

int	main(){
    printf("%d\n", global);
	global = 1;
    printf("%d\n", global);
	set_zero();
    return (0);
}

//결과 : 0
		1
        100

정적변수(Static variable)

정적변수는 프로그램이 종료되기 전까지 메모리가 소멸되지 않는 변수로 함수를 벗어나도 변수가 사라지지 않고 유지된다. 초깃값을 지정하지 않으면 0으로 자동 초기화된다.
여기까지는 전역변수와 비슷해보이지만, 차이점은 초기화가 딱 한번만 진행된다는 것이다.
정적 변수는 프로그램이 시작될 때 생성 및 초기화가 되고 프로그램이 끝날때 사라지며, 함수의 매개변수로 사용할 수 없다는 특징이 있다. 하지만 초기화 되지 않은 정적 변수가 본문에서 사용되지 않으면 아예 메모리 상에 올라오지 않는다.

정적변수는 사용 범위에 따라 정적 지역변수(static local variable)와 정적 전역변수(static global variable)로 나뉜다.
정적 지역변수는 중괄호 내부에서만 사용할 수 있고, 한번 초기화된 이후 함수 호출 시 값의 초기화를 무시한다.
정적 전역변수는 자신이 선언된 소스 파일에서만 사용할 수 있고, 외부에서는 가져다 쓸 수 없다. 전역변수에 static을 붙이면 변수의 범위를 소스 파일안으로 제한하게 된다.

정적 지역변수 예시1)

#include <stdio.h>

void set_num(){
	static int num;
    printf("%d\n", num);
    num++;
}

int	main(){
	set_num();
	set_num();
    set_num();
    return (0);
}

//결과 : 0
		1 //값이 유자된 채로 증가된다.
        2

예시에서 볼 수 있듯이 정적 변수는 함수를 벗어나더라도 변수가 사라지지 않고 계속 유지되어 값이 증가하는 것을 알 수 있다. 정적 지역변수 num은 프로그램이 시작할 때 0으로 초기화되며, set_num()함수가 호출될 때는 변수를 초기화하지 않고 무시된다.
즉 일정 지역 안에서 전역변수의 역할을 수행한다.

정적 지역변수 예시2)

#include <stdio.h>

void set_num(){
	static int num;
    printf("%d\n", num);
    num++;
}

int	main(){
	set_num();
	printf("%d\n", num); //에러
    return (0);
}

위와 같은 상황에서는 지역변수이기 때문에 에러가 발생한다.

정적 전역변수 예시)

#include <stdio.h>

static int num = 1;

void increase_num(){
    num++;
    printf("%d\n", num);
}

int	main(){
	printf("%d\n", num);
	increase_num();
	increase_num();
    return (0);
}

//결과 : 1
		2 //값이 유자된 채로 증가된다.
        3

정적 전역변수는 자신의 파일에서만 접근 할 수 있으므로 extern을 사용할 수 없고 컴파일 에러가 난다. (extern은 외부 파일에 선언된 변수를 참조하는 외부 변수이다.) 만약 static키워드 없이 단순한 전역변수로 선언했다면 외부 파일에서 extern을 통해 변수를 사용할 수 있다.

출처
https://dojang.io/mod/page/view.php?id=690
https://dojang.io/mod/page/view.php?id=691
https://code4human.tistory.com/128

post-custom-banner

1개의 댓글

comment-user-thumbnail
2021년 6월 18일

보기 좋게 정리해주셔서 감사합니다!

답글 달기