변수의 종류
지역변수
int main()
{
int g_iLocal = 100;
return 0;
}
1) 정의
- 스택 영역에 저장되는 변수 (즉, main(), Test(), ... 함수 안에서 선언된 변수)
- 함수 내에서 선언되어 해당 함수에서만 사용할 수 있는 변수
2) 특징
- main() 함수 내에서 `int i = 0;`을 정의했다면 Test() 함수에서 사용이 불가하다. 하지만 Test() 함수에서 `int i = 0;`를 정의해도 오류가 발생하지 않으며 다른 역할로 사용할 수 있다.
- 함수가 반환/종료되면 메모리에서 사라진다.
전역변수
int g_iGlobal = 100;
int main()
{
return 0;
}
1) 정의
- 데이터 영역에 저장되는 변수 (즉, main() 함수 밖에서 선언된 변수)
- 해당 파일 어떤 곳에서든 사용할 수 있는 변수
2) 특징
- 모든 함수에서 사용이 가능하다. 하지만 재정의는 불가하다.
- 함수가 반환되도 메모리에서 사라지지 않는다.
정적변수(static)
int Test()
{
static int i = 0;
int a = 0;
++i;
return i;
}
1) 배경
- A.cpp 파일 내에서 데이터 영역의 메모리 공간을 사용하고 싶어 전역변수를 정의했다고 했을 때 만약 B.cpp 파일이 A.cpp 파일을 참고해야 한다면 두 파일 모두에서 전역변수가 선언되어 중복정의 문제가 발생한다. 이를 해결하기 위해 나온 변수
2) 정의
- 데이터 영역에 저장되는 변수
3) 특징
- static이라는 말처럼 선언된 곳에서만 사용되고 움직이지 않는다. 따라서 정적변수가 선언되는 위치에 따라 변수 이름은 같아도 동작의 차이가 있다.
- main.cpp, func.cpp 파일에서 모두 선언되었다고 해도 중복정의 문제가 발생하지 않는다.
- 데이터영역의 메모리 공간을 사용하기 때문에 선언된 파일/함수에서만 전역변수처럼 사용된다고 할 수 있다.
- 함수가 호출될 때마다 i의 값은 0으로 초기화되지 않고, 이전 값이 유지된다. (메모리 영역) 즉, 함수 안에 정적변수를 선언한다는 것은 함수가 호출될 때마다 `i=0`을 넣겠다는 것이 아니라 Test()에서만 접근 가능한 데이터 영역에 만들어진 정적변수의 초기값을 0을 주겠다는 것이고 이후 부터는 초기화 구문이 실행되지 않는다. 최초 한번만 실행 ! 단, 지역변수 a는 Test() 호출마다 0으로 초기화된다. (스택 영역)
4) 언제 사용하면 좋을까 ?
- 해당 변수의 접근이나 기능을 제한하고 싶을 때
- 데이터 영역을 사용하는 전역변수의 역할을 하고 싶은데 다른 파일과 `#include` 관계가 있을 때 중복정의 문제가 발생하므로 이를 방지하고 싶을 때
- 정적변수를 함수 안에 썼을 때에는 그 함수 안에서만 함수의 호출과 종료에 상관없이 프로그램 실행 내내 유지시킬 수 있는 변수를 만들고 싶을 때
외부변수(extern)
// common.h 파일
extern int g_iExtern;
// func.cpp 파일
#include "common.h"
#include "func.h"
int Add(int a, int b)
{
printf("g_iExtern의 값은 : %d", g_iExtern);
return a + b;
}
// main.cpp 파일
#include "common.h"
#include "func.h"
int main()
{
g_iExtern = 500;
Add(10, 20);
return 0;
}
1) 배경
- 전역변수의 문제 : 하나의 파일에 전역변수를 설정하고, `#include`를 하면 이를 참조하는 모든 파일에 전역변수가 선언되서 중복정의 문제 발생
- 정적변수의 문제 : 중복정의 문제는 발생하지 않지만 기능을 통합하는 하나의 변수를 만드는 것이 아니라 각 파일별로 변수가 따로 쓰임
2) 정의
- 데이터 영역에 저장되는 변수
3) 주의해야 할 점
- extern 변수를 배치할 때 common.h 파일 내에서 `extern int g_iExtern=0;` 처럼 초기화를 먼저 하면 안된다. 초기화를 해버리면 전역변수처럼 중복정의 문제가 발생한다. 따라서 변수를 선언하는 것이 아니라 변수가 있다고만 알려주는 역할을 하는 `extern int g_iExtern;`을 먼저 사용한다.
- 또한 있다고만 알려주고 초기화를 하지 않으면 안된다. main.cpp 파일에서 `g_iExtern = 500;`이라고 변수 값을 변경하고 있고, func.cpp 파일에서는 g_iExtern 값을 프린트하고 있는데 초기화된 변수가 없으면 링크 단계에서 오류가 발생한다. 초기화 위치는 링크 단계에서 파일들이 하나로 취합되기 때문에 어떤 파일에 있어도 상관없다.
4) 언제 사용하면 좋을까 ?
- 데이터 영역을 사용하면서 & 중복정의 문제가 없으면서 & 파일별로 참조하고 싶은 변수가 있을 때
메모리 영역
1) 스택 영역
- 지역변수들이 사용하는 메모리 영역 (함수가 호출될 때 사용하는 영역)
2) 데이터 영역
- 프로그램 시작 시 생성, 프로그램 종료 시 해제
3) 읽기 전용 (코드, ROM)
4) 힙 영역
변수와 메모리 영역의 관계
지역변수(스택영역)와 전역변수(데이터 영역)의 관계
정적변수의 파일별 관계
외부변수의 파일별 관계
'Programming > C++' 카테고리의 다른 글
[C++] Visual Studio 단축키, 디버깅 (0) | 2025.06.03 |
---|---|
[C++] 분할구현 (0) | 2025.06.03 |
[C++] 구조체 (0) | 2025.06.03 |
[C++] 배열 (0) | 2025.06.01 |
[C++] 반복문(for, while) | 함수(w/ 재귀함수) (0) | 2025.06.01 |