zyeon's 작심삼일 코딩 공부
지역변수, 전역변수, 정적변수, 외부변수 본문
지역변수
함수 또는 블록 안에서 정의되고, 해당 함수 또는 블록에서만 사용할 수 있다.
#include <stdio.h>
int main(){
int i;
while(i<3){
int temp = 1;
temp++;
i++;
}
printf("temp = %d\n", temp); //해당 범위를 벗어나 오류가 발생한다
return 0;
}
위 코드에서 변수 i는 메인 함수 안에서만 사용가능하고, 변수 temp는 while 루프 안에서만 사용 가능하다.
또, 함수의 매개 변수도 일종의 지역 변수이다.
지역변수는 메모리의 스택 영역을 사용하며, 해당 블록이 시작할 때 메모리 공간이 만들어지며, 끝날 때 초기화 된다. (자동 할당)
하지만 저장 유형 지정자를 붙이면 정적 할당으로 바꿀 수 있다.
전역변수
함수 외부에서 선언되고, 해당 소스 파일에서 사용 가능하다.
메모리의 데이터 영역을 사용한다. 프로그램이 시작할 때 메모리가 생성되며, 프로그램이 종료될 때 메모리가 해제된다.
전역변수를 남발하면 프로그램이 복잡해 질 수 있고, 모듈화 프로그래밍의 취지에 벗어나게 되므로 유의해야한다.
정적변수
변수 앞에 static을 붙여서 만든다. 지역변수, 전역변수 상관없이 정적변수로 만들 수 있다.
#include <stdio.h>
void test(){
static int s = 0;
int i = 0;
printf("s = %d\t", s);
printf("i = %d\t", i);
s++;
i++;
}
int main(){
test(); //s = 0 i = 0
test(); //s = 1 i = 0
test(); //s = 2 i = 0
}
지역변수 i는 함수 호출이 끝나면 데이터가 소멸해 값이 증가하지 않는 반면에, 정적 지역변수 s는 함수 호출이 끝났어도 데이터가 유지되기 때문에 값을 계속 증가시킬 수 있다.
또한 정적변수의 초기화는 한 번만 수행하기 때문에 함수를 계속 호출해도 정적변수의 값이 0으로 초기화 되지 않는다.
정적 전역변수는 선언된 소스파일에서만 사용이 가능하다. 여러 소스파일에서 같은 이름의 전역변수를 사용하지 못하게 되어있는데, 정적 전역변수는 이를 가능하게 해준다. (같은 이름의 전역변수가 각 소스파일에 개별로 존재하게 한다.)
문법적으로 제한을 걸어줌으로써 접근성은 낮아지지만 그만큼 유지보수 측면에서 안정성을 높여준다.
외부변수
변수 앞에 extern을 붙여 만든다. 전역변수를 각 소스파일에 연결시켜주는 용도로 사용한다.
/* testExtern.h */
#pragma once
extern int iExtern;
위 코드는 변수를 선언한게 아니라, 해당 변수를 이후에 사용할거라고 알려주는 용도이다.
외부변수를 헤더파일에 배치하게 되면, 해당 헤더파일을 포함한 소스파일은 이 변수를 공유할 수 있게 된다.
외부변수는 꼭 파일 어딘가에 선언되어 있어야 하며, 만약 선언되어 있지 않으면 링크 오류가 생긴다.
'c++ 정리' 카테고리의 다른 글
포인터와 배열 (0) | 2024.06.20 |
---|---|
포인터 (0) | 2024.06.17 |
비트 연산자, 플래그 (1) | 2024.06.05 |
자료형 (0) | 2024.06.04 |
C++을 공부하는 이유, 객체 지향 프로그래밍 (1) | 2024.06.04 |