변수의 종류
1. 지역 변수
2. 전역 변수
3. const 변수
4. static 변수
5. extern 변수
지역 변수(Local Variable)
스택 메모리에 저장되는 블럭 스코프 내에 선언된 변수이다
함수가 종료되면 스택 프레임이 반환되면서 더 이상 접근 불가능하다
전역 변수(Global Variable)
데이터 섹션에 저장되는 파일 스코프에 선언된 변수이다
const 변수
const 키워드를 붙이면 해당 변수를 상수화 시켜주는 것이다
초기화가 강제되고 초기화 이후에 값을 변경할 수 없다
매크로 상수는 변수가 아니라서 메모리를 차지하지 않는 반면,
const 변수는 메모리를 차지한다
static 변수
static 변수는 크게 2가지 특징을 가지고 있다
1. 선언이 된 해당 범위에서만 유효하고
해담 범위를 벗어난 곳에서는 직접적으로 접근할 수 없다
2. 초기화가 단 한 번만 되는 특성을 지니고 있다
위와 같은 특징을 지니고 있으면서,
static 키워드를 어떤 변수(전역변수, 지역변수)에 붙이는지에 따라 서로 다른 역할을 하게 된다
- 전역 static (vs. 전역변수)
전역 static은 선언된 해당 파일에서만 직접 접근이 가능하다
초기화가 단 한 번만 된다
따라서, 다른 파일에서의 접근을 제한하고 해당 파일에서만 사용하기 위해 사용된다
- 지역 static (vs. 지역변수)
지역 static은 선언된 지역에서만 직접 접근이 가능하다
초기화가 단 한 번만 된다
생존 기간은 전역변수와 같아진다는 특징을 지니고 있다
주의)
전역 static을 선언된 해당 파일 외에서 직접적으로 접근하거나
지역 static을 선언된 해당 지역 외에서 직접적으로 접근하는 것이 불가능하다
하지만,
포인터로 간접 접근이 가능하며 유효범위를 고려해서 사용해야 한다
특히, 함수 내에 선언된 static 지역변수는
그 해당 함수의 유효범위를 고려해서 간접 접근 하는 것을 유의해야 한다
#include <iostream>
int main() {
int* ptr = nullptr;
{
static int localVar = 20;// 블록 내에서 static 변수 선언
ptr = &localVar;
}
//std::cout << localVar;//localVar은 블록 외부에서 직접 사용할 수 없음
std::cout << (*ptr);// 포인터로 간접 사용 가능
return 0;
}
extern 변수
extern 변수는
1. 다른 파일에 있는 전역 변수를 현재 파일에서 사용할 때 사용한다
참고로, static 전역 변수는 직접 접근 불가능하다
// A.cpp
int globalVar = 10;
static int globalStaticVar = 20;// static은 직접 접근이 불가능하다는 예시를 위한 코드
// B.cpp
extern int globalVar;
extern int globalStaticVar;
int main()
{
int a = globalVar;
// int b = globalStaticVar;// static 변수이기에 직접 접근 불가능
int* ptr = &globalStaticVar;// 간접 접근은 가능
int c = *ptr;
return 0;
}
2. 다른 지역에 있는 static 지역 변수를 현재 지역에서 사용할 때 사용한다
#include <iostream>
void function1()
{
// 함수 내에서 static 변수 선언
static int localVar = 42;
// 포인터를 사용하여 함수 외부에서 변수에 접근
int* ptr = &localVar;
std::cout << "Value through pointer in function1: " << *ptr << std::endl;
}
void function2()
{
// 다른 함수에서 static 변수에 접근
// 지역 static 변수는 함수의 범위를 벗어나도 값을 유지함
extern int localVar;// extern 키워드를 사용하여 선언
// int value = localVar;// 직접 접근 불가능
int* ptr = &localVar;// 간접 접근 가능
std::cout << "Value through pointer in function2: " << *ptr << std::endl;
}
int main()
{
function1();
function2();
return 0;
}
'C > [코드조선] C 핵심' 카테고리의 다른 글
[C] 포인터 (0) | 2024.02.08 |
---|---|
[C] 재귀 함수 (Resurcive Function) (0) | 2024.02.07 |
[C] 스코프와 스택프레임 (0) | 2024.02.06 |
[C] 2차원 배열 (0) | 2024.02.05 |
[C] 반복문 (0) | 2024.02.04 |