Minwoo Dev.
[C++] 일반적인 전역 변수와 static 전역 변수의 차이점 본문
728x90
반응형
SMALL
static 키워드를 공부하다 보면 일반적인 전역 변수와 같은 게 아닌가 ? 싶은 의문점이 들 것이다.
만약 같은 개념이라면, 굳이 "전역 변수" 라는 용어 외에 static 이라는 키워드가 존재하지 않았을 것이다.
일반적인 전역 변수
#include<iostream>
using namespace std;
int n = 0; // 전역 변수 선언
void showN(){
n++;
cout << n << endl;
}
int main(void){
for (int i = 0; i < 5;i++)
showN();
}
위 코드는 전역 변수를 선언하여 사용하는 코드이다.
결과는 위와 같다.
static 전역 변수
#include<iostream>
using namespace std;
static int n = 0;
void showN(){
n++;
cout << n << endl;
}
int main(void){
for (int i = 0; i < 5;i++)
showN();
}
그리고, 위 코드는 static 전역변수를 사용한 코드이다.
결과는 일반적인 전역 변수를 사용한 코드와 동일하다.
그렇다면, 어떤 차이점이 있는 것일까?
그 답은 , 외부 파일에서의 접근에 있다.
외부 파일에서의 일반적인 전역 변수 접근
// file1.cpp
#include<iostream>
using namespace std;
int n = 0;
void showN(){
n++;
cout << n << endl;
}
int main(void){
for (int i = 0; i < 5;i++)
showN();
}
그리고 다른 파일을 생성하고, extern 을 사용하여 file1.cpp의 전역 변수 n에 접근하려고 한다면!
// file2.cpp
extern int n; // file1.cpp에서 선언된 전역 변수 n을 사용
void resetN() {
n = 0; // file1.cpp의 전역 변수 n의 값을 변경
}
오류가 발생하지 않고 전역 변수의 값을 변경할 수 있다.
결론적으로, 일반적인 전역 변수는 외부 파일에서의 접근을 허용한다.
말 그대로 정말 "전역 변수" 인 것이다.
외부 파일에서의 static 전역 변수 접근
// file1.cpp
#include<iostream>
using namespace std;
static int n = 0;
void showN(){
n++;
cout << n << endl;
}
int main(void){
for (int i = 0; i < 5;i++)
showN();
}
이번에도 다른 파일을 생성하고, extern을 사용하여 file1.cpp의 전역변수 n에 접근하려고 한다면,
// file2.cpp
// extern int n; // 컴파일 에러: static 변수는 외부에서 접근 불가
void resetN() {
// n = 0; // 컴파일 에러: file1.cpp의 static 변수 n에 접근할 수 없음
}
접근할 수 없어 에러가 발생한다!
결론적으로, static 변수는 변수를 선언한 파일 내에서만 접근이 가능하다.
정리하자면,
일반적인 전역 변수
- 외부 파일에서 extern 키워드를 사용하여 전역 변수 접근 가능
- 외부 파일들도 접근이 가능한 진정한 "전역"의 의미를 가짐
static 전역 변수
- 외부 파일에서 extern 키워드를 사용하여 전역 변수 접근 불가능
- 해당 static 변수가 선언된 파일 내에서만 접근이 가능
728x90
반응형
LIST
'C++' 카테고리의 다른 글
[C++] 상속 (0) | 2024.06.30 |
---|---|
[C++] static, 클래스 안에서의 static (0) | 2024.06.28 |
[C++] friend (0) | 2024.06.28 |
[C++] 복사 생성자 (Copy Constructor) (0) | 2024.06.27 |
[C++] malloc과 new 의 차이점 (0) | 2024.06.25 |