[C] 변수 (지역 변수, 전역 변수, 정적 변수, 외부 변수)
목차
변수의 종류
1. 지역 변수
2. 전역 변수
3. 정적 변수
4. 외부 변수
메모리 영역
1. 스택 영역
2. 데이터 영역
3. 읽기 전용(코드, ROM)
4. 힙 영역
1. 지역 변수
지역 변수는 스택 영역에 선언돼서 함수가 끝나면 사라진다.
#include <stdio.h>
// 전역변수
int i=0; // Data 영역
int main()
{
// 지역변수
return 0;
}
int iName =0;
//괄호 안에 선언된 변수(함수, 지역)
{
int iName = 100;
iName; // 괄호 지역 안에 선언했던 iName
}
iName = 100; // 바깥쪽에 선언했던 iName
// 지역과 지역 안에 또 지역을 만들 수 있다.
// 괄호 안의 iName과 밖의 iName은 다른 변수이다.
2. 전역 변수
함수 바깥의 변수. Data 영역에 있다.
Data 영역 특징
- 프로그램 시작 시 생성
- 프로그램 종료 시 해제
전역 변수이지만 여러 파일이 있을 때 거기서 모든 파일들에서 공유 하는 전역 변수는 단순히 만들 수 없다. 아래를 더 읽어보자.
이전 분할 구현 포스팅에서 흐름이 이어진다. (링크 첨부)
전역 변수를 모든 cpp 파일에서 인식하게 사용하고 싶다.
-> 어떻게?
3. 정적 변수(static)
정적 변수는 static이라는 키워드가 붙는다. 전역 변수처럼 데이터 영역을 쓴다.(프로그램이 끝날 때까지 계속 살아있다.)
static int g_i = 0;
그러면 전역 변수와 정적 변수의 차이는 무엇일까?
- 움직이지 않는다. 틀어박혀서 나오지 않는다.
- 전역 변수 위치에 정적 변수를 쓰면?
-> 파일(cpp) 안에 선언된 변수이다. 각자 선언된 곳에서 틀어박혀있다.
->그래서 처음 전역 변수라서 생긴 문제가 정적 변수로는 문제가 발생하지 않는다. 전역 변수의 naming 문제를 일으키지 않는다.
-> 각각의 파일에 같은 이름 static 변수라도 파일이 달라서 에러가 생기지 않는다. (구별이 가능해짐)
- 한 함수 내에 정적 변수를 쓰면?
-> 정적 변수는 그 함수 내에서 안 움직인다. 그런데 메모리 영역은 데이터 영역에 있다. 그 함수가 종류 될 때 스택 메모리에 있는 게 아니라 함수가 끝나고 사라질 때도 계속 남아있다. 생겼다 사라졌다 하지 않고 계속 유지. 그러나 다른 곳에서는 못씀. 다른 데서 접근해서 못씀.
int Test()
{
static int i=0;
++i;
return i;
}
Q: 어 그러면 static을 Test함수가 돌 때마다 새로 선언해서 값이 커질 수 있는 거 아닌가?
A: static 문법이다. C++ 문법 기준 static 변수 초기화문은 최초에 한번 수행되고 그 뒤로는 건너뛴다.
- 얘도 완벽한 전역 변수를 만들 순 없다.
4. 외부 변수(extern)
extern은 헤더 파일에 넣을 때 초기값을 넣어선 안된다. (extern int g_iExtern= 0;)
extern int g_iExtern; 까지만 쓰면 이런 애가 있다... 까지만 알 수 있다. (값은 모름)
- 초기 화문을 사용하면 안 되고, 있다 까지만 알린다.
- 드디어 우리가 원했던 전역 변수를 만들 수 있다!
다른 cpp 파일에서 값을 넣어 사용하면 된다. (iExtern = 0;)
'공부 > C, C++' 카테고리의 다른 글
[C] 포인터 Pointer (0) | 2022.01.03 |
---|---|
[C] 구조체 (0) | 2022.01.02 |
[C] 분할 구현 (0) | 2022.01.02 |
[C] 배열 (0) | 2022.01.01 |
[C] 재귀 함수(2), 피보나치 수열 (0) | 2022.01.01 |
댓글