Minwoo Dev.

[C++] 일반적인 전역 변수와 static 전역 변수의 차이점 본문

C++

[C++] 일반적인 전역 변수와 static 전역 변수의 차이점

itisminu 2024. 6. 28. 23:55
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